为了账号安全,请及时绑定邮箱和手机立即绑定

N元分词算法

标签:
算法

自然语言处理中,我们经常需要用到n元语法模型。

其中,有关中文分词的一些概念是我们需要掌握的,譬如:

unigram 一元分词,把句子分成一个一个的汉字
bigram 二元分词,把句子从头到尾每两个字组成一个词语
trigram 三元分词,把句子从头到尾每三个字组成一个词语.

我们来简单的做个练习:

输入的是断好词的文本,每个句子一行。
统计词unigram和bigram的频次,并将它们分别输出到`data.uni`和`data.bi`两个文件中。


下面代码为网络资源

#!/usr/bin/env pythonclass NGram(object):def __init__(self, n):# n is the order of n-gram language modelself.n = nself.unigram = {}self.bigram = {}# scan a sentence, extract the ngram and update their# frequence.## @param    sentence    list{str}# @return   nonedef scan(self, sentence):# file your code herefor line in sentence:self.ngram(line.split())#unigramif self.n == 1:try:fip = open("data.uni","w")except:print >> sys.stderr ,"failed to open data.uni"for i in self.unigram:fip.write("%s %d\n" % (i,self.unigram[i]))if self.n == 2:try:fip = open("data.bi","w")except:print >> sys.stderr ,"failed to open data.bi"for i in self.bigram:fip.write("%s %d\n" % (i,self.bigram[i]))# caluclate the ngram of the words## @param    words       list{str}# @return   nonedef ngram(self, words):# unigramif self.n == 1:for word in words:if word not in self.unigram:self.unigram[word] = 1else:self.unigram[word] = self.unigram[word] + 1# bigramif self.n == 2:num = 0stri = ''for i in words:num = num + 1if num == 2:stri  = stri + " "stri = stri + iif num == 2:if stri not in self.bigram:self.bigram[stri] = 1else:self.bigram[stri] = self.bigram[stri] + 1num = 0stri = ''if __name__=="__main__":import systry:fip = open(sys.argv[1],"r")except:print >> sys.stderr, "failed to open input file"sentence = []for line in fip:if len(line.strip())!=0:sentence.append(line.strip())uni = NGram(1)bi = NGram(2)uni.scan(sentence)bi.scan(sentence)


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消