自然语言处理
1.基本概念
1.1分词分词算法设计中的几个基本原则(转自http://blog.sina.com.cn/s/blog_53daccf401011t74.html)
1、颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大,即单词的字数越多,所能表示的含义越确切,如:“*局长”可以分为“* 局长”、“*局 长”、“*局长”都算对,但是要用于语义分析,则“*局长”的分词结果最好(当然前提是所使用的词典中有这个词)
2、切分结果中非词典词越少越好,单字字典词数越少越好,这里的“非词典词”就是不包含在词典中的单字,而“单字字典词”指的是可以独立运用的单字,如“的”、“了”、“和”、“你”、“我”、“他”。例如:“技术和服务”,可以分为“技术 和服 务”以及“技术 和 服务”,但“务”字无法独立成词(即词典中没有),但“和”字可以单独成词(词典中要包含),因此“技术 和服 务”有1个非词典词,而“技术 和 服务”有0个非词典词,因此选用后者。
3、总体词数越少越好,在相同字数的情况下,总词数越少,说明语义单元越少,那么相对的单个语义单元的权重会越大,因此准确性会越高。
1.2最大匹配法算法(Maximum Matching,MM算法)
最大匹配含义:最大匹配是指以词典为依据,取词典中最长的单词为第一个取字数量的扫描串,在词典中进行扫描(为提升扫描效率,还可以根据字数多少设计字典,然后根据字数分别从不同的字典进行扫描)。一直还剩下一个单字则终止,如果该单字串无法切分,则作为未登录处理。
例如:词典中最长词为“*”共7个汉字,则最大匹配起始字数为7个汉字。然后逐字递减,在对应的词典中进行查找。
最大匹配算法主要包括正向最大匹配算法、逆向最大匹配算法、双向匹配算法等。
下面以“我们在野生动物园玩”详细说明一下这几种匹配方法:
1.3正向最大匹配法:
正向即从前往后取词,从7->1,每次减一个字,直到词典命中或剩下1个单字。
第1次:“我们在野生动物”,扫描7字词典,无
第2次:“我们在野生动”,扫描6字词典,无
。。。。
第6次:“我们”,扫描2字词典,有
扫描中止,输出第1个词为“我们”,去除第1个词后开始第2轮扫描,即:
第2轮扫描:
第1次:“在野生动物园玩”,扫描7字词典,无
第2次:“在野生动物园”,扫描6字词典,无
。。。。
第6次:“在野”,扫描2字词典,有
扫描中止,输出第2个词为“在野”,去除第2个词后开始第3轮扫描,即:
第3轮扫描:
第1次:“生动物园玩”,扫描5字词典,无
第2次:“生动物园”,扫描4字词典,无
第3次:“生动物”,扫描3字词典,无
第4次:“生动”,扫描2字词典,有
扫描中止,输出第3个词为“生动”,第4轮扫描,即:
第4轮扫描:
第1次:“物园玩”,扫描3字词典,无
第2次:“物园”,扫描2字词典,无
第3次:“物”,扫描1字词典,无
扫描中止,输出第4个词为“物”,非字典词数加1,开始第5轮扫描,即:
第5轮扫描:
第1次:“园玩”,扫描2字词典,无
第2次:“园”,扫描1字词典,有
扫描中止,输出第5个词为“园”,单字字典词数加1,开始第6轮扫描,即:
第6轮扫描:
第1次:“玩”,扫描1字字典词,有
扫描中止,输出第6个词为“玩”,单字字典词数加1,整体扫描结束。
正向最大匹配法,最终切分结果为:“我们/在野/生动/物/园/玩”,其中,单字字典词为2,非词典词为1。
1.4逆向最大匹配法:
逆向即从后往前取词,其他逻辑和正向相同。即:
第1轮扫描:“在野生动物园玩”
第1次:“在野生动物园玩”,扫描7字词典,无
第2次:“野生动物园玩”,扫描6字词典,无
。。。。
第7次:“玩”,扫描1字词典,有
扫描中止,输出“玩”,单字字典词加1,开始第2轮扫描
第2轮扫描:“们在野生动物园”
第1次:“们在野生动物园”,扫描7字词典,无
第2次:“在野生动物园”,扫描6字词典,无
第3次:“野生动物园”,扫描5字词典,有
扫描中止,输出“野生动物园”,开始第3轮扫描
第3轮扫描:“我们在”
第1次:“我们在”,扫描3字词典,无
第2次:“们在”,扫描2字词典,无
第3次:“在”,扫描1字词典,有
扫描中止,输出“在”,单字字典词加1,开始第4轮扫描
第4轮扫描:“我们”
第1次:“我们”,扫描2字词典,有
扫描中止,输出“我们”,整体扫描结束。
逆向最大匹配法,最终切分结果为:“我们/在/野生动物园/玩”,其中,单字字典词为2,非词典词为0。
1.5双向最大匹配法:
正向最大匹配法和逆向最大匹配法,都有其局限性,我举得例子是正向最大匹配法局限性的例子,逆向也同样存在(如:长春药店,逆向切分为“长/春药店”),因此有人又提出了双向最大匹配法,双向最大匹配法。即,两种算法都切一遍,然后根据大颗粒度词越多越好,非词典词和单字词越少越好的原则,选取其中一种分词结果输出。
如:“我们在野生动物园玩”
正向最大匹配法,最终切分结果为:“我们/在野/生动/物/园/玩”,其中,两字词3个,单字字典词为2,非词典词为1。
逆向最大匹配法,最终切分结果为:“我们/在/野生动物园/玩”,其中,五字词1个,两字词1个,单字字典词为2,非词典词为0。
非字典词:正向(1)>逆向(0)(越少越好)
单字字典词:正向(2)=逆向(2)(越少越好)
总词数:正向(6)>逆向(4)(越少越好)
因此最终输出为逆向结果。
1.6关于中文分词转
1.7N元模型(N-Gram Model)
N元模型是自然语言处理中统计语言模型中的一个重要概念。统计语言模型产生的初衷是为了结局语音识别问题。在语言识别中,计算机需要知道一个文字序列是否能构成一个大家理解而且有意义的句子。一个句子是否合理,看它的可能性大小如何,这里的可能性用概率来衡量。假设S表示某一个有意义的句子,它右一连串特定顺序排列的词组成,n为句子长度。我们想知道S出现的可能性,即概率P(S)。需要用一个模型来估算。,则P(S)=P()。根据条件概率公式,S这个系类出现的概率等于每一个词出现的条件概率乘积,于是P(S)可以展开为:
-P(s)=P()=P(w1)*P(w2|w1)P(w3|w1,w2)…*P(wn|w1,w2,…,wn) (1)-
其中P(w1)表示第一个词w1出现的概率;P(w2|w1)是在已知w1出现的情况下第二次出现的概率;以此类推。此时存在一个问题P(wn|w1,w2,…,wn)的可能性太多,根本无法计算。此时一个聪明的俄国人叫马尔科夫的出来拯救世界了,他提出一种简化但很有效的方法,就是 假设任意一个词出现的概率只跟他前面一个的词有关系,与其他词无关。这就是著名的马尔科夫假设。在这个假设的前提下:
-P(s)=P(w1)*P(w2|w1)P(w3|w2)…*P(wn|wn-1) (2)-
上面的公式(2)对应的就是统计语言模型中的二元模型(Bigram Model)
假设文本中的每个词由前面的N-1个词有关,与更前面的词无关,这种假设被称为N-1阶马尔科夫假设,对应的语言模型称为N元模型。N=2就是二元模型,N=1的一元模型实际上就是一个上下文无关的模型,即假定当前词出现的概率与前面的词无关。应用最多的是N=3的三元模型(Trigram Model)
N元模型的时间复杂度和空间复杂度几乎是N的指数函数,因此N的取值都很小。
from collections import Counter
#读取文件
test_file= 'C:/Users/Administrator/Desktop/cnews/cnews.train.txt'
f=open(test_file,'r',encoding='UTF-8')#设置文件对象
text=f.read()#将txt文件的所有内容读入到字符串str中
f.close()#关闭文件
c=Counter(text)
print(c)
Counter({',': 1871208, '的': 1414310, '。': 822140, '一': 443181, '是': 413729, '在': 374374, '0': 365929, '有': 313177, '不': 293560, '了': 284707, '中': 280722, '1': 278620, '人': 268469, '大': 265169, '、': 258508, '国': 255971, ' ': 240693, '2': 227406, '这': 225555, '上': 212719, '为': 210855, '个': 209103, '“': 208968, '”': 208536, '年': 200914, '学': 191116, '时': 188765, '我': 177694, '地': 174183, '和': 172847, '以': 171813, '到': 169978, '出': 160585, '来': 158621, '会': 158137, '行': 153778, '发': 150849, ':': 148977, '对': 148281, '家': 145454, '们': 145419, '要': 143787, '生': 141282, '他': 140001, '能': 136632, '也': 132783, '业': 131617, '金': 130346, '3': 129824, '成': 129290, '可': 128995, '分': 127363, '多': 125977, '现': 121698, '5': 119681, '就': 118488, '场': 118405, '新': 117897, '后': 117670, '于': 117320, '经': 116789, '下': 114817, '日': 112352, '市': 108520, '前': 108243, '过': 108241, '方': 107553, '得': 106680, '作': 105904, '房': 105489, '月': 103439, '最': 102610, '开': 102035, '》': 100254, '《': 100240, '高': 99425, '9': 98453, '8': 96835, '.': 96631, '而': 96559, '比': 95627, '公': 95219, '产': 94871, '4': 94845, '说': 92610, ')': 92520, '将': 92503, '(': 92399, '都': 91856, '资': 91817, 'e': 90698, '6': 90563, '基': 90360, '用': 90131, '面': 89971, '还': 89680, '自': 89035, '者': 88814, '本': 88389, '之': 87400, '美': 84336, '\xa0': 83454, '很': 82982, '同': 82439, '7': 82183, '部': 82155, '进': 81819, '但': 80210, '主': 79793, '外': 79486, '动': 79355, '机': 77635, '元': 77133, '理': 76715, '加': 76679, 'a': 76617, '全': 76187,
结巴分词一直装不上,晕。。
上一篇: 自然语言处理-nltk学习(一)
下一篇: 自然语言处理-深度学习