在機器學習中,序列標註(sequence labeling)是一種常見的模式識別任務,它用來給一組可觀察物件打上狀態(類別)標籤。它可以解決nlp中的分詞(word segement)、詞性標註(part-of-speech tagging)、命名實體識別(named entity recognition )等問題。常見的概率統計模型有:hmm、memm、crf。
下面介紹利用最大熵統計演算法進行分詞的步驟。
這裡利用的是sighan提供的backoff 2005語料,將熟語料轉換成工具包所需格式,即4-tag(bmes)格式。可參考52nlp**的python**。
工具包的example目錄自帶了乙個python訓練工具。執行:
./postrainer.py tagger.model -f train.data --iters 100
(注意迭代次數iters前面是兩個-號)。
利用上步得到的tagger.model執行分詞。首先,準備所需語料,把生語料進行原子切分,如:「揚帆遠東做與中國合作的先行」切分成「揚 帆 遠 東 做 與 中 國 合 作 的 先 行」。執行最大熵標註指令碼即可得到字標註結果,得到的格式如下:「揚/b 帆/m 遠/m 東/m 做/e 與/s 中/b 國/e 合/b 作/e 的/s 先/b 行/e 「,最後利用python程式合併成分詞結果檔案,如:「揚帆遠東做 與 中國 合作 的 先行」。
利用backoff2005的測試指令碼來測分詞的效果:
=== summary:
=== total insertions: 5456
=== total deletions: 4439
=== total substitutions: 12205
=== total nchange: 22100
=== total true word count: 106873
=== total test word count: 107890
=== total true words recall: 0.844
=== total test words precision: 0.836
=== f measure: 0.840
=== oov rate: 0.026
=== oov recall rate: 0.565
=== iv recall rate: 0.852
可以看到召回率是84.4%,準確率是83.6%,不是很高,這和語料規模有關。
詳情可參考52nlp的**文章,在character_2_word.py第16行增加if(len(line.strip())>0):判斷,防止最終分詞結果出現空行,否則這樣score打分指令碼會報錯。
def character_tagging(input_file, output_file):
input_data = codecs.open(input_file, 'r', 'utf-8')
output_data = codecs.open(output_file, 'w', 'utf-8')
for line in input_data.readlines():
word_list = line.strip().split()
for word in word_list:
if len(word) == 1:
output_data.write(word + "\ts\n")
else:
output_data.write(word[0] + "\tb\n")
for w in word[1:len(word)-1]:
output_data.write(w + "\tm\n")
output_data.write(word[len(word)-1] + "\te\n")
output_data.write("\n")
input_data.close()
output_data.close()
Ubuntu下最大熵實現中文分詞
最大熵模型實現中文分詞 一 實驗環境 1.1ubuntu 16.4 lts linux 1.2python2 本實驗完全在linux環境 ubuntu 64位 下使用python指令碼和命令列實現 實驗結果輸入文字。二 實驗材料 2.1語料庫 本實驗採用sighan提供的backoff2005語料進...
使用Spark框架中文分詞統計
curl i 認知商業需要認知技術 pattern ws format plain 建立streaming上下文,使用2個執行緒,流處理時間視窗1秒 vallines ssc.sockettextstream localhost 9999 將行拆分成單詞 valwords lines.flatmap...
使用Spark框架中文分詞統計
curl i 認知商業需要認知技術 pattern ws format plain 建立streaming上下文,使用2個執行緒,流處理時間視窗1秒 vallines ssc.sockettextstream localhost 9999 將行拆分成單詞 valwords lines.flatmap...