计词unigram和bigram的频次

http://blog.csdn.net/niuox/article/details/11395397

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

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

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

我们来简单的做个练习:

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

[python]  view plain  copy
  1. #!/usr/bin/env python  
  2.   
  3. class NGram(object):  
  4.   
  5.     def __init__(self, n):  
  6.         # n is the order of n-gram language model  
  7.         self.n = n  
  8.         self.unigram = {}  
  9.         self.bigram = {}  
  10.   
  11.     # scan a sentence, extract the ngram and update their  
  12.     # frequence.  
  13.     #  
  14.     # @param    sentence    list{str}  
  15.     # @return   none  
  16.     def scan(self, sentence):  
  17.         # file your code here  
  18.         for line in sentence:  
  19.             self.ngram(line.split())  
  20.         #unigram  
  21.         if self.n == 1:  
  22.             try:  
  23.                 fip = open("data.uni","w")  
  24.             except:  
  25.                 print >> sys.stderr ,"failed to open data.uni"  
  26.             for i in self.unigram:  
  27.                 fip.write("%s %d\n" % (i,self.unigram[i]))  
  28.         if self.n == 2:  
  29.             try:  
  30.                 fip = open("data.bi","w")  
  31.             except:  
  32.                 print >> sys.stderr ,"failed to open data.bi"  
  33.             for i in self.bigram:  
  34.                 fip.write("%s %d\n" % (i,self.bigram[i]))  
  35.     # caluclate the ngram of the words  
  36.     #  
  37.     # @param    words       list{str}  
  38.     # @return   none  
  39.     def ngram(self, words):  
  40.         # unigram  
  41.         if self.n == 1:  
  42.             for word in words:  
  43.                 if word not in self.unigram:  
  44.                     self.unigram[word] = 1  
  45.                 else:  
  46.                     self.unigram[word] = self.unigram[word] + 1  
  47.   
  48.         # bigram  
  49.         if self.n == 2:  
  50.             num = 0  
  51.             stri = ''  
  52.             for i in words:  
  53.                 num = num + 1  
  54.                 if num == 2:  
  55.                     stri  = stri + " "  
  56.                 stri = stri + i  
  57.                 if num == 2:  
  58.                     if stri not in self.bigram:  
  59.                         self.bigram[stri] = 1  
  60.                     else:  
  61.                         self.bigram[stri] = self.bigram[stri] + 1  
  62.                     num = 0  
  63.                     stri = ''  
  64.   
  65. if __name__=="__main__":  
  66.     import sys  
  67.     try:  
  68.         fip = open(sys.argv[1],"r")  
  69.     except:  
  70.         print >> sys.stderr, "failed to open input file"  
  71.     sentence = []  
  72.     for line in fip:  
  73.         if len(line.strip())!=0:  
  74.             sentence.append(line.strip())  
  75.     uni = NGram(1)  
  76.     bi = NGram(2)  
  77.     uni.scan(sentence)  
  78.     bi.scan(sentence)  
  79.       
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值