美文网首页
中文分词

中文分词

作者: Mr_coach | 来源:发表于2020-07-08 15:20 被阅读0次

一、NLP文本相似度

内容:

1.NLP(自然语言处理入门)

TF-IDF、 关键词提取、LCS最长公共子序列

2.中文分词

jiaba、HMM

3.实践

MR TF-IDF

MR 根据LCS计算文本相似度

MR 结巴分词

共同好友:

A:B,C,D,F,E,O   A的好友有——》B,C,D,F,E,O

B:A,C,E,K   B的好友有——》A,C,E,K 

C:F,A,D,I  C的好友有——》:F,A,D,I

D:C   D的好友有——》C

返回结果:

A,B的共同好友有:C和E

A,C用户的共同好友有:D和F

...

两轮MR

1. map输入

     map输出  C \t A ; 一个好友及拥有这个好友对应的人

     C \t B

     C \t D

     reduce输入

     reduce输出 C \t A, B, D;  一个好友及拥有这个好友的所有人

2. map 输入

     map 输出 A_B \t C ;A_B的共同好友里有的一个是C

                      A_D \t C

     reduce 输入

    reduce 输出 A_B \t C,E  A_B的共同好友里面所有的共同好友

问题1:只有1轮MR,其中代码map里面用了一个字典,在不同map里面字典是不能共享的。

           本地执行是可以的,分布式的结果不对。

           本地测试:根据map分而治之的思想

           head -7 file |python map.py >f1

           tail -7 file |python map.py >f2

           cat f1 f2>f12

           cat f12 |sort |python red.py >res

           wc -l res

问题2:A_B \t C 本地

              B_A \t C 集群

排序导致的,没有问题,  C \t A, B, D

1、文本相似度

1)字面相似,但是语义不相似

      我吃饱饭了

      我吃不饱饭

方案:(1)中文分词,看多少词是相同的 (2)分词之后LCS最长公共子序列

2)语义相似,但是字面不相似

       老铁的个人简历

       铁匠人物介绍

方案:基于人的行为(1)基于共同的行为(CF)(2)word embedding ,映射到向量空间

相似度的度量

1)余弦相似度 cos

   A (1,2,3)

   B (2,3,4)

   cos(A,B)

   分子:A*B = 1*2+2*3+3*4=20

   分母:|A| *|B| = sqrt(1*1 + 2*2 +3*3) * sqrt(2*2 + 3*3 +4*4) = 3.74*5.38

   cos(A,B) = 20 / 3.74*5.38

   优化的思路:把词频换成词在文章中的重要性

   词在文章中的重要性:

   1.词频,去掉停用词,在本篇文章出现次数多 :tf

    2.词在其他文章出现的少 :idf

聚类算法

1、密度——在指定半径内出现的邻居数量

2、与其他比自己密度值大的点的距离的最小值(例如:两个类:A、B,A的聚类的第二大的值比B的聚类的第一大的值还要大,但是A的这个值离B远,所以选B的聚类的第一大的值为聚类中心。)

聚类中心两个值(上边1和2两点)都要大。

1)TF:词频

2)IDF:反文档频率

取值范围(0,log(语料库中文档总数))

自动摘要

1)确定一批关键词(TF-IDF)

2)包含关键词的句子找出来

3)对句子做些处理,排序(关键词越多,权重大)

4)把句子汇总,就是摘要

LCS 最大公共子序列(业务紧密相连)

A:我很喜欢看电影,最喜欢看《我不是药神》

B:我很喜欢看电影,最喜欢看《我不是潘金莲》

LCS(A,B)我很喜欢看电影,最喜欢看《我不是》

文本相似度 = 2*LCS(A,B) / [ len(A) + len(B)]

目的:从字面衡量文本相似度的方法之一,动态规划的思路与中文分词里面有一个viterbi算法也用到DP。

推荐:LCS(A,B)>0.9 AB非常相似,过滤掉(近似等价于已经看过的),多样化。

            TF-IDF 以及LCS 都是已经做了中文分词的基础上。

中文分词:

结婚的和尚未结婚的

结婚的 \ 和 \ 尚未 \ 结婚的

结婚的 \ 和尚 \ 未 \ 结婚的

广州本田雅阁汽车

广州 \ 本田 \ 雅阁 \ 汽车

广州本田 \ 雅阁 \ 汽车

广州 \ 本田雅阁 \ 汽车

分词的粒度:

粗粒度: 比如:成语;推荐场景:拿字去索引库召回效果不好。

细粒度:搜索场景,搜索引擎不会把所有小粒度的词都建索引,而是选择更有可能展现相关结果的小粒度词——所以前几页效果好,后边效果不好,因为召回变多。

例:车 —— 》 汽车坐垫,自行车,越野车

DAG图有向无环图:切开哪一个位置好?

C = 本田雅阁

S1 = 本田  \ 雅阁

S2 = 本 \ 田 \ 雅阁

P(S1 | C) P(S2 | C) 比较大小

朴素贝叶斯公式:(分类:邮件:S是:类别是否是垃圾 ,C是:样本) 独立性假设,每个词的出现都跟其他词没有关系。

P(S | C) = P(S,C) / P(C)  = P(C | S)* P(S)/ P(C)

P(S,C) =P(C | S)* P(S)

P(C | S)=P(本田雅阁 | 本田  \ 雅阁) =1

P(S)

P(C) = P(本田雅阁) =常数(比较两个概率的大小,共同除以P(C),所以省去)

P(S1 | C)= P(S1)=P(本田 \ 雅阁) = P(本田) * P(雅阁)=logP(本田 \ 雅阁) =log( P(本田) * P(雅阁)) = log(P(本田)) +log(P(雅阁))

P(S2 | C)= P(S2)=P(本 \ 田 \ 雅阁)= P(本) * P(田) * P(雅阁)

P(本田) = 分子/分母

分子:本田在语料库中出现的次数

分母:语料库总词数,可能会很大

P会特别小,P连乘(尤其在句子长时)会计算结果非常小 = 0

所以我们对P,取log再比较

为什么能取log:log是增函数,可以保证大小顺序一致,实际当中不关系概率值是多少,只是比较大小。

log(a*b) = log(a) + log(b)

取log的好处

1.防止数据向下溢出

2.加法运算速度快于乘法

独立性假设有些不合理 ——》概率语言模型(本田后面跟雅阁的概率 > 本田后面跟奔驰的概率)

语言模型:

P(w1,w2,w3) = p(w1)*p(w2 | w1) * p(w3 | w1,w2)

一元模型(Unigram)

P(w1,w2,w3) =p(w1) * p(w2) * p(w3)

二元模型(Bigram)

P(w1,w2,w3) = p(w1)*p(w2 | w1) * p(w3 | w2)

三元模型(trigram)

P(w1,w2,w3) = p(w1)*p(w2 | w1) * p(w3 | w1,w2)

什么是模型:

p(w1) = 0.1 

p(w2) = 0.2

p(w2 | w1) =0.3

模型有了也就是概率计算好了,使用的时候直接用值即可。

p(w1) =p(本田)=w1的次数 / 语料库总次数

p(w2 | w1) = p(w2,w1) / p(w1) = w1,w2共同出现的次数 / w1 出现的次数

结巴分词背后实现的原理:

结巴分为两个阶段:

(1)基于本地词库,前向遍历方式,构造DAG图出来,进行最优路径的选择(求概率)

(2)如果词库不够大, HMM隐马模型

HMM

状态序列:希望得到的,比如中文输入法的汉字,翻译的结果,分词(每个字要不要停顿),词性标注(词性,n,v)

观测序列:可以观察到的,中文输入法的拼音,翻译前的语言,每个字,每个字

分词:

观察到的是字

状态:

B ——begin

M —— middle

E —— end

S —— single

我 / 喜欢/ 广州本田

S    B E  B M M E

参数:

1、初始概率 :数量4(分词:BMME),状态的个数M

2、转移概率:M*M

3、发射概率:观察值数量是N,M*N

把所有参数计算出来就得到了模型:上面1、2、3点。

三个基本问题(概率语言模型)

1.模型参数估计  M个初始概率+M*M个状态转移概率+M*N个发射概率

2.给定模型,计算一个观测序列出现的概率, 广州本田雅阁汽车这句话出现的概率是多少

3.给定模型和观测序列,找到最优的隐藏状态序列(词性标注,中文分词。。。)

1.状态已知 (隐藏序列),观测序列都知道,相当于已经分好词,求解模型只需要基于统计

  初始概率:p(B) = B在句子开头的次数 / B总出现次数

  转移概率:p(B->M) = (B后面一个是M)出现次数 / B 出现次数

  发射概率: p(B->广)=(状态是B,观测是广)出现次数 / B出现次数

  状态未知 ,观测序列都知道 , EM。

2.DP,前向算法和后向算法

3.分词过程(有模型):viterbi算法,动态规划。

概率最大化: π(b) * p(s|b)*p(广 |s) *p(m | s ) *p(州|m)......

实践:

tfidf : 一个词的tf在所有文章是不是一样的? 不一定

        一个词的idf 在所有文章都是一样的吗?  一样

文本相似度=2*LCS(A,B)/[len(A)+len(B)]

相关文章

  • “结巴”中文分词:做最好的 Python中文分词组件

    “结巴”中文分词:做最好的 Python中文分词组件 1 jieba中文分词简介: 中文分词是中文NLP的第一步,...

  • 第3章 中文分词技术

    本章要点: 中文分词的概念与分类 常用分词的技术介绍 开源中文分词工具-Jieba简介 实战分词之高频词提取 中文...

  • 配置Hanlp自然语言处理进阶

    中文分词 中文分词中有众多分词工具,如结巴、hanlp、盘古分词器、庖丁解牛分词等;其中庖丁解牛分词仅仅支持jav...

  • 分词系统评测

    1.11款开放中文分词引擎大比拼 2.常用的开源中文分词工具 3.11大Java开源中文分词器的使用方法和分词效果...

  • python笔记 | 舆情分析如何做?

    中文分词原理及分词工具介绍 中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切...

  • 中文分词工具及中文语料资源

    关键词: 中文分词;分词;自然语言处理;中文语料 最近要做中文自然语言处理相关任务,牵涉到使用中文分词工具和相关算...

  • 结巴中文分词的用法

    jieba “结巴”中文分词:做最好的 Python 中文分词组件"Jieba" (Chinese for "to...

  • python 结巴分词

    jieba “结巴”中文分词:做最好的 Python 中文分词组件“Jieba” (Chinese for “to...

  • 基于Trie 树实现简单的中文分词

    中文分词简介 中文分词是中文自然语言处理的基础,中文分词的正确率如何直接影响后续的词性标注(也有些词性标注算法不需...

  • Python中文分词及词频统计

    中文分词 中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组。英文使用空格...

网友评论

      本文标题:中文分词

      本文链接:https://www.haomeiwen.com/subject/rlzuqktx.html