新词发现简介
新词发现是NLP的基础任务之⼀,通过对已有语料进⾏挖掘,从中识别出新词。新词发现也可称为未登录词识别,严格来讲,新词是指随
时代发展⽽新出现或旧词新⽤的词语。同时,我认为特定领域的专有名词也可归属于新词的范畴。何出此⾔呢?通常我们会很容易找到通⽤
领域的词表,但要找到某个具体领域的专有名词则⾮常困难,因此特定领域的专有名词相对于通⽤领域的词语即为新词。换⾔之,“新”并
⾮只是时间上的概念,同样可以迁移到领域或空间上。因此,新词发现不仅可以挖掘随时间变化⽽产⽣的新词,也可以挖掘不同领域的专有
名词。
接下来,让我们开始⼀场新词发现的探索之旅吧。⾸先,对于“新词发现”这个标题,我们可将其拆分为“发现”和“新词”两个步骤:
“发现”:依据某种⼿段或⽅法,从⽂本中挖掘词语,组成新词表;
“新词”:借助挖掘得到的新词表,和之前已有的旧词表进⾏⽐对,不在旧词表中的词语即可认为是新词。
“新词发现”的难点主要在于“发现”的过程——如何从⽂本中挖掘到词语?那么有办法回避这个问题吗?让我们思索⼀下“新词”的过
程:⽐对挖掘得到的新词表和旧词表,从代码的⾓度来说。
简单地讲,只要不是旧词就是新词呗,那么我们在对⽂本进⾏分词时,假设分词⼯具可以得到旧词,那么分词⼯具不能切分、切分有误或切
分后不在旧词表中的词语不就是新词了吗?这就是“新词发现”的传统做法——基于分词的⽅法。
基于分词的⽅法
先对⽂本进⾏分词,余下未能成功匹配的⽚段(分词后的中⽂、连续的数字、连续的英⽂)就是新词。下⾯将以这篇⽂章为例:
使⽤经过汽车语料训练后的pkug分词器效果太好了,不利于后续的演⽰与说明,所以最终选择使⽤jieba分词(捂脸哭.jpg)。
【问题1】:怎么去判断⽚段是否成功匹配了呢?
for新词in新词表:
if新词notin旧词表:
print("这是新词")
1
2
3
⽰例1:内饰⽅⾯,两款新车配⾊上采⽤了全新的赭⿊内饰,
分词1:['内饰','两款','新车','配⾊','采⽤','全新','赭','⿊','内饰']
⽰例2:动⼒⽅⾯,两款新车继续搭载1.5L⾃然吸⽓发动机
分词2:[‘动⼒’,‘两款’,‘新车’,‘搭载’,‘1.5’,‘L’,‘⾃然’,‘吸⽓’,‘发动机’]
1
2
3
4
5
对于问题1,我们可以将分词后的单个字作为未成功匹配⽚段,例如⽰例1中的“赭⿊”,jieba分词后得到[“赭”,“⿊”],将这连续
的两个单字整合到⼀块,即可获得新词“赭⿊”。同理,我们可以将⽰例2中的“1.5”视为⼀个单独的⽚段,“L”也为⼀个单独的匹
配,将其整合为“1.5L”。但如果仅仅只将单个字作为未成功匹配⽚段,则会漏掉较多的新词,见下⽅问题2。
【问题2】:对于⼀些较长的新词,例如“⼈艰不拆”,使⽤jieba分词得到[“⼈艰”,“不”,“拆”],此时的未成功匹配⽚段就不全是
单字。换⾔之,新词中包含词语。
对于问题2,我们可以找⼀份常⽤词表(该词表要尽可能齐全),然后借助这份词表去过滤分词后得到的常⽤词,最后余下的就是新词。假
设“⼈艰”不在常⽤词表中,那么过滤后仍会留下[“⼈艰”,“不”,“拆”],此时我们就可以将这些连续的⽚段进⾏整合,得到“⼈艰不
拆”。但这样就完美了吗?没有,还有不少遗漏的新词,见下⽅问题3。
【问题3】:如果新词中包含的词语在常⽤词表中该怎么办?该问题相当于在问题3的基础上提出了——新词中包含常⽤词语。例如“⼀
带⼀路”,使⽤jieba分词可得到[“⼀带”,“⼀路”]。⽽对于问题3则⽐较难处理,需要更多繁复的规则去做后处理。
此外,新词发现的⽬标是挖掘⽂本中的新词,或者说未登录词,来帮助后续的分词等⼯作。⽽基于分词的⽅法则相当于从⽬标反推过程,这
种⽅法未尝不可⾏,但分词的准确性本⾝依赖于词库的完整性,如果词库中根本没有新词,⼜怎么能信任分词的结果呢?⾃然,最终得到的
效果也不会特别好。
通过上述的分析,可以知道传统的⽅法存在许多的掣肘,那么有什么新的⽅法吗?通过查阅资料以及⼀些思考,在新词发现⽅⾯,⽬前主要
有基于规则和基于统计两种⽅法。接下来,让我们具体谈谈这两种⽅法。
基于规则的⽅法
根据新词的构词特征或外型特征建⽴规则库、专业词库或模式库,然后通过规则匹配发现新词。因此,我们需要对已有的语料有着⾜够的了
解,继⽽从语料中抽取固定的模式来匹配和发现新词。例如,在⼀份汽车领域的语料中抽取所需的汽车新词。
从上⾯的汽车⽂章中可以发现,顿号(、)前后的词语通常会是汽车领域的专有名词,这正是我们需要的新词。故⽽,我们可以通过编写正
则表达式的⽅式,从⽂章中将这些内容抽取出来,并依据相应的规则作清洗和过滤。
【优点】:新词挖掘的效果⾮常好,像“⽀持CarPlay+CarLife双机互联”这⼀类夹杂中⽂、英⽂和标点符号的词语(短语)也能抽取出
来。
【缺点】:与领域耦合过深,⽆法将建⽴的规则库、专业词库以及模式库迁移到其他领域中,需要根据领域内容重新搭建。甚⾄与特定类
型、出版社、渠道的⽂章耦合过深,例如汽车之家的汽车⽂章和易车的汽车⽂章的格式就不同,需要为不同的数据源搭建相应的规则库。⼀
旦数据源的⽂章格式变动,规则库也需要作相应的修改。⽆论是搭建还是后续的维护,都需要⼤量的⼈⼯成本。
基于统计的⽅法
基于统计的⽅法根据有⽆标注数据可分为有监督⽅法和⽆监督⽅法。
有监督⽅法
有监督⽅法利⽤标注语料,将新词发现看作分类或者序列标注问题:
基于⽂本⽚段的某些统计量,以此作为特征训练⼆分类模型;
基于序列信息进⾏序列标注直接得到新词,或对得到的新词再进⾏判定。
通常可以⽤HMM、CRF、SVM等机器学习算法实现。但是在实际应⽤中,获取⼤量的标注语料数据是⾮常困难的⼀件事情,并且既然已
经有了⼿⼯标注的数据,那么直接把标注得到的新词加⼊到新词词库就好了,⼜何必建模来解决呢?所以,探索⽆监督的挖掘⽅法在新词发
现领域中更有价值。
⽆监督⽅法
不依赖于任何已有的词库、分词⼯具和标注语料,仅仅根据词的共同特征,利⽤统计策略将⼀段⼤规模语料中可能成词的⽂本⽚段全部提取
出来,然后再利⽤语⾔知识排除不是新词语的“⽆⽤⽚段”或者计算相关度,寻找相关度最⼤的字与字的组合。最后,把所有抽取得到的词
和已有的词库进⾏⽐较,就能得到新词。
实际上,利⽤统计策略对语料进⾏切分,形成若⼲块⽂本⽚段,这相当于⼀次粗浅的分词。接下来,再对这些⽂本⽚段作⼀次清洗与过滤,
余下的⽂本⽚段即可作为新词词库。因此,上述过程可简化为两个步骤:
1.构建词库
2.新词⽐对
⽬前已有的⼤多数基于统计的新词发现⽅案和博客,其根本思想都是源于matrix67纂写的。下⽂所讲的内容也未能跳离这个框架,只是在
前⼈的基础上增加了些许⾃⾝的理解与尝试,以及努⼒尝试将实现步骤呈现给读者。
构建词库
怎么样的⽂本⽚段才能作为⼀个词语?或者说作为⼀个词语的⽂本⽚段需要满⾜什么条件。
词频
凝聚程度
⾃由程度
接下来,让我们依次探讨这三个条件对判断成词的作⽤与意义。
词频
⾸先,被选中的⽂本⽚段要在语料中出现多次,⽬的是为了排除偶然情况,例如笔误的情况。因此,我们可以通过设置⼀个阈值,将频数超
过该阈值的⽂本⽚段提取出来,作为当前语料的词汇输出。
但光凭词频不⾜以判断,⼀个经常出现的⽂本⽚段有可能不是⼀个词,⽽是多个词构成的词组,例如“的电影”、“在北京”等词组。这些
词组并不是我们想要的词语,我们想要的是“电影院”之类的词语。此时就需要凝聚程度来帮助我们作进⼀步的判断。
凝聚程度
凝聚程度⽤以衡量相邻字组合成词语的程度,如果两个⼈经常待在⼀起,我们往往会认为他们的关系很亲密,⽽字与字之间的“亲密关
系”则通过凝聚程度(其他⽂献中称为“凝合程度”)来表⽰。
凝聚程度要如何进⾏计算呢?词组的出现概率除以构成词组的各个词语的出现概率的乘积,最后对结果做⼀次对数处理(可以理解为对计算
得到的概率值组了⼀次映射)。
P
M
I
(
x
,
y
)
=
log
2
p
(
x
,
y
)
p
(
x
)
p
(
y
)
PMI(x,y)=log_{2}frac{p(x,y)}{p(x)p(y)}
efault"style="margin-right:0.13889em;">P
efault"style="margin-right:0.07847em;">I
n>
ass="mclo">)
gin-right:0.277778em;">
mop">
vlist-r">
2.7em;">
span>
span>
ass="mordmathdefault">x
"mordmathdefault"style="margin-right:0.03588em;">y
class="pstrut"style="height:3em;">
7em;">
spanclass="mordmathdefault">x
mordmathdefault"style="margin-right:0.03588em;">y
n>
miter">
p(x,y)<=p(x)、p(x,y)<=p(y),且p(x)<0、p(y)<0,因此:
p
(
x
,
y
)
p
(
x
)
p
(
y
)
≥
1
frac{p(x,y)}{p(x)p(y)}geq1
>
7em;">
span>
>
n>
span>
lt">p
n-right:0.166667em;">
>
/span>
≥
tical-align:0em;">
对于log函数⽽⾔,真数>=1,函数值>=0,加上log函数相当于将原本的函数值映射到[0,+∞]区间,且增速放缓。
仍然以“的电影”和“电影院”为例。
的电影=的+电影
电影院=电影+院
电影:0.01,的:0.2,的电影:0.002
P(的电影)/P(的)P(电影):0.002/(0.01*0.2)=1
1
2
3
4
5
上⾯的结果表明“电影院”更可能是⼀个有意义的搭配,⽽“的电影”则更像是“的”和“电影”这两个成分偶然拼到⼀块。
凝聚程度的计算⽅式很⼤程度上受到⽂本切分的影响,因此我将这部分的内容移到了⽂本切分部分。
⾃由程度
词语作为汉语中的⼀个基本语义单元,具备⼀个显著的特征——可以灵活地应⽤到不同的场景中。例如“机器学习”,上下⽂可以搭配很多
动词和名词“学习⼈⼯智能知识”、“从事⼈⼯智能⾏业”。但对于“⼈⼯智”这个词语来说,上⽂依然可以搭配很多词语,下⽂却基本上
只能搭配“能”。那么,我们可以认为“⼈⼯智”不是⼀个完整的词语。
换个⾓度来看,词语的⾃由程度可以理解为词语之间的相关性弱,换⾔之,词语的独⽴性⾼。苏剑林⼤佬纂写的⼀⽂中提到:
为什么要分词?⼈本来就是按照字来书写和理解的呀?
当模型的记忆和拟合能⼒⾜够强(或者简单点,⾜够智能)的时候,我们完全可以不⽤分词的,直接基于字的模型就可以做,⽐如基
于字的⽂本分类、问答系统等,早已有⼈在研究。但是,即便这些模型能够成功,也会因为模型复杂⽽导致效率下降,因此,很多时
候(尤其是⽣产环境中),我们会寻求更简单、更⾼效的⽅案。
什么⽅案最⾼效?以⽂本分类为例,估计最简单⾼效的⽅案就是“朴素贝叶斯分类器”了,类似的,⽐较现代的是FastText,它可以
看作是“朴素贝叶斯”的“神经⽹络版”。要注意,朴素贝叶斯基于⼀个朴素的假设:特征之间相互独⽴。这个假设越成⽴,朴素贝
叶斯的效果就越好。然⽽,对于⽂本来说,显然上下⽂紧密联系,这个假设还成⽴吗?
电影:0.01,院:0.01,电影院:0.001
P(电影院)/P(电影)P(院):0.001/(0.01*0.01)=10
注意到,当特征之间明显不独⽴的时候,可以考虑将特征组合之后,使得特征之间的相关性减弱,再⽤朴素贝叶斯。⽐如,对于⽂
本,如果以字为特征,则朴素假设显然不成⽴,如“我喜欢数学”中的“喜”和“欢”、“数”和“学”都明显相关,这时候我们考
虑将特征进⾏组合,得到“我/喜欢/数学”,这样三个⽚段之间的相关性就没有那么强了,因此可以考虑⽤上述结果。
可以发现,这个过程很像分词,或者反过来说,分词的主要⽬的之⼀,就是将句⼦分为若⼲个相关性⽐较弱的部分,便于进⼀步处
理。
知道了什么是⾃由程度,以及为什么⾃由程度可以作为新词的评估指标,那么我们该如何计算当前⽂本⽚段的⾃由程度呢?简单地讲,如何
衡量当前⽂本⽚段的上下⽂可搭配词语的丰富程度呢?
matrix67提出可以使⽤信息熵来进⾏度量,令当前⽂本⽚段为x,其上⽂的词语为
y
l
y_l
d">
style="height:2.7em;">
pan>
>,下⽂的词语为
atex-mathml">
y
r
y_r
d">
style="height:2.7em;">
pan>
>。
katex">
H
(
y
∣
x
)
=
−
∑
y
p
(
y
∣
x
)
l
o
g
p
(
y
∣
x
)
H(y|x)=-sum_yp(y|x)logp(y|x)
efault"style="margin-right:0.08125em;">H
pan>
.277778em;">
class="strut"style="height:2.43612em;vertical-align:-1.38611em;">
6667em;">
ss=""style="top:-1.89999em;margin-left:0em;">
class="mordmathdefaultmtight"style="margin-right:0.03588em;">y
style="height:3.05em;">
span>
style="margin-right:0.166667em;">
e="margin-right:0.03588em;">y
ss="mordmathdefault"style="margin-right:0.01968em;">l
n-right:0.03588em;">g
ght:0.03588em;">y
n>
当前⽂本⽚段的上⽂和下⽂可搭配词语越丰富,则其上⽂信息熵(左信息熵)和下⽂信息熵(右信息熵)越⼤。⼀般,我们取左右信息熵中
的最⼩值。
当然我们也可以⾃⾏设计⼀个合理的统计量去度量⾃由程度。例如,综合考虑⽂本⽚段左右信息熵(LE、RE)的⼤⼩、LE与RE差的绝对
值(|LE-RE|)。
L
(
W
)
=
log
L
E
⋅
e
R
E
+
R
E
⋅
e
L
E
∣
L
E
−
R
E
∣
L(W)=logfrac{LEcdote^{RE}+REcdote^{LE}}{|LE-RE|}
efault">L
an>
m;">
e="margin-right:0.01389em;">g
ennulldelimiter">
s=""style="top:-2.314em;">
default">L
/span>
t:0.00773em;">R
class=""style="top:-3.23em;">
pan>
an>
class="mbin">⋅
spanclass="msupsub">
argin-right:0.05em;">
class="mordmathdefaultmtight"style="margin-right:0.00773em;">R
span>
n">+
>
ss="mbin">⋅
anclass="msupsub">
gin-right:0.05em;">
ass="mordmathdefaultmtight">L
n>
36em;">
n>
从执⾏流程上来看,⾃由程度的阈值计算相当于对上⼀步凝聚程度所得的词表进⾏了⼀次过滤,从中剔除不满⾜⾃由程度要求的词语。
语义完整
语义完整是我在阅读《AutomatedPhraMiningfromMassiveTextCorpora》这篇论⽂时得到的灵感。⼀个词语的语义应该是完整
的,例如“电影院”。⽽不应该像“的电影”,语义是⽋缺的。
那么如何去判断⼀个⽂本⽚段的语义是否完整呢?初步的想法:依据词性标注,判断构成⽂本⽚段的各⼦⽂本⽚段的词性,例如“前麦弗逊
式独⽴悬架”,经过词性标注后的结果[('前','f'),('麦弗逊式','n'),('独⽴','v'),('悬架','n')],构成偏正结构,因此我们可认为具有完整的语义信
息。
再举个反例,例如“前麦弗逊式独⽴悬架驱”,其词性标注结果[('前','f'),('麦弗逊式','n'),('独⽴','ad'),('悬架','v'),('驱','v')],最后⼀个“驱”字
为动词v,那么这个词语不具备完整的语义,因此我们可以认为“前麦弗逊式独⽴悬架驱”不应该作为⼀个词语。
然⽽语义完整很难在实际中进⾏运⽤,例如“⼈艰不拆”,其词性标注[('⼈','n'),('艰','a'),('不','d'),('拆','v')],如果按照“前麦弗逊式独⽴悬
架驱”的判断标准,那么“⼈艰不拆”不应该作为⼀个词语。因此,语义完整的判断标准该如何设置,以及在评判标准中的定位都是⼀个值
得商榷的问题。
缺点:限于查找较短的新词语,但不便于描述词语的内部和外部结构特征,同时对于出现频率很低的新词识别效果不好。
⽂本切分
⽂本切分主要有两种处理⽅式:合词与切分。接下来我会详细地介绍这两种处理⽅式的执⾏过程。
合词
从左到右依次计算相邻⽂本⽚段的凝聚程度,若达到设定的阈值,则将这两段⽂本⽚段整合为⼀块新的⽂本⽚段,然后继续去计算该整合后
的⽂本⽚段与下⼀段相邻⽂本⽚段的凝聚程度。不断循环,直到⽆⽂本⽚段。
【处理过程】:以“巧克⼒”为例。
1.⾸先,计算“巧克”的凝聚程度,若超过阈值,则将其合并;
2.然后计算“巧克”与“⼒”的凝聚程度,若超过阈值,则将其合并,得到“巧克⼒”。
【问题1】:当两段相邻⽂本⽚段整合为⼀块新的⽂本⽚段时,我们该如何去获取这块新⽂本⽚段的频数呢?同样,三段、四段乃⾄n段⽂
本⽚段整合后,该如何计算这些⽂本⽚段的频数呢?
【解决⽅案】:以“巧克⼒”为例,我们需要统计2-gram的频数,对于较长的词语,则需要统计n-gram的频数。
上述解决⽅案仍然不是⼀个明智之举,n-gram的n值越⼤,需要统计的词语也越多,对性能的开销也逐渐增⼤。此外,如何设置n值也
是⼀个值得商榷的问题,⼀般n≤5。但这对于⼀些特殊领域的新词发现并不能起到良好的效果,例如汽车领域中的“前麦弗逊式独⽴悬
架”,存在较长的新词。
【问题2】:令合词操作得到的⽂本⽚段为A,下⼀段相邻⽂本⽚段为B。随着合词操作的进⾏,P(A)和P(A,B)⼀般会越来越⼩且越来
越接近。此时,P(B)对PMI(A,B)起主要影响作⽤。那么只要⽂本⽚段B是⼀些低频字,PMI(A,B)的值仍然可以超过设定的阈值,从⽽
将⽂本⽚段A和B整合得到C,但C很有可能不是我们想要的新词,例如“前麦弗逊式独⽴悬架驱”,由于“驱”字在语料中出现的频率
很低,因此极容易将“前麦弗逊式独⽴悬架”和“驱”进⾏整合,得到不期待的结果。
【解决⽅案】:使⽤平均互信息(AMI)作为凝聚程度的计算公式(参考⾃)。
A
M
I
(
X
,
y
)
=
1
n
l
o
g
g
2
p
(
X
,
y
)
p
(
x
1
)
⋯
p
(
x
n
)
p
(
y
)
AMI(X,y)=frac{1}{n}log_2frac{p(X,y)}{p(x_1)cdotsp(x_n)p(y)}
efault">A
7em;">I
n>
ass="mclo">)
gin-right:0.277778em;">
mord">
1.32144em;">
ult">n
-bottom-width:0.04em;">
panclass="mord">1
>
n-right:0.01968em;">l
8em;">g
style="top:-2.55em;margin-left:-0.03588em;margin-right:0.05em;">
size3mtight">
tyle="height:0.15em;">
panclass="mfrac">
panclass="pstrut"style="height:3em;">
s="mord">
height:0.301108em;">
panclass="sizingret-size6size3mtight">
="vlist-r">
nclass="mspace"style="margin-right:0.166667em;">
/span>
ass="msupsub">
gin-left:0em;margin-right:0.05em;">
mathdefaultmtight">n
;">
="mopen">(
ss=""style="top:-3.23em;">
>
mspace"style="margin-right:0.166667em;">
span>
an>
其中n表⽰⽂本⽚段
的个数,例如“巧克⼒”和“的”,其中“巧克⼒”由三个⽂本⽚段组成,因此n=4。
katex">
A
M
I
(
巧克⼒
,
的
)
=
1
4
l
o
g
2
p
(
巧克⼒的
)
p
(
巧
)
p
(
克
)
p
(
⼒
)
p
(
的
)
AMI(text{巧克⼒},text{的})=frac{1}{4}log_2frac{p(text{巧克⼒的})}{p(text{巧})p(text{克})p(text{⼒})p(text{的})}
efault">A
7em;">I
/span>
anclass="mclo">)
margin-right:0.277778em;">
s="mord">
ght:1.32144em;">
pan>
width:0.04em;">
="mord">1
lass="">
.01968em;">l
op:-2.55em;margin-left:-0.03588em;margin-right:0.05em;">
tight">
tight">
eight:0.15em;">
ass="mfrac">
ass="pstrut"style="height:3em;">
rdtext">
n">(
p
anclass="mordmathdefault">p
class="mclo">)
yle="border-bottom-width:0.04em;">
="mord">
pan>
height:0.936em;">
pan>
实际上
1
n
frac{1}{n}
d">
45108em;">
class="mordmtight">
tyle="height:3em;">
ss="pstrut"style="height:3em;">
pan>
n>
数,⽽这惩罚系数我们可以视情况⾃⾏设定。
切词
从左到右依次计算相邻⽂本⽚段的凝聚程度(与合词不同,每次只计算相邻两个⽂本⽚段的凝聚程度),若未达到设定的阈值,则将这两段
⽂本⽚段进⾏切分。不断循环,直到⽆⽂本⽚段。
【处理过程】:以“巧克⼒真好吃”为例。
1.⾸先,计算“巧克”的凝聚程度,若超过阈值,则继续计算“克⼒”的凝聚程度,若仍然超过阈值,则继续计算下⼀对⽂本⽚段“⼒
真”的凝聚程度;
2.若“⼒真”的凝聚程度⼩于阈值,则进⾏切分“⼒|真”,继续计算下⼀对⽂本⽚段;
3.最终可得“巧克⼒|真|好吃”。
合词、切词与凝聚程度
【合词与切词的⽐较】:
合词需要更多的统计信息,⽽切词仅需要2-gram的统计信息(计算相邻两个⽂本⽚段的凝聚程度)即可,因此切词的执⾏开销要远⼩
于合词;
合词的过程中会遇到合词中提到的问题2,⽽切词不会出现该问题;
切词的缺陷
切词忽略了更多的上下⽂信息,因为切词仅考虑相邻两个⽂本⽚段,例如对于“电影院”,切词只会计算“电”和“影”、
“影”和“院”之间的凝聚程度。我们都知道P(影)>=P(电影),P(影院)≈P(电影院),那么计算得到的凝聚程度,PMI(电影,院)>
PMI(影,院)。对于⼀些三字以上且包含常⽤字的词语,通过切词的⽅式往往会被“⼀⼑两断”。
“电”、“影”、“院”三位好朋友⼿拉⼿,“电”⼩朋友是⼀位交际花,她有许多的朋友,⽽⼈的精⼒总是有限的,因此“电”⼩朋友
和“影”⼩朋友的玩耍时间远没有“影”⼩朋友和“院”⼩朋友来得多。但我们没有因为“电”的朋友多且和“影”⼀起玩耍的时间少,⽽
认为他们俩不是朋友。因此,仅考虑相邻⽂本⽚段的切词过程计算得到的是“封闭程度”,⽽⾮凝聚程度。例如,“饕餮”、“沆瀣”等
词,他们只拥有彼此。
针对这个问题,苏剑林⼤佬提出了改进,在⽂章中提出了多字的凝聚程度计算⽅式。以下是⽂章中的原⽂:
⽂章其实就是这个意思,只是那⾥认为,⽂本的相关性仅由相邻两字(2grams)来决定,这在很多时候都是不合理的,⽐如“林⼼
如”中的“⼼如”、“共和国”中的“和国”,凝固度(相关性)都不是很强,容易错切。
因此,本⽂就是在前⽂的基础上改进,那⾥只考虑了相邻字的凝固度,这⾥同时考虑多字的内部的凝固度(ngrams),⽐如,定义三
字的字符串内部凝固度为:
min
{
P
(
a
b
c
)
P
(
a
b
)
P
(
c
)
,
P
(
a
b
c
)
P
(
a
)
P
(
b
c
)
}
minleft{frac{P(abc)}{P(ab)P(c)},frac{P(abc)}{P(a)P(bc)}right}
mop">min
em;">
nclass="vlist-tvlist-t2">
="height:3em;">
e="margin-right:0.13889em;">P
m;">
hdefault"style="margin-right:0.13889em;">P
efault">b
spanclass="vlist-r">
">
opennulldelimiter">
s=""style="top:-2.314em;">
13889em;">P
efault"style="margin-right:0.13889em;">P
ult">c
nclass="frac-line"style="border-bottom-width:0.04em;">
rdmathdefault">a
pan>
n>
">}
如果按照这⼀种思路来做的话,切词⽅式所带来的实现与执⾏上的优势(不需要获取更多的统计信息n-gram)将荡然⽆存。苏剑林⼤佬之
所以选⽤这种⽅式,是因为他只采⽤了凝聚程度和词频作为新词的判断依据。为什么不加上⾃由程度呢?因为⾃由程度的计算时间要远⼤于
凝聚程度。在上⽂的⾃由程度中也提到,⾃由程度在流程上的主要贡献在于对凝聚程度所得到的词表进⾏过滤,⾄于需不需要耗费⼤量的时
间去做这⼀层过滤,则需要视情况⽽定,这⼤概也是苏剑林⼤佬放弃使⽤⾃有程度的原因之⼀吧。
并且按照上述⽅法来做,仍然不能解决两字词语存在的切分问题,对于⼀些频数较⾼的字,例如“在”、“利”等,我们在计算其组合
(“现在”、“利益”)的凝聚程度时,所得到的凝聚程度往往较低,容易被切分成单字。
【⽰例】:以“利率”为例,在所有语料中“利率”出现的次数不会太多,同时“率”的出现次数略⾼于“利率”,那么在凝聚程度的计算
公式中,“利”的出现次数对最终凝聚程度起到关键作⽤。但像“利”这⼀类⾼频字,会使得计算得到的凝聚程度较⼩,低于设定的阈值,
从⽽使得“利率”这⼀类的词被切分。
那么如何去解决这⼀类的切分问题呢?
切分问题的⼀些⽅案
针对上⼀⼩节提到的切分问题,我针对⽬前已有的⼯作提出了两个思路:
调整凝聚程度计算公式;
依据⾃由程度进⾏扩展。
调整凝聚程度计算公式
切分问题的实质在于⾼频字对成词的影响,那么我们适当调低⾼频字对成词的影响,或提⾼共现频率在计算公式中的⽐重。
【简单的实现⽅式】:
P
M
I
(
A
,
B
)
=
l
o
g
2
α
P
(
A
B
)
β
1
P
(
A
)
∗
β
2
P
(
B
)
PMI(A,B)=log_2frac{alphaP(AB)}{beta_1P(A)*beta_2P(B)}
efault"style="margin-right:0.13889em;">P
efault"style="margin-right:0.07847em;">I
n>
ass="mclo">)
gin-right:0.277778em;">
mordmathdefault"style="margin-right:0.01968em;">l
ault"style="margin-right:0.03588em;">g
t:0.301108em;">
ss="vlist-r">
mopennulldelimiter">
ass=""style="top:-2.314em;">
"style="margin-right:0.05278em;">β
301108em;">
anclass="sizingret-size6size3mtight">
"vlist-r">
"margin-right:0.13889em;">P
ss="mspace"style="margin-right:0.222222em;">
anclass="vlist-r">
panclass="pstrut"style="height:2.7em;">
n>
/span>
"style="margin-right:0.05017em;">B
e="height:3em;">
="pstrut"style="height:3em;">
mathdefault"style="margin-right:0.13889em;">P
thdefault"style="margin-right:0.05017em;">B
class="vlist-r">
pan>
α
alpha
hdefault"style="margin-right:0.0037em;">α⽤以提⾼A、B共现频率的权重,⽽
class="katex">
β
1
beta_1
ord">
">
t"style="height:2.7em;">
vlist-s">
span>和
β
2
beta_2
ord">
">
t"style="height:2.7em;">
vlist-s">
span>则可视为对⾼频字的惩罚系数。
如果
α
alpha
hdefault"style="margin-right:0.0037em;">α和
ex-mathml">
β
beta
ordmathdefault"style="margin-right:0.05278em;">β是⼀个固定的数值,且
ss="katex">
β
1
beta_1
ord">
">
t"style="height:2.7em;">
vlist-s">
span>=
β
2
beta_2
ord">
">
t"style="height:2.7em;">
vlist-s">
span>,相当于在原式上乘上了⼀个固定的系数
γ
gamma
dmathdefault"style="margin-right:0.05556em;">γ,起到的作⽤并不⼤,完全可有通过调整凝聚程度的阈值(除以<
spanclass="katex--inline">
γ
gamma
dmathdefault"style="margin-right:0.05556em;">γ)来起到相应的作⽤。因此,我认为线性地改变原式并不能起到
改进作⽤。但它提供了两种可⾏的改进⽅向:
⾮线性地增⼤共现频率的权重;
⾮线性地降低⾼频字的权重。
⾮线性地增⼤共现频率的权重
为了加⼤共现频率的权重,我们可以在原式的基础上再乘上共现频率:
P
M
I
(
A
,
B
)
′
=
P
(
A
,
B
)
l
o
g
2
P
(
A
,
B
)
P
(
A
)
P
(
B
)
PMI(A,B)'=P(A,B)log_2frac{P(A,B)}{P(A)P(B)}
mathdefault"style="margin-right:0.13889em;">P
mathdefault"style="margin-right:0.07847em;">I
,
panclass="mclo">
.801892em;">
ze6size3mtight">
class="mspace"style="margin-right:0.277778em;">
n>
in-right:0.13889em;">P
space"style="margin-right:0.166667em;">
pan>
ss="mordmathdefault"style="margin-right:0.03588em;">g
"vlist"style="height:0.301108em;">
:2.7em;">
>
ord">
.427em;">
tyle="margin-right:0.13889em;">P
nclass="mordmathdefault"style="margin-right:0.13889em;">P
t:0.05017em;">B
/span>
ght:3em;">
nclass="mordmathdefault">A
dmathdefault"style="margin-right:0.05017em;">B
spanclass="vlist-r">
">
上式实际上就是互信息的计算公式,此时P(A)、P(B)和P(AB)都是固定的值,我们可以通过给P(AB)加上未知的系数,使其转变为变
量。
A
B
=
α
P
(
A
B
)
AB=alphaP(AB)
thdefault">A
>
style="height:1em;vertical-align:-0.25em;">
efault"style="margin-right:0.13889em;">P
ult"style="margin-right:0.05017em;">B
这样我们就可以将原式视作共现频率P(AB)的⼀个函数。
f
(
A
B
)
=
l
o
g
2
α
P
(
A
,
B
)
P
(
A
)
P
(
B
)
f(AB)=log_2frac{alphaP(A,B)}{P(A)P(B)}
efault"style="margin-right:0.10764em;">f
ult"style="margin-right:0.05017em;">B
ass="mrel">=
63em;vertical-align:-0.936em;">
pan>
>
">
/span>
an>
>
>
spanclass="mclo">)
ordmathdefault"style="margin-right:0.05017em;">B
ass="pstrut"style="height:3em;">
m;">
panclass="mordmathdefault"style="margin-right:0.13889em;">P
nclass="mpunct">,
7em;">B
e="height:0.936em;">
最终转变为:
P
M
I
(
A
,
B
)
′
=
A
B
f
(
A
B
)
PMI(A,B)'=ABf(AB)
mathdefault"style="margin-right:0.13889em;">P
mathdefault"style="margin-right:0.07847em;">I
,
panclass="mclo">
.801892em;">
ze6size3mtight">
class="mspace"style="margin-right:0.277778em;">
n>
class="mordmathdefault"style="margin-right:0.05017em;">B
ass="mopen">(
s="mclo">)
f(AB)可理解为共现频率的⾮线性权重系数,上述式⼦对实际的计算没有作⽤,提供了另⼀种⾓度的解释。
【互信息计算公式效果】:
【原式效果】:
可以看到乘上共现频率的效果并不如原始的效果,这有两⽅⾯的原因:
1.乘上共现频率后的凝聚程度阈值需要相应地调低,但共现频率的波动较⼤,如何设置凝聚程度阈值是⼀个问题;
2.马太效应:较⼤的共现频率可以得到更⾼的凝聚程度,⽽较低的共现频率则得到更低的凝聚程度,这显然不是我们想看到的。
此时,我们亦然陷⼊⼀个误区:单纯地提⾼共现频率对结果不⼀定能起到正向作⽤,或者说依靠固定值或共现频率去提⾼共现频率的权重不
是⼀个好办法。
单纯提⾼共现频率的权重,这可能会帮助我们解决“利|益”的切分问题,但同时也会导致“美丽”和“的”组合成“美丽的”。当然,并
⾮说这条路⾛不通,⽽是需要借助更多的信息,在共现频率权重的计算过程中引⼊其他的统计信息。
⾮线性地降低⾼频字的权重
⼀种简单的实现⽅式:⽐较P(A)和P(B)的⼤⼩,若P(A)>P(B),那么
ord">
">
t"style="height:2.7em;">
vlist-s">
span><
ord">
">
t"style="height:2.7em;">
vlist-s">
span>。⽬的在于⾮线性地降低⾼频字在式⼦中的权重。通过这种⽅式,我们可以适当提⾼“现在”、“利益”等词的凝聚程度,但同时也
会提⾼“漂亮的”、“美丽的”这些词语的凝聚程度。简单地说,我们不想降低“的”、“了”、“呢”这些⾼频字的权重,为了⽅便后续的说明,特将这些字命名为“停⽤字
”。
对于这种情况,我们可以按字的频数取topK,然后对这些字的频率加⼤惩罚。
下⾯是从汽车领域的80w⽂章中统计的top100字频率。取语料中统计得到的topk能够更准确地反映领域的特点,但很显然“车”、
“型”这些字是我们需要的。
在实际处理过程中,通⽤领域的“停⽤字”也往往是特定领域的“停⽤字”,因此我们直接使⽤通⽤领域的“停⽤字”即可,例如找⼀份停
⽤词表,从中将单字抽取出来。
依据⾃由程度进⾏扩展
思路:依据凝聚程度得到的“候选词”的⾃由程度来将相邻的“候选词”重新进⾏组合。
【具体步骤】:
1.若切分后的⽂本⽚段⾃由程度⼩于设定阈值,则尝试将当前⽂本⽚段与相邻⽂本⽚段进⾏组合;
2.计算组合后的⽂本⽚段的⾃由程度,若⾃由程度提⾼则继续组合相邻的⽂本⽚段;
3.若连续组合之后的⽂本⽚段的⾃由程度⾼于设定阈值,则将这段⽂本⽚段作为新的词语,否则出局。
【问题1】:连续组合相邻⽂本⽚段会导致最终得到⼀个超长的词语吗?
【回答1】:不会,当超过某个临界点时(n=4),字数越长的⽂本⽚段其⾃由程度越低。因为n-gram中的n越⼤,得到的⽂本的频数
越低,因此其相邻词语的数量也越少,信息熵越来越低,低于设定的阈值。
'嗬','嗯','嗳','嘎','嘘','嘛','嘻','嘿',......1
【注意】:“利”的左信息熵不能作为“利率”的左信息熵,换⾔之,“利”的左邻词语不能作为“利率”的左邻词语,必须
要“利”和“率”共有的左邻才能作为“利率”的左邻词语。右信息熵同理。
执⾏过程
1.⾸先将⽂本拆分为⽂本⽚段(字符、英⽂单词等);
2.基于凝聚程度和切词⽅式对⽂本进⾏切分,获得⼀个粗的词库,同时也对⽂本做了⼀次粗的分词;
3.基于⾃由程度从上⼀步的到得词库中筛选出词语;
告⼀段落
新词发现还有许多的⼯作可以去尝试:
尝试从⽂本中挖掘更多的统计量,⽽⾮仅仅局限于频数和频率;
如何去设计⼀套⽆监督的评估指标也是⾮常有挑战的⼯作;
全⽂主要讲述切词的⼯作,关于合词也有不少可探索的⼯作。
参考
新词发现:中⽂新词识别技术简介:/sinat_33741547/article/details/81704798
互联⽹时代的社会语⾔学:基于SNS的⽂本数据挖掘:/blog/archives/5044
"新词发现"算法探讨与优化-SmoothNLP:/p/80385615
⽆监督构建词库:更快更好的新词发现算法:=
本文发布于:2022-11-14 01:39:21,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/14623.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |