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

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

结对伙伴:石亚鑫 20162303

需求分析

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

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

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

    static final int NPREF = 2; //前缀个数

        static final String NOWORD = "\n"; //英语单词不再重复

        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("\n");
                }
                else
                    fw.write(word+" ");


                prefix.pref.remove(0);
                prefix.pref.add(word);
            }
            fw.close();
    

运行过程截图

1064025-20170625151113648-2108298083.png

代码托管地址

遇到的困难及解决方法

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

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

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

对结对的小伙伴做出评价

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

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

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

PSP

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划3030
· Estimate· 估计这个任务需要多少时间610920
Development开发5040
· Analysis· 需求分析 (包括学习新技术)3020
· Design Spec· 生成设计文档3050
· Design Review· 设计复审 (和同事审核设计文档)60100
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)1010
· Design· 具体设计10090
· Coding· 具体编码100300
· Code Review· 代码复审3060
· Test· 测试(自我测试,修改代码,提交修改)3090
Reporting报告6060
· Test Report· 测试报告3030
· Size Measurement· 计算工作量2020
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划3020
合计610920

转载于:https://www.cnblogs.com/Tiffany23/p/7076878.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值