拿到分类好的文章数据后,对数据库进行整理。将所有文章汇聚到一起,格式为:标签\t内容;实际效果:标签\t文章名称\t内容

mysql8中文分词器 数据库分词操作_hadoop

接下来对整理好的文件进行分词,这里采用jieba这个分词工具。下面简单普及下分词的知识和算法。

1、常见的分词方法:1) 字典结构 2)机器学习。而jieba工具将字典和机器学习相结合提高分词的准确率。

01,北京大学-0123,大学-23,大学生-234,学生-34,生活-45,活动-56,中心-78,所以DAG图为{0:[0,1,3],1:[1],2:[2,3,4],3:[3,4],4:[4,5],5:[5,6],6:[6],7:[7,8],8:[8]},PS:看不到的话观察红色数字。

  2)概率语言模型:对于一个字符串C=c1c2c3c4....cn,拆分后的词串S=s1,s2,s3,s4,....,sm,有C产出S的概率为P(S|C)=argmaxP(C|S)*P(S)/P(C)。对于同一个字符串C,可以分词成S1,S2等等,P(C|S)为词串Si还原回C的概率,当然肯定能还原回去,所以P(C|S)=1,P(C)为字符串C的概率,对于不同词串Si,P(C)都是一样的,所以忽略这个概率,所以比较P(S|C),就是比较P(S)。词串的概率P(S)可以简单约等于每个词的概率P(S)=P(w1)*P(w2)*P(w3)*...*P(wm),那么每次单词的概率怎么算?很简单,从词库去算。比如w1,计算出词库中出现的次数A和词库中单词的个数B,P(w1)=A/B。当然由于单词的概率太小,为了防止P(S)过于小向下溢出,公司写成P(S)=logP(w1)+logP(w2)+logP(w3)+...+logP(wm)。当然这只是一元的语言模型,即假设每个词独立,词与词之间不存在依赖关系,而实际情况并不是这样,比如南京长江大桥,南京和长江大桥两个词肯定有关系。所以引入了N元语言模型,P(S)=P(w1)*P(w2/w1)*P(w3/w2,w1)....*P(wn/wn-1,wn-2,...,w1)。如果一个词只依赖于前面一个词叫做二元语言模型,如果依赖前面两个词叫做三元语言模型。将概率语言模型与DAG图结合起来,参考八斗老师的例子-广州本田雅阁汽车,如图根据最大切分概率组合(从后端开始计算,比如从车计算到本,得到概率概率最大的为本田雅阁、汽车)得到结果:广州、本田雅阁、汽车。

mysql8中文分词器 数据库分词操作_字符串_02

Ask-1sk为单个字Sk-1后面接有Sk的概率。反射概率为不同位置BEMS下的单个字出现的概率。举例说明,“南京长江大桥”,转移概率为P(南|京),发射概率为P(南|B)P(南|E)P(南|M)P(南|S),所以联合概率PP(南,B)=P(南|B)*T(s1),同理可以求出不同位置下的联合概率,得到一个矩阵。这边不再对如何计算进行讲解,需要了解的可以自行百度,或者留言咨询。对每个字进行计算,得到不同位置的概率,如图中的网络结果,再应用Viterbi算法寻找最优路径,最终会得到每个字对应的最佳位置信息,比如南京长江大桥,得到BEBMME,就可以根据位置信息进行分词,BE/BMME--南京/长江大桥。

 

mysql8中文分词器 数据库分词操作_hadoop_03

mysql8中文分词器 数据库分词操作_语言模型_04

  4)最后简单说下Viterbi算法,这个算法很有意思,通过局部最优来找到整体最优,减少了计算的时间复杂度。比如从START到END,计算经过哪些字母路径最短?1)从START到A,由于START只有一个,没办法知道哪个最优,继续。2)计算从A到B,分别计算从A1A2A3A4到B1的路径,再分别计算A1A2A3A4到B2的路径,以此类推,得到每个B的最优路径,继续。3)同理得到从B到C的最优路径,从C到D的最优路径。4)再根据从D到END的路径值,推出D中哪条路径最优,比如D1,解析往前推,得到C1-B1-A3-START,通过这个方向推导过程,就可以得到最优路径为START-A3-B1-C1-D1-END。其实,在jieba分词中,原理跟这个差不多,但是比上面的算法要复杂,比如HMM加入了词性,即动词名词形容词等等,形成了一个矩阵,通过矩阵来计算。

mysql8中文分词器 数据库分词操作_语言模型_05

--->

mysql8中文分词器 数据库分词操作_hadoop_06

--->

mysql8中文分词器 数据库分词操作_hadoop_07

--->

mysql8中文分词器 数据库分词操作_字符串_08

2、上面讲了好多理论和算法,现在回归项目本身,其实算法只是了解即可,实际应用并不需要自己编写,只需要调用jieba库就行了。下面代码就是对之前整理的文章,进行去除标点符号,然后继续分词。文章整理后大概2.03G,在pycharm上运行时间太久。后改为在MapReduce上跑集群。


import jiebaimport jieba.possegimport jieba.analyse


mysql8中文分词器 数据库分词操作_字符串_09

集群上跑首先需要将整理好的文章上传到HDFS上,命令为 hadoop fs -put /user/web/data/ ./file.txt

mysql8中文分词器 数据库分词操作_hadoop_10

再编写一个map代码即可,下面为map.py

mysql8中文分词器 数据库分词操作_语言模型_11

然后再加一个run.sh。

mysql8中文分词器 数据库分词操作_hadoop_12

bash run.sh后,MapReduce启动,我模拟了两个从节点,过程如下:

mysql8中文分词器 数据库分词操作_语言模型_13

分词结果:

mysql8中文分词器 数据库分词操作_最优路径_14