1. 程式人生 > >自然語言處理之_SentencePiece分詞

自然語言處理之_SentencePiece分詞

1、 說明

 SentencePiece是一個google開源的自然語言處理工具包。網上是這麼描述它的:資料驅動、跨語言、高效能、輕量級——面向神經網路文字生成系統的無監督文字詞條化工具。

 那麼它究竟是幹什麼的呢?先舉個例子:假設在資料探勘時,有一列特徵T是文字描述,我們需要將其轉成列舉型,或者多個布林型代入模型,即:需要從文字中提供資訊構造新特徵。

 首先,我們可以用標點將長句長分成短句,以短句作為關鍵詞,看每個例項的特徵T中是否包含該關鍵詞,從而構造新的布林型特徵。但有時候表達同一個意思所使用的文字並不完全一致,比如“買三送一”和“買三送一啦!”是一個意思。

 此時,我們可以用SnowNLP或者jieba分詞把描述拆成單個詞,看T是否包括該關鍵詞。但這樣用也有一個問題:可能把一個意思拆成了多個特徵,比如“袖子較短,領子較大”被拆成了四個獨立的特徵“袖子”“較短”“領子”“較大”,組合效果沒有了。

 我們想要的效果是:如果“袖子較短”這個組合經常出現,就把它當成一個詞處理。jieba中可以用自定義詞典的方式加入已知的詞。

 還有一些組合常常出現,但事先並不知道,於是我們想讓機器自動學習經常組合出現的短語和詞。SentencePiece就是來解決這個問題的。它需要大量文字來訓練。

 SentencePiece的用途不限於自然語言處理,記得DC之前有一個藥物分子篩選的比賽,蛋白質的一級結構是氨基酸序列,需要研究氨基酸序列片斷,片斷的長度又是不固定的,此處就可以用SentencePiece進行切分。原理是重複出現次數多的片斷,就認為是一個意群(詞)。

2、 安裝

 SentencePiece分為兩部分:訓練模型和使用模型,訓練模型部分是用C語言實現的,可編成二程序程式執行,訓練結果是生成一個model和一個詞典檔案。

 模型使用部分同時支援二進位制程式和Python呼叫兩種方式,訓練完生成的詞典資料是明文,可編輯,因此也可以用任何語言讀取和使用。

1) 在Ubuntu系統中安裝Python支援

$ sudo pip install SentencePiece

2) 下載原始碼

$ git clone https://github.com/google/sentencepiece
$ cd sentencepiece
$ ./autogen.sh
$ ./confiture; make; sudo make install # 注意需要先安裝autogen,automake等編譯工具

3、 訓練模型

$ spm_train --input=/tmp/a
.txt --model_prefix=/tmp/test # --input指定需要訓練的文字檔案,--model_prefix指定訓練好的模型名,本例中生成/tmp/test.model和/tmp/test.vocab兩個檔案,vocab是詞典資訊。

4、 使用模型

(1) 命令列呼叫

$ echo "食材上不會有這樣的糾結" | spm_encode --model=/tmp/test.model

(2) Python程式呼叫

import sentencepiece as spm

sp = spm.SentencePieceProcessor()
text = "食材上不會有這樣的糾結" 

sp.Load("/tmp/test.model") 
print(sp.EncodeAsPieces(text))

5、 使用技巧

 如果我們分析某個領域相關問題,可以用該領域的書籍和文件去訓練模型。並不限於被分析的內容本身。訓練資料越多,模型效果越好。更多引數及用法,請見git上的說明檔案。

6、 參考

(1) 用法示例

(2) 訓練示例