N元分词算法

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

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

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

我们来简单的做个练习:

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

下面代码为网络资源

#!/usr/bin/env python

class NGram(object):

    def __init__(self, n):
        # n is the order of n-gram language model
        self.n = n
        self.unigram = {}
        self.bigram = {}

    # scan a sentence, extract the ngram and update their
    # frequence.
    #
    # @param    sentence    list{str}
    # @return   none
    def scan(self, sentence):
        # file your code here
        for line in sentence:
            self.ngram(line.split())
        #unigram
        if 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   none
    def ngram(self, words):
        # unigram
        if self.n == 1:
            for word in words:
                if word not in self.unigram:
                    self.unigram[word] = 1
                else:
                    self.unigram[word] = self.unigram[word] + 1

        # bigram
        if self.n == 2:
            num = 0
            stri = ''
            for i in words:
                num = num + 1
                if num == 2:
                    stri  = stri + " "
                stri = stri + i
                if num == 2:
                    if stri not in self.bigram:
                        self.bigram[stri] = 1
                    else:
                        self.bigram[stri] = self.bigram[stri] + 1
                    num = 0
                    stri = ''

if __name__=="__main__":
    import sys
    try:
        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)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能快报

剑桥科学家用两百万段视频教会人工智能预测未来

人工智能系统可以预测场景如何展开,也可以设想不久的将来。 对于静止画面,深度学习算法生成的微视频可以预测接下来可能发生的场景。例如,如果展示的是一幅火车站的场景...

38870
来自专栏决胜机器学习

机器学习(三) ——k-近邻算法基础

机器学习(三)——k-近邻算法基础 (原创内容,转载请注明来源,谢谢) 一、概述 k近邻算法(kNN),是监督学习的一种,主要用于分类,通过...

387110
来自专栏决胜机器学习

机器学习(二) ——线性回归、代价函数与梯度下降基础

机器学习(二) ——线性回归、代价函数与梯度下降基础 (原创内容,转载请注明来源,谢谢) 一、线性回归 线性回归是监督学习中的重要算法,其主要目的在于用一个...

50260
来自专栏决胜机器学习

机器学习(四) ——梯度下降算法解释以及求解θ

机器学习(四)——梯度下降算法解释以及求解θ (原创内容,转载请注明来源,谢谢) (本文接 机器学习(二) 的内容) 一、解释梯度算法 ? ? 梯度算法公式...

44060
来自专栏决胜机器学习

机器学习(二十) ——PCA实现样本特征降维

机器学习(二十)——PCA实现样本特征降维 (原创内容,转载请注明来源,谢谢) 一、概述 所谓降维(dimensionalityreduction),即降低...

54560
来自专栏AI科技评论

深度 | Pedro Domingos解析机器学习五大流派中的算法精髓

Pedro Domingos是华盛顿大学计算机科学与工程学教授,也是国际机器学习协会的联合创始人之一。他曾在IST Lisbon获得电子工程和计算科学的硕士学位...

42450
来自专栏人工智能快报

超三成软件开发人员担心被人工智能替代

《计算机世界》网站2016年3月报道,根据Evans Data公司的一项调查,一些软件开发人员担心人工智能系统会取代他们的工作。 Evans Data公司在一项...

37950
来自专栏决胜机器学习

机器学习(十九) ——K-均值算法理论

机器学习(十九)——K-均值算法理论 (原创内容,转载请注明来源,谢谢) 一、概述 K均值(K-Means)算法,是一种无监督学习(Unsu...

32730
来自专栏AI科技评论

CCAI | 清华大学副教授张敏:现在是“人工智能青年”们最好的时代

编者按:在刚刚结束的中国人工智能大会CCAI2016上,来自清华大学计算机科学与技术系的副教授张敏为我们展示了人工智能领域当前面对的机遇。张敏既是一名人工智能的...

34740
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(三十五) ——Redis 二进制位数组及SWAR汉明重量算法

《Redis设计与实现》读书笔记(三十五) ——Redis 二进制位数组及SWAR汉明重量算法 (原创内容,转载请注明来源,谢谢) 一、基本概念 redis提供...

42940

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励