資料探勘入門 分詞

2021-06-25 19:54:15 字數 2973 閱讀 5535

隨著社會化資料大量產生,硬體速度上公升、成本降低,大資料技術的落地實現,資料這座金山已浮出水面。這裡,嚴瀾將帶我們逐漸開啟這座金山——從「分詞」開始挖掘資料。

1. 基於詞典的分詞,需要先預設乙個分詞詞典,比如上面句子切分出來的「假如、上午」這些詞先存放在詞典,然後把句子切分成單字組合成詞語去詞典裡查詢,匹配上了就挑選出來乙個詞。沒有匹配上的就切分成單字。

2. 基於統計的分詞,需要先獲取大量的文字語料庫(比如新聞、微博等),然後統計文字裡相鄰的字同時出現的次數,次數越多就越可能構成乙個詞。當達到一定次數時就構成了乙個詞,即可形成語料概率庫。再對上面句子進行單字切分,把字與字結合後在語料概率庫里查詢對應的概率,如果概率大於一定值就挑選出來形成乙個詞。這個是大概描述,實際生產環境中還需要對句子的上下文進行結合才能更準確的分詞。

3. 基於語義的分詞,簡而言之就是模擬人類對句子的理解來進行分詞。需要先整理出中文語句的句法、語義資訊作為知識庫,然後結合句子的上下文,對句子進行單字切分後組合成詞逐個帶入知識庫進行識別,識別出來就挑選出乙個詞。目前還沒有特別成熟的基於語義的分詞系統。

基於詞典的分詞

為了讓大家快速的了解分詞技術,我們採用第乙個方式來做測試:基於詞典的分詞,這種方式簡單暴力可以解決百分之七八十的問題。基於詞典的分詞大概分為以下幾種方式:

1. 正向最大匹配

,沿著我們看到的句子逐字拆分後組合成詞語到詞典裡去匹配,直到匹配不到詞語為止。舉個實際的例子:「人民大會堂真雄偉」,我們先拆分為單字「人」去詞典裡去查詢,發現有「人」這個詞,繼續組合句子裡的單字組合「人民」去詞典裡查詢,發現有「人民」這個詞,以此類推發現到「人民大會堂」,然後會結合「人民大會堂真」去詞典裡查詢沒有找到這個詞,第乙個詞「人民大會堂」查詢結束。最終分詞的結果為:「人民大會堂/真/雄偉」。如下圖演示了用正向最大匹配演算法識別人民大會堂的過程,「真」,「雄偉」的識別類似。

2. 逆向最大匹配,這個和上面相反,就是倒著推理。比如「沿海南方向」,我們按正向最大匹配來做就會切分成 「沿海/南方/向」,這樣就明顯不對。採用逆向最大匹配法則來解決這個問題,從句子的最後取得「方向」這兩個字查詢詞典找到「方向」這個詞。再加上「南方向」組成三字組合查詢詞典沒有這個詞,查詢結束,找到「方向」這個詞。以此類推,最終分出「沿/海南/方向」。

3. 雙向最大匹配,顧名思義就是結合正向最大匹配和逆向最大匹配,最終取其中合理的結果。最早由哈工大王曉龍博士理論化的取最小切分詞數,比如「我在中華人民共和國家的院子裡看書」,正向最大匹配切分出來為「我/在/中華人民共和國/家/的/院子/裡/看書」工8個詞語,逆向最大匹配切分出來為「我/在/中華/人民/共/和/國家/的/院子/裡/看書」共11個詞語。取正向最大匹配切出來的結果就是正確的。但是如果把上面那個例子「沿海南方向」雙向切分,都是3個詞語,改如何選擇?看第4個《最佳匹配法則》。

4. 最佳匹配法則,先準備一堆文字語料庫、乙個詞庫,統計詞庫里的每乙個詞在語料庫裡出現的次數記錄下來。最後按照詞頻高的優先選出,比如「沿海南方向」,正向切分為:「沿海/南方/向」,逆向切分為:「沿/海南/方向」。其中「海南」的頻度最高,優先取出來。剩下「沿」、「方向」也就正常切分了。是不是這就是基於詞典分詞的最佳方案?比如數學之美中提到的:「把手抬起來」 和 「這扇門的把手」,可以分為「把」、「手」、「把手」,不管怎麼分總有一句話的意思不對。後續再介紹如何通過統計的分詞處理這些問題。

說了這麼多,我們來實戰一下如何基於詞典的分詞:

public class testpositivematch 

i++;

}if (!matchword.isempty()) else

matchword = "";}}

}

輸出結果為:我愛這個中華人民共和國大家庭  

按照這樣我們乙個基本的分詞程式開發完成。

對於文章一開始提到的問題還沒解決,如何讓程式識別文字中的感**彩。現在我們先要構建乙個感**彩詞庫「高興」,修飾詞庫「沒」、"不」。再完善一下我們的程式:

public class testsentimentpositivematch 

if (decorativedict.contains(keytmp))

i++;

}if (!matchsentimentword.isempty())

if (!matchdecorativeword.isempty()) else

matchsentimentword = "";

matchdecorativeword = "";

}double totalscore = 1;

for (string decorativeword : decorativewordlist)

system.out.print("\r\n");

if (totalscore > 0) else }}

機器再也不是冷冰冰的,看起來他能讀懂你的意思了。不過這只是乙個開始,丟擲幾個問題:

如何讓程式識別句子中的時間?比如「上午」、「下午2點」。

如何處理「把手抬起來」 和 「這扇門的把手」中的「把」與「手」的問題?

如何構建海量的知識庫,讓程式從「嬰兒」變成「成年人」?

如何使用有限的儲存空間儲存海量的知識庫?

如何提高程式在海量知識庫中查詢定位資訊的效率?

如何識別新詞、人名、新鮮事物等未知領域?

宇宙芸芸眾生都是相通的,大腦也許就是乙個小宇宙,在這個小宇宙又有很多星球、住著很多生物。而電腦也是宇宙中地球上的乙個產物,只要儲存計算速度發展到足夠強大一定可以構建成乙個強大的大腦。

你看這個單詞 "testaword" 認識嗎?可能不認識,因為我們五官先獲取到的資訊,然後根據大腦以往學習的經驗做出判斷。但是你看這個短語 " test a word" 認識嗎?再看看開始那個單詞「testaword」是不是就親切多了?   

to be continued……

資料探勘 分詞入門

1 基於詞典的分詞,需要先預設乙個分詞詞典,比如上面句子切分出來的 假如 上午 這些詞先存放在詞典,然後把句子切分成單字組合成詞語去詞典裡查詢,匹配上了就挑選出來乙個詞。沒有匹配上的就切分成單字。2 基於統計的分詞,需要先獲取大量的文字語料庫 比如新聞 微博等 然後統計文字裡相鄰的字同時出現的次數,...

Python資料探勘 中文分詞

將乙個漢字序列切分成乙個乙個單獨的詞 安裝分詞模組 pip install jieba 分詞在特殊場合的實用性,呼叫add word 把我們要新增的分詞加入jieba詞庫 高效方法 將txt儲存的詞庫一次性匯入使用者詞庫中 import jieba jieba.load userdict d pyt...

資料探勘入門

性挖掘 對當前資料進行推斷,以做出 主要包括分類 回歸。分類 將樣本劃分到幾個預定義類,屬於離散。回歸 將樣本對映到乙個真實值 變數上,連續值。描述資料 描述資料庫中資料的一般性質。聚類 將樣本劃分為不同類 無預定義類 關聯規則發現 發現資料集中相關性。聚類分析,在發現緊密相關的觀測值組群,可以在沒...