統計中文分詞(最大熵)

2021-07-11 01:30:36 字數 2001 閱讀 7047

在機器學習中,序列標註(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...