ngram模型中文语料实验stepbystep.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ngram模型中文语料实验stepbystep.docx

 HYPERLINK /rocketfan/archive/2011/01/02/1924065.html ngram模型中文语料实验step by step(1)-分词与统计  HYPERLINK /rocketfan/archive/2011/01/02/1924065.html /rocketfan/archive/2011/01/02/1924065.html ngram模型是统计语言的最基本的模型了,这里将给出用中文语料做实验建立ngram模型的个人总结,主要参考sun拼音2.0的代码以及 HYPERLINK /steveric0214/blog/item/249af6014e831a18728b6510.html 有点意思拼音输入法,会参考srilm HYPERLINK /u1/58264/showart_1679709.html 。我会尽量逐步完成所有的实验总结。 分词与统计 对于中文语料和英文不同需要我们先进行分词,当然如果是切分好空格隔开的语料就简单许多。假设是普通的语料,sun拼音的做法是采用正向最大匹配分词,并且去掉可能有歧义的部分,当然这些都是首先依赖于词典。 利用词典文本建立一个存储字典中词的索引结构。可以选择hash map,map,trie树等结构,这里选择double array trie作为索引结构。我这里采用的是GBK的编码方式对于每一个字给予一个trie树种的编码,同时对于每一个词典中的词给予一个唯一的int型的编号,我们在后续统计三元组以及建立ngram模型的时候采用都是词的编号而不是词本身,这主要是为了节省空间,方便数据结构写硬盘以及排序,当然用string其实也是可以的。我们的词典中会保证有所有的GBK单字作为词。 基于1步骤词典的最大匹配分词,这里为了简单只考虑中文,而英文,标点等等都作为分割符号。为了简单没有采用句子开始符号和结尾符号而是采用统一的分割符号。10表示分隔符号,用9表示歧义。与sun拼音不同的是这里采用直接逐句分词添加到统计模块的做法而不是对于整个文本分词写文件再读文件再统计三元组的做法。这样可以方便处理比如直接从数据库中的用户查询作为语料。统计的时候可以采用map/hash_map+sort的方法(其实就是单机版的map_reduce),保证最后三元组是排好序的从而方便ngram模型的建立。如果语料较大可以考虑利用hadoop统计。 关于歧义部分的识别处理,参考 “有点意思拼音输入法” 在 HYPERLINK /source/xref/nv-g11n/inputmethod/sunpinyin/slm/src/slm/mmseg/mmseg.cpp processSingleFile()中,逐句读取语料库,例如,为人民办实事的精神,然后进行调用 HYPERLINK /source/xref/nv-g11n/inputmethod/sunpinyin/slm/src/slm/sim_dict.cpp \l 51 SIMDict::matchLongest()进行最长匹配。 因为辞典中有“为人民”这个词条,因此分割到的第一个词是“为人民”,其长度为3,然后调用 HYPERLINK /source/xref/nv-g11n/inputmethod/sunpinyin/slm/src/slm/mmseg/mmseg.cpp \l 173 getAmbiLen(),来分析是否有交集歧义,并返回最大交集歧义的长度。下面是每次迭代的情况: 人民, 办实事的精神 - i=1, len=2, word_len=3, 对“人民办实事”进行最长匹配,分割到的词为“人民”,其长度为2, 民办, 实事的精神 - i=2, len=2, word_len=4, 对“民办实事”进行最长匹配,分割到的词为“民办”,其长度为2,因为i与len的合超过了最初传入的word_len,则设置word_len为4,继续迭代。可以看出,此时歧义已经检测到了。 办实事, 的精神 - i=3, len=3, word_len=6 实事, 的精神 - i=4, len=2, word_len=6 事, 的精神 - i=5, len=1, word_len=6, 最后歧义的长度为6 退出循环,返回得到的长度,即6 如果指定了ambiguous-id,则会将这6个字符作为一个AMBI-ID(由参数-a指定),输出到分词的结果中。然后跳过这6个字符,继续进行分词。当句子结束时,如果使用二进制格式输出,则会 HYPERLINK /source/xref/nv-g11n/inputmethod/sunpinyin/slm/src/slm/mmseg/mmseg.cpp \l 23

文档评论(0)

zhanghc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档