• 20161207 结对编程-马尔可夫链-自动生成短文


    20161207 结对编程-马尔可夫链-自动生成短文

    结对伙伴:石亚鑫 20162303

    需求分析

    1.通过“学习”一篇文章后,随机输出新的文章。
    参考资源:《瓦尔登湖》
    2.仅考虑英文输入输出
    3.从文件读入待”学习“文章
    4.能处理标点符号(参考材料中有说明)
    5.能控制输出文章的篇幅
    6.通过参数指定输出的单词数
    7.误差控制

    • 生成的语句要能完整结束(比如遇到句号、问号、感叹号等结束标志)。
    • 为了能实现上述条件,允许输出的单词数量误差 ±50。
    • 避免环

    实现过程中的关键代码解释

        static final int NPREF = 2; //前缀个数
    
            static final String NOWORD = "
    "; //英语单词不再重复
    
            Map<Prefix,List<String>> stateTable = new HashMap<Prefix,List<String>>();
    
            Prefix prefix = new Prefix (NPREF,NOWORD);//刚开始的前缀
    
            Random random = new Random();
    
    
            public void build(InputStream in) throws Exception {
                Scanner scanner = new Scanner(in);
    
                while(scanner.hasNext()){
                    add(scanner.next());
                }
                add(NOWORD);
            }
    
            private void add(String word) {
                List<String> suf = stateTable.get(prefix);
                if(suf == null){
                    suf = new ArrayList<String>();
                    stateTable.put(new Prefix(prefix),suf);
               }
                suf.add(word);
                prefix.pref.remove(0);
                prefix.pref.add(word);
            }
    
    
            public void generate(int nwords) throws IOException {
                FileWriter fw = new FileWriter("/Users/zhangyunqi/Desktop/qq.txt");//生成的文章储存在qq.txt中
                prefix = new Prefix(NPREF,NOWORD);
                for(int i=0; i<nwords; i++){
                    List<String> suf = stateTable.get(prefix);
                    int r = Math.abs(random.nextInt() % suf.size());
                    String word = suf.get(r);
                    if(word.equals(NOWORD)){
                        break;
                    }
                    System.out.print(word+" ");
                    if (word.equals(".")){
                        fw.write("
    ");
                    }
                    else
                        fw.write(word+" ");
    
    
                    prefix.pref.remove(0);
                    prefix.pref.add(word);
                }
                fw.close();
    

    运行过程截图

    代码托管地址

    遇到的困难及解决方法

    刚刚开始并没有头绪,于是上网百度,发现怎么生成前后缀关系的代码。
    把输入想像成由一些互相重叠的短语构成的序列,该算法把每个短语分成两部分:一部分由多个词构成的前缀,另一部分是只包含一个词的后缀。马尔可夫链算法能够生成输出短语的序列,其方法是依据(在我们的情况下)原文本的统计性质,随机性地选择跟在前缀后面的特定后缀。采用三个词的短语就能够工作得很好——利用连续两个词构成的前缀来选择作为后缀的一个词:
    设置w1和w2为文本的前两个词
    输出w1和w2
    循环:

    • 随机地选出w3,它是文本中w1w2的后缀中的一个
    • 打印w3
    • 把w1和w2分别换成w2和w3
    • 重复循环

    选择二词前缀,则每个输出词w3都是根据它前面的一对词(w1,w2)得到的。前缀中词的个数对设计本身并没有影响,程序应该能对付任意的前缀长度。我们把一个前缀和它所有可能后缀的集合放在一起,称其为一个状态。

    对结对的小伙伴做出评价

    我的结对伙伴是我的室友,所以本次编程是我们坐在一起完成的。

    如有参考或引用的设计、实现,请进行说明

    参考:http://www.cnblogs.com/vertextao/p/6881960.html

    PSP

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 30 30
    · Estimate · 估计这个任务需要多少时间 610 920
    Development 开发 50 40
    · Analysis · 需求分析 (包括学习新技术) 30 20
    · Design Spec · 生成设计文档 30 50
    · Design Review · 设计复审 (和同事审核设计文档) 60 100
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 10
    · Design · 具体设计 100 90
    · Coding · 具体编码 100 300
    · Code Review · 代码复审 30 60
    · Test · 测试(自我测试,修改代码,提交修改) 30 90
    Reporting 报告 60 60
    · Test Report · 测试报告 30 30
    · Size Measurement · 计算工作量 20 20
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 20
    合计 610 920
  • 相关阅读:
    使用Jenkins 生成 Allure 报告时出现Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 错误
    【Chrome】插件开发
    云笔记软件简评
    使用Jekyll + Github Pages搭建静态网站
    Windows和Linux的不同换行符导致脚本执行异常
    使用 Hugo + Github Pages 创建静态网站博客
    Vercel关闭评论 禁止Preview Deployments
    Github SubModule 指南
    epoll高效的原理
    xlrd读取Excel文件报错,for elem in self.tree.iter() if Element_has_iter else self.tree.getiterator(,raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format] '; not supported')
  • 原文地址:https://www.cnblogs.com/Tiffany23/p/7076878.html
Copyright © 2020-2023  润新知