原文鏈接:https://blog.csdn.net/weixin_43378396/article/details/103848628
新詞發現是 NLP 的基礎任務之一,通過對已有語料進行挖掘,從中識別出新詞。新詞發現也可稱為未登錄詞識別,嚴格來講,新詞是指隨時代發展而新出現或舊詞新用的詞語。同時,我認為特定領域的專有名詞也可歸屬于新詞的范疇。何出此言呢?通常我們會很容易找到通用領域的詞表,但要找到某個具體領域的專有名詞則非常困難,因此特定領域的專有名詞相對于通用領域的詞語即為新詞。換言之,“新”并非只是時間上的概念,同樣可以遷移到領域或空間上。因此,新詞發現不僅可以挖掘隨時間變化而產生的新詞,也可以挖掘不同領域的專有名詞。
接下來,讓我們開始一場新詞發現的探索之旅吧。首先,對于“新詞發現”這個標題,我們可將其拆分為“發現”和“新詞”兩個步驟:
“發現”:依據某種手段或方法,從文本中挖掘詞語,組成新詞表; “新詞”:借助挖掘得到的新詞表,和之前已有的舊詞表進行比對,不在舊詞表中的詞語即可認為是新詞。 “新詞發現”的難點主要在于“發現”的過程——如何從文本中挖掘到詞語?那么有辦法回避這個問題嗎?讓我們思索一下“新詞”的過程:比對挖掘得到的新詞表和舊詞表,從代碼的角度來說。
for 新詞 in 新詞表:if 新詞 not in 舊詞表:print("這是新詞")
簡單地講,只要不是舊詞就是新詞唄,那么我們在對文本進行分詞時,假設分詞工具可以得到舊詞,那么分詞工具不能切分、切分有誤或切分后不在舊詞表中的詞語不就是新詞了嗎?這就是“新詞發現”的傳統做法——基于分詞的方法。
基于分詞的方法 先對文本進行分詞,余下未能成功匹配的片段(分詞后的中文、連續的數字、連續的英文)就是新詞。下面將以這篇文章為例:
使用經過汽車語料訓練后的 pkuseg 分詞器效果太好了,不利于后續的演示與說明,所以最終選擇使用 jieba 分詞(捂臉哭.jpg)。
【問題 1】:怎么去判斷片段是否成功匹配了呢?
示例 1:內飾方面,兩款新車配色上采用了全新的赭黑內飾,
分詞 1:['內飾', '兩款', '新車', '配色', '采用', '全新', '赭', '黑', '內飾']
示例 2:動力方面,兩款新車繼續搭載1.5L自然吸氣發動機 分詞 2:[‘動力’, ‘兩款’, ‘新車’, ‘搭載’, ‘1.5’, ‘L’, ‘自然’, ‘吸氣’, ‘發動機’]
對于問題 1,我們可以將分詞后的單個字作為未成功匹配片段,例如示例 1 中的“赭黑”,jieba 分詞后得到 [“赭”, “黑”],將這連續的兩個單字整合到一塊,即可獲得新詞“赭黑”。同理,我們可以將示例 2 中的 “1.5” 視為一個單獨的片段,“L” 也為一個單獨的匹配,將其整合為“1.5L”。但如果僅僅只將單個字作為未成功匹配片段,則會漏掉較多的新詞,見下方問題 2。
【問題 2】:對于一些較長的新詞,例如“人艱不拆”,使用 jieba 分詞得到 [“人艱”, “不”, “拆”],此時的未成功匹配片段就不全是單字。換言之,新詞中包含詞語。
對于問題 2,我們可以找一份常用詞表(該詞表要盡可能齊全),然后借助這份詞表去過濾分詞后得到的常用詞,最后余下的就是新詞。假設“人艱”不在常用詞表中,那么過濾后仍會留下 [“人艱”, “不”, “拆”],此時我們就可以將這些連續的片段進行整合,得到“人艱不拆”。但這樣就完美了嗎?沒有,還有不少遺漏的新詞,見下方問題 3。
【問題 3】:如果新詞中包含的詞語在常用詞表中該怎么辦?該問題相當于在問題 3 的基礎上提出了——新詞中包含常用詞語。例如“一帶一路”,使用 jieba 分詞可得到 [“一帶”, “一路”]。而對于問題 3 則比較難處理,需要更多繁復的規則去做后處理。
此外,新詞發現的目標是挖掘文本中的新詞,或者說未登錄詞,來幫助后續的分詞等工作。而基于分詞的方法則相當于從目標反推過程,這種方法未嘗不可行,但分詞的準確性本身依賴于詞庫的完整性,如果詞庫中根本沒有新詞,又怎么能信任分詞的結果呢?自然,最終得到的效果也不會特別好。
通過上述的分析,可以知道傳統的方法存在許多的掣肘,那么有什么新的方法嗎?通過查閱資料以及一些思考,在新詞發現方面,目前主要有基于規則和基于統計兩種方法。接下來,讓我們具體談談這兩種方法。
基于規則的方法
根據新詞的構詞特征或外型特征建立規則庫、專業詞庫或模式庫,然后通過規則匹配發現新詞。因此,我們需要對已有的語料有著足夠的了解,繼而從語料中抽取固定的模式來匹配和發現新詞。例如,在一份汽車領域的語料中抽取所需的汽車新詞。
從上面的汽車文章中可以發現,頓號(、)前后的詞語通常會是汽車領域的專有名詞,這正是我們需要的新詞。故而,我們可以通過編寫正則表達式的方式,從文章中將這些內容抽取出來,并依據相應的規則作清洗和過濾。
【優點】:新詞挖掘的效果非常好,像“支持CarPlay+CarLife雙機互聯”這一類夾雜中文、英文和標點符號的詞語(短語)也能抽取出來。
【缺點】:與領域耦合過深,無法將建立的規則庫、專業詞庫以及模式庫遷移到其他領域中,需要根據領域內容重新搭建。甚至與特定類型、出版社、渠道的文章耦合過深,例如汽車之家的汽車文章和易車的汽車文章的格式就不同,需要為不同的數據源搭建相應的規則庫。一旦數據源的文章格式變動,規則庫也需要作相應的修改。無論是搭建還是后續的維護,都需要大量的人工成本。
基于統計的方法
基于統計的方法根據有無標注數據可分為有監督方法和無監督方法。
有監督方法
有監督方法利用標注語料,將新詞發現看作分類或者序列標注問題:
基于文本片段的某些統計量,以此作為特征訓練二分類模型; 基于序列信息進行序列標注直接得到新詞,或對得到的新詞再進行判定。
通常可以用 HMM、CRF、SVM 等機器學習算法實現。但是在實際應用中,獲取大量的標注語料數據是非常困難的一件事情,并且既然已經有了手工標注的數據,那么直接把標注得到的新詞加入到新詞詞庫就好了,又何必建模來解決呢?所以,探索無監督的挖掘方法在新詞發現領域中更有價值。
無監督方法
不依賴于任何已有的詞庫、分詞工具和標注語料,僅僅根據詞的共同特征,利用統計策略將一段大規模語料中可能成詞的文本片段全部提取出來,然后再利用語言知識排除不是新詞語的“無用片段”或者計算相關度,尋找相關度最大的字與字的組合。最后,把所有抽取得到的詞和已有的詞庫進行比較,就能得到新詞。
實際上,利用統計策略對語料進行切分,形成若干塊文本片段,這相當于一次粗淺的分詞。接下來,再對這些文本片段作一次清洗與過濾,余下的文本片段即可作為新詞詞庫。因此,上述過程可簡化為兩個步驟:
構建詞庫 新詞比對
目前已有的大多數基于統計的新詞發現方案和博客,其根本思想都是源于 matrix67 纂寫的《互聯網時代的社會語言學:基于SNS的文本數據挖掘》。下文所講的內容也未能跳離這個框架,只是在前人的基礎上增加了些許自身的理解與嘗試,以及努力嘗試將實現步驟呈現給讀者。
構建詞庫
怎么樣的文本片段才能作為一個詞語?或者說作為一個詞語的文本片段需要滿足什么條件 。
接下來,讓我們依次探討這三個條件對判斷成詞的作用與意義。
詞頻
首先,被選中的文本片段要在語料中出現多次,目的是為了排除偶然情況,例如筆誤的情況。因此,我們可以通過設置一個閾值,將頻數超過該閾值的文本片段提取出來,作為當前語料的詞匯輸出。
但光憑詞頻不足以判斷,一個經常出現的文本片段有可能不是一個詞,而是多個詞構成的詞組,例如“的電影”、“在北京”等詞組。這些詞組并不是我們想要的詞語,我們想要的是“電影院”之類的詞語。此時就需要凝聚程度來幫助我們作進一步的判斷。
凝聚程度
凝聚程度用以衡量相鄰字組合成詞語的程度,如果兩個人經常待在一起,我們往往會認為他們的關系很親密,而字與字之間的“親密關系”則通過凝聚程度(其他文獻中稱為“凝合程度”)來表示。
凝聚程度要如何進行計算呢?詞組的出現概率除以構成詞組的各個詞語的出現概率的乘積,最后對結果做一次對數處理(可以理解為對計算得到的概率值組了一次映射)。
PMI(x,y)=log?2p(x,y)p(x)p(y)P M I(x, y)=\log _{2} \frac{p(x, y)}{p(x) p(y)} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mord mathdefault" style="margin-right: 0.10903em;">M</span><span class="mord mathdefault" style="margin-right: 0.07847em;">I</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 2.363em; vertical-align: -0.936em;"></span><span class="mop"><span class="mop">lo<span style="margin-right: 0.01389em;">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.206968em;"><span class="" style="top: -2.45586em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.24414em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.427em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="mclose">)</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="mclose">)</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.936em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></p>
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)} \geq 1 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 2.363em; vertical-align: -0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.427em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="mclose">)</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="mclose">)</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.936em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">1</span></span></span></span></span></span></p>
對于 log 函數而言,真數 >= 1,函數值 >= 0,加上 log 函數相當于將原本的函數值映射到 [0, +∞] 區間,且增速放緩。
仍然以“的電影”和“電影院”為例。
電影:0.01,院:0.01,電影院:0.001
P(電影院)/P(電影)P(院):0.001 / (0.01 * 0.01) = 10
電影:0.01,的:0.2,的電影:0.002 P(的電影)/P(的)P(電影):0.002 / (0.01 * 0.2) = 1
上面的結果表明“電影院”更可能是一個有意義的搭配,而“的電影”則更像是“的”和“電影”這兩個成分偶然拼到一塊。
凝聚程度的計算方式很大程度上受到文本切分的影響,因此我將這部分的內容移到了文本切分部分。
自由程度
詞語作為漢語中的一個基本語義單元,具備一個顯著的特征——可以靈活地應用到不同的場景中。例如“機器學習”,上下文可以搭配很多動詞和名詞“學習人工智能知識”、“從事人工智能行業”。但對于“人工智”這個詞語來說,上文依然可以搭配很多詞語,下文卻基本上只能搭配“能”。那么,我們可以認為“人工智”不是一個完整的詞語。
換個角度來看,詞語的自由程度可以理解為詞語之間的相關性弱,換言之,詞語的獨立性高。蘇劍林大佬纂寫的《無監督構建詞庫:更快更好的新詞發現算法》 一文中提到:
為什么要分詞?人本來就是按照字來書寫和理解的呀?
當模型的記憶和擬合能力足夠強(或者簡單點,足夠智能)的時候,我們完全可以不用分詞的,直接基于字的模型就可以做,比如基于字的文本分類、問答系統等,早已有人在研究。但是,即便這些模型能夠成功,也會因為模型復雜而導致效率下降,因此,很多時候(尤其是生產環境中),我們會尋求更簡單、更高效的方案。
什么方案最高效?以文本分類為例,估計最簡單高效的方案就是“樸素貝葉斯分類器”了,類似的,比較現代的是 FastText,它可以看作是“樸素貝葉斯”的“神經網絡版”。要注意,樸素貝葉斯基于一個樸素的假設:特征之間相互獨立。這個假設越成立,樸素貝葉斯的效果就越好。然而,對于文本來說,顯然上下文緊密聯系,這個假設還成立嗎?
注意到,當特征之間明顯不獨立的時候,可以考慮將特征組合之后,使得特征之間的相關性減弱,再用樸素貝葉斯。比如,對于文本,如果以字為特征,則樸素假設顯然不成立,如“我喜歡數學”中的“喜”和“歡”、“數”和“學”都明顯相關,這時候我們考慮將特征進行組合,得到“我/喜歡/數學”,這樣三個片段之間的相關性就沒有那么強了,因此可以考慮用上述結果。
可以發現,這個過程很像分詞,或者反過來說,分詞的主要目的之一,就是將句子分為若干個相關性比較弱的部分,便于進一步處理。
知道了什么是自由程度,以及為什么自由程度可以作為新詞的評估指標,那么我們該如何計算當前文本片段的自由程度呢?簡單地講,如何衡量當前文本片段的上下文可搭配詞語的豐富程度呢?
matrix67 提出可以使用信息熵 來進行度量,令當前文本片段為 x,其上文的詞語為
yly_l</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.625em; vertical-align: -0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.336108em;"><span class="" style="top: -2.55em; margin-left: -0.03588em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right: 0.01968em;">l</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span>,下文的詞語為 <span class="katex--inline"><span class="katex"><span class="katex-mathml">yry_r</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.625em; vertical-align: -0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.151392em;"><span class="" style="top: -2.55em; margin-left: -0.03588em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right: 0.02778em;">r</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span>。<br> <span class="katex--display"><span class="katex-display"><span class="katex"><span class="katex-mathml">H(y∣x)=?∑yp(y∣x)logp(y∣x)H(y|x) = -\sum_y p(y|x)log p(y|x) </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord mathdefault" style="margin-right: 0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 2.43612em; vertical-align: -1.38611em;"></span><span class="mord">?</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.05001em;"><span class="" style="top: -1.89999em; margin-left: 0em;"><span class="pstrut" style="height: 3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right: 0.03588em;">y</span></span></span><span class="" style="top: -3.05001em;"><span class="pstrut" style="height: 3.05em;"></span><span class=""><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 1.38611em;"><span class=""></span></span></span></span></span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right: 0.03588em;">g</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mclose">)</span></span></span></span></span></span></p>
當前文本片段的上文和下文可搭配詞語越豐富,則其上文信息熵(左信息熵)和下文信息熵(右信息熵)越大。一般,我們取左右信息熵中的最小值。
當然我們也可以自行設計一個合理的統計量去度量自由程度。例如,綜合考慮文本片段左右信息熵(LE、RE)的大小、LE 與 RE 差的絕對值 (|LE - RE|)。
L(W)=log?LE?eRE+RE?eLE∣LE?RE∣L(W)=\log \frac{L E \cdot e^{R E}+R E \cdot e^{L E}}{|L E-R E|} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.13889em;">W</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 2.45433em; vertical-align: -0.936em;"></span><span class="mop">lo<span style="margin-right: 0.01389em;">g</span></span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.51833em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord">∣</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right: 0.05764em;">E</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">?</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord mathdefault" style="margin-right: 0.00773em;">R</span><span class="mord mathdefault" style="margin-right: 0.05764em;">E</span><span class="mord">∣</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right: 0.05764em;">E</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">?</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.841331em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right: 0.00773em;">R</span><span class="mord mathdefault mtight" style="margin-right: 0.05764em;">E</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord mathdefault" style="margin-right: 0.00773em;">R</span><span class="mord mathdefault" style="margin-right: 0.05764em;">E</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">?</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.841331em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight" style="margin-right: 0.05764em;">E</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.936em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></p>
從執行流程上來看,自由程度的閾值計算相當于對上一步凝聚程度所得的詞表進行了一次過濾,從中剔除不滿足自由程度要求的詞語。
語義完整
語義完整是我在閱讀《Automated Phrase Mining from Massive Text Corpora》這篇論文時得到的靈感。一個詞語的語義應該是完整的,例如“電影院”。而不應該像“的電影”,語義是欠缺的。
那么如何去判斷一個文本片段的語義是否完整呢?初步的想法:依據詞性標注,判斷構成文本片段的各子文本片段的詞性,例如“前麥弗遜式獨立懸架”,經過詞性標注后的結果 [('前', 'f'), ('麥弗遜式', 'n'), ('獨立', 'v'), ('懸架', 'n')],構成偏正結構,因此我們可認為具有完整的語義信息。
再舉個反例,例如“前麥弗遜式獨立懸架驅”,其詞性標注結果 [('前', 'f'), ('麥弗遜式', 'n'), ('獨立', 'ad'), ('懸架', 'v'), ('驅', 'v')],最后一個“驅”字為動詞 v,那么這個詞語不具備完整的語義,因此我們可以認為“前麥弗遜式獨立懸架驅”不應該作為一個詞語。
然而語義完整很難在實際中進行運用,例如“人艱不拆”,其詞性標注 [('人', 'n'), ('艱', 'a'), ('不', 'd'), ('拆', 'v')],如果按照“前麥弗遜式獨立懸架驅”的判斷標準,那么“人艱不拆”不應該作為一個詞語。因此,語義完整的判斷標準該如何設置,以及在評判標準中的定位都是一個值得商榷的問題。
缺點:限于查找較短的新詞語,但不便于描述詞語的內部和外部結構特征,同時對于出現頻率很低的新詞識別效果不好。
文本切分
文本切分主要有兩種處理方式:合詞與切分。接下來我會詳細地介紹這兩種處理方式的執行過程。
合詞
從左到右依次計算相鄰文本片段的凝聚程度,若達到設定的閾值,則將這兩段文本片段整合為一塊新的文本片段,然后繼續去計算該整合后的文本片段與下一段相鄰文本片段的凝聚程度。不斷循環,直到無文本片段。
【處理過程】:以“巧克力”為例。
首先,計算“巧克”的凝聚程度,若超過閾值,則將其合并; 然后計算“巧克”與“力”的凝聚程度,若超過閾值,則將其合并,得到“巧克力”。
【問題 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)作為凝聚程度的計算公式(參考自"新詞發現"算法探討與優化-SmoothNLP)。
AMI(X,y)=1nlog2p(X,y)p(x1)?p(xn)p(y)AMI(X, y) = \frac{1}{n} log_2 \frac{p(X, y)}{p(x_1) \cdots p(x_n)p(y)} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right: 0.10903em;">M</span><span class="mord mathdefault" style="margin-right: 0.07847em;">I</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 2.363em; vertical-align: -0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.32144em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault">n</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.686em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathdefault" style="margin-right: 0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.03588em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.427em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="minner">?</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.151392em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="mclose">)</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.03588em;">y</span><span class="mclose">)</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.936em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span><br> 其中 n 表示文本片段的個數,例如“巧克力”和“的”,其中“巧克力”由三個文本片段組成,因此 n = 4。<br> <span class="katex--display"><span class="katex-display"><span class="katex"><span class="katex-mathml">AMI(巧克力,的)=14log2p(巧克力的)p(巧)p(克)p(力)p(的)AMI(\text{巧克力}, \text{的}) = \frac{1}{4} log_2 \frac{p(\text{巧克力的})}{p(\text{巧})p(\text{克})p(\text{力})p(\text{的})} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right: 0.10903em;">M</span><span class="mord mathdefault" style="margin-right: 0.07847em;">I</span><span class="mopen">(</span><span class="mord text"><span class="mord cjk_fallback">巧克力</span></span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord text"><span class="mord cjk_fallback">的</span></span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 2.363em; vertical-align: -0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.32144em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord">4</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.686em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathdefault" style="margin-right: 0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.03588em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.427em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord text"><span class="mord cjk_fallback">巧</span></span><span class="mclose">)</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord text"><span class="mord cjk_fallback">克</span></span><span class="mclose">)</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord text"><span class="mord cjk_fallback">力</span></span><span class="mclose">)</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord text"><span class="mord cjk_fallback">的</span></span><span class="mclose">)</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord text"><span class="mord cjk_fallback">巧克力的</span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.936em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></p>
實際上
1n\frac{1}{n}</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1.19011em; vertical-align: -0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.845108em;"><span class="" style="top: -2.655em;"><span class="pstrut" style="height: 3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.394em;"><span class="pstrut" style="height: 3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.345em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span> 可視為對文本片段長度的一個懲罰系數,而這懲罰系數我們可以視情況自行設定。</p>
切詞
從左到右依次計算相鄰文本片段的凝聚程度(與合詞不同,每次只計算相鄰兩個文本片段的凝聚程度),若未達到設定的閾值,則將這兩段文本片段進行切分。不斷循環,直到無文本片段。
【處理過程】:以“巧克力真好吃”為例。
首先,計算“巧克”的凝聚程度,若超過閾值,則繼續計算“克力”的凝聚程度,若仍然超過閾值,則繼續計算下一對文本片段“力真”的凝聚程度; 若“力真”的凝聚程度小于閾值,則進行切分“力|真”,繼續計算下一對文本片段; 最終可得“巧克力|真|好吃”。
合詞、切詞與凝聚程度
【合詞與切詞的比較】:
合詞需要更多的統計信息,而切詞僅需要 2-gram 的統計信息(計算相鄰兩個文本片段的凝聚程度)即可,因此切詞的執行開銷要遠小于合詞; 合詞的過程中會遇到合詞 中提到的問題2,而切詞不會出現該問題;
切詞的缺陷
切詞忽略了更多的上下文信息,因為切詞僅考慮相鄰兩個文本片段,例如對于“電影院”,切詞只會計算“電”和“影”、“影”和“院”之間的凝聚程度。我們都知道 P(影) >= P(電影),P(影院) ≈ P(電影院),那么計算得到的凝聚程度,PMI(電影,院) > PMI(影,院)。對于一些三字以上且包含常用字的詞語,通過切詞的方式往往會被“一刀兩斷”。
“電”、“影”、“院”三位好朋友手拉手,“電”小朋友是一位交際花,她有許多的朋友,而人的精力總是有限的,因此“電”小朋友和“影”小朋友的玩耍時間遠沒有“影”小朋友和“院”小朋友來得多。但我們沒有因為“電”的朋友多且和“影”一起玩耍的時間少,而認為他們倆不是朋友。因此,僅考慮相鄰文本片段的切詞過程計算得到的是“封閉程度”,而非凝聚程度。例如,“饕餮”、“沆瀣”等詞,他們只擁有彼此。
針對這個問題,蘇劍林大佬提出了改進,在文章《無監督構建詞庫:更快更好的新詞發現算法》中提出了多字的凝聚程度計算方式。以下是文章中的原文:
文章《【中文分詞系列】 2. 基于切分的新詞發現》其實就是這個意思,只是那里認為,文本的相關性僅由相鄰兩字(2grams)來決定,這在很多時候都是不合理的,比如“林心如”中的“心如”、“共和國”中的“和國”,凝固度(相關性)都不是很強,容易錯切。
因此,本文就是在前文的基礎上改進,那里只考慮了相鄰字的凝固度,這里同時考慮多字的內部的凝固度(ngrams),比如,定義三字的字符串內部凝固度為:
min?{P(abc)P(ab)P(c),P(abc)P(a)P(bc)}\min \left\{\frac{P(a b c)}{P(a b) P(c)}, \frac{P(a b c)}{P(a) P(b c)}\right\} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 2.40003em; vertical-align: -0.95003em;"></span><span class="mop">min</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="minner"><span class="mopen delimcenter" style="top: 0em;"><span class="delimsizing size3">{<!-- --></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.427em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mord mathdefault">b</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">c</span><span class="mclose">)</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mord mathdefault">b</span><span class="mord mathdefault">c</span><span class="mclose">)</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.936em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.427em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">b</span><span class="mord mathdefault">c</span><span class="mclose">)</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mord mathdefault">b</span><span class="mord mathdefault">c</span><span class="mclose">)</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.936em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top: 0em;"><span class="delimsizing size3">}</span></span></span></span></span></span></span></span></p>
如果按照這一種思路來做的話,切詞方式所帶來的實現與執行上的優勢(不需要獲取更多的統計信息 n-gram)將蕩然無存。蘇劍林大佬之所以選用這種方式,是因為他只采用了凝聚程度和詞頻作為新詞的判斷依據。為什么不加上自由程度呢?因為自由程度的計算時間要遠大于凝聚程度。在上文的自由程度 中也提到,自由程度在流程上的主要貢獻在于對凝聚程度所得到的詞表進行過濾,至于需不需要耗費大量的時間去做這一層過濾,則需要視情況而定,這大概也是蘇劍林大佬放棄使用自有程度的原因之一吧。
并且按照上述方法來做,仍然不能解決兩字詞語存在的切分問題,對于一些頻數較高的字,例如“在”、“利”等,我們在計算其組合(“現在”、“利益”)的凝聚程度時,所得到的凝聚程度往往較低,容易被切分成單字。
【示例】:以“利率”為例,在所有語料中“利率”出現的次數不會太多,同時“率”的出現次數略高于“利率”,那么在凝聚程度的計算公式中,“利”的出現次數對最終凝聚程度起到關鍵作用。但像“利”這一類高頻字,會使得計算得到的凝聚程度較小,低于設定的閾值,從而使得“利率”這一類的詞被切分。
那么如何去解決這一類的切分問題呢?
切分問題的一些方案
針對上一小節提到的切分問題,我針對目前已有的工作提出了兩個思路:
調整凝聚程度計算公式
切分問題的實質在于高頻字對成詞的影響,那么我們適當調低高頻字對成詞的影響,或提高共現頻率在計算公式中的比重。
【簡單的實現方式】:
PMI(A,B)=log2αP(AB)β1P(A)?β2P(B)PMI(A, B) = log_2\frac{\alpha P(AB)}{\beta_1 P(A) * \beta_2 P(B)} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mord mathdefault" style="margin-right: 0.10903em;">M</span><span class="mord mathdefault" style="margin-right: 0.07847em;">I</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 2.363em; vertical-align: -0.936em;"></span><span class="mord mathdefault" style="margin-right: 0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.03588em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.427em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right: 0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.05278em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">?</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.05278em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.0037em;">α</span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.936em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span><br> <span class="katex--inline"><span class="katex"><span class="katex-mathml">α\alpha</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.43056em; vertical-align: 0em;"></span><span class="mord mathdefault" style="margin-right: 0.0037em;">α</span></span></span></span></span> 用以提高 A、B 共現頻率的權重,而 <span class="katex--inline"><span class="katex"><span class="katex-mathml">β1\beta_1</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.88888em; vertical-align: -0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.05278em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span> 和 <span class="katex--inline"><span class="katex"><span class="katex-mathml">β2\beta_2</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.88888em; vertical-align: -0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.05278em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span> 則可視為對高頻字的懲罰系數。</p>
如果
α\alpha</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.43056em; vertical-align: 0em;"></span><span class="mord mathdefault" style="margin-right: 0.0037em;">α</span></span></span></span></span> 和 <span class="katex--inline"><span class="katex"><span class="katex-mathml">β\beta</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.88888em; vertical-align: -0.19444em;"></span><span class="mord mathdefault" style="margin-right: 0.05278em;">β</span></span></span></span></span> 是一個固定的數值,且 <span class="katex--inline"><span class="katex"><span class="katex-mathml">β1\beta_1</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.88888em; vertical-align: -0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.05278em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span> = <span class="katex--inline"><span class="katex"><span class="katex-mathml">β2\beta_2</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.88888em; vertical-align: -0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.05278em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span>,相當于在原式上乘上了一個固定的系數 <span class="katex--inline"><span class="katex"><span class="katex-mathml">γ\gamma</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.625em; vertical-align: -0.19444em;"></span><span class="mord mathdefault" style="margin-right: 0.05556em;">γ</span></span></span></span></span>,起到的作用并不大,完全可有通過調整凝聚程度的閾值(除以 <span class="katex--inline"><span class="katex"><span class="katex-mathml">γ\gamma</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.625em; vertical-align: -0.19444em;"></span><span class="mord mathdefault" style="margin-right: 0.05556em;">γ</span></span></span></span></span>)來起到相應的作用。因此,我認為線性地改變原式并不能起到改進作用。但它提供了兩種可行的改進方向:</p>
非線性地增大共現頻率的權重; 非線性地降低高頻字的權重。
非線性地增大共現頻率的權重
為了加大共現頻率的權重,我們可以在原式的基礎上再乘上共現頻率:
PMI(A,B)′=P(A,B)log2P(A,B)P(A)P(B)PMI(A, B)' = P(A, B) log_2 \frac{P(A, B)}{P(A) P(B)} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1.05189em; vertical-align: -0.25em;"></span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mord mathdefault" style="margin-right: 0.10903em;">M</span><span class="mord mathdefault" style="margin-right: 0.07847em;">I</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.801892em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 2.363em; vertical-align: -0.936em;"></span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.03588em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.427em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.936em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></p>
上式實際上就是互信息的計算公式,此時 P(A)、P(B) 和 P(AB) 都是固定的值,我們可以通過給 P(AB) 加上未知的系數,使其轉變為變量。
AB=αP(AB)AB = \alpha P(AB) </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.68333em; vertical-align: 0em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord mathdefault" style="margin-right: 0.0037em;">α</span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span></span></span></span></span></span></p>
這樣我們就可以將原式視作共現頻率 P(AB) 的一個函數。
f(AB)=log2αP(A,B)P(A)P(B)f(AB) = log_2 \frac{\alpha P(A, B)}{P(A) P(B)} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 2.363em; vertical-align: -0.936em;"></span><span class="mord mathdefault" style="margin-right: 0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.03588em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.427em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.0037em;">α</span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.936em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></p>
最終轉變為:
PMI(A,B)′=ABf(AB)PMI(A, B)' = AB f(AB) </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1.05189em; vertical-align: -0.25em;"></span><span class="mord mathdefault" style="margin-right: 0.13889em;">P</span><span class="mord mathdefault" style="margin-right: 0.10903em;">M</span><span class="mord mathdefault" style="margin-right: 0.07847em;">I</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.801892em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span></span></span></span></span></span></p>
f(AB) 可理解為共現頻率的非線性權重系數,上述式子對實際的計算沒有作用,提供了另一種角度的解釋。
【互信息計算公式效果】:
【原式效果】:
可以看到乘上共現頻率的效果并不如原始的效果,這有兩方面的原因:
乘上共現頻率后的凝聚程度閾值需要相應地調低,但共現頻率的波動較大,如何設置凝聚程度閾值是一個問題; 馬太效應:較大的共現頻率可以得到更高的凝聚程度,而較低的共現頻率則得到更低的凝聚程度,這顯然不是我們想看到的。
此時,我們亦然陷入一個誤區:單純地提高共現頻率對結果不一定能起到正向作用,或者說依靠固定值或共現頻率去提高共現頻率的權重不是一個好辦法。
單純提高共現頻率的權重,這可能會幫助我們解決“利|益”的切分問題,但同時也會導致“美麗”和“的”組合成“美麗的”。當然,并非說這條路走不通,而是需要借助更多的信息,在共現頻率權重的計算過程中引入其他的統計信息。
非線性地降低高頻字的權重
一種簡單的實現方式:比較 P(A) 和 P(B) 的大小,若 P(A) > P(B),那么
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.88888em; vertical-align: -0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.05278em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span> < <span class="katex--inline"><span class="katex"><span class="katex-mathml"></span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.88888em; vertical-align: -0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.05278em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">?</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span>。目的在于非線性地降低高頻字在式子中的權重。通過這種方式,我們可以適當提高“現在”、“利益”等詞的凝聚程度,但同時也會提高“漂亮的”、“美麗的”這些詞語的凝聚程度。簡單地說,我們不想降低“的”、“了”、“呢”這些高頻字的權重,為了方便后續的說明,特將這些字命名為“停用字”。</p>
對于這種情況,我們可以按字的頻數取 topK,然后對這些字的頻率加大懲罰。
下面是從汽車領域的 80w 文章中統計的 top 100 字頻率。取語料中統計得到的 topk 能夠更準確地反映領域的特點,但很顯然“車”、“型”這些字是我們需要的。
在實際處理過程中,通用領域的“停用字”也往往是特定領域的“停用字”,因此我們直接使用通用領域的“停用字”即可,例如找一份停用詞表,從中將單字抽取出來。
'嗬', '嗯', '噯', '嘎', '噓', '嘛', '嘻', '嘿', ......
依據自由程度進行擴展
思路:依據凝聚程度得到的“候選詞”的自由程度來將相鄰的“候選詞”重新進行組合。
【具體步驟】:
若切分后的文本片段自由程度小于設定閾值,則嘗試將當前文本片段與相鄰文本片段進行組合; 計算組合后的文本片段的自由程度,若自由程度提高則繼續組合相鄰的文本片段; 若連續組合之后的文本片段的自由程度高于設定閾值,則將這段文本片段作為新的詞語,否則出局。
【問題 1】:連續組合相鄰文本片段會導致最終得到一個超長的詞語嗎?
【回答 1】:不會,當超過某個臨界點時(n = 4),字數越長的文本片段其自由程度越低。因為 n-gram 中的 n 越大,得到的文本的頻數越低,因此其相鄰詞語的數量也越少,信息熵越來越低,低于設定的閾值。
【注意】:“利”的左信息熵不能作為“利率”的左信息熵,換言之,“利”的左鄰詞語不能作為“利率”的左鄰詞語,必須要“利”和“率”共有的左鄰才能作為“利率”的左鄰詞語。右信息熵同理。
執行過程
首先將文本拆分為文本片段(字符、英文單詞等); 基于凝聚程度和切詞方式對文本進行切分,獲得一個粗的詞庫,同時也對文本做了一次粗的分詞; 基于自由程度從上一步的到得詞庫中篩選出詞語;
告一段落
新詞發現還有許多的工作可以去嘗試:
嘗試從文本中挖掘更多的統計量,而非僅僅局限于頻數和頻率; 如何去設計一套無監督的評估指標也是非常有挑戰的工作; 全文主要講述切詞的工作,關于合詞也有不少可探索的工作。
參考
新詞發現:中文新詞識別技術簡介:https://blog.csdn.net/sinat_33741547/article/details/81704798 互聯網時代的社會語言學:基于 SNS 的文本數據挖掘:http://www.matrix67.com/blog/archives/5044 "新詞發現"算法探討與優化-SmoothNLP:https://zhuanlan.zhihu.com/p/80385615 無監督構建詞庫:更快更好的新詞發現算法:https://zhuanlan.zhihu=
創作挑戰賽 新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔 為你收集整理的新词发现简介 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。