中文分詞的python實現-基於FMM演算法
阿新 • • 發佈:2019-02-10
正向最大匹配演算法(FMM)
正向最大匹配演算法(FMM)是一種基於詞典的分詞方法,思想很簡單就是從左向右掃描尋找詞的最大匹配,比如詞典中同時含有“釣魚”和“釣魚島”,那“釣魚島屬於中國”就會被分詞成“釣魚島/屬於/中國”
過程
- 限定詞的最大長度(例如5)
- 從最大的長度開始在詞庫中進行匹配,直到匹配成功
- 更新起點的位置繼續上一步驟直到全部完成
實驗
程式碼
# -*- coding: utf-8 -*-
# 中文正向最大匹配(FMM)分詞
import sys
reload(sys) #動態重新載入sys模組
sys.setdefaultencoding('utf8' )
word_dict = ['新華網', '東京', '記者', '吳谷豐', '日本共同社', '28', '報道']
test_str = ' 新華網東京電記者吳谷豐據日本共同社28日報道'
# 獲取分詞
def getSeg(text):
if not text:
return ''
if len(text) == 1:
return text
if text in word_dict:
return text
else:
small = len(text) - 1
text = text[0 :small]
return getSeg(text)
def main():
global test_str
test_str = test_str.decode('utf8').strip()
max_len = 5 # 正向最大匹配分詞測試,最大長度5
result_str = '' # 儲存要輸出的分詞結果
result_len = 0
print 'input :', test_str
while test_str:
tmp_str = test_str[0:max_len]
seg_str = getSeg(tmp_str)
seg_len = len(seg_str)
result_len = result_len + seg_len
if seg_str.strip():
result_str = result_str + seg_str + ' / '
test_str = test_str[seg_len:]
print 'output :', result_str
if __name__ == '__main__':
main()
結果
input : 新華網東京電記者吳谷豐據日本共同社28日報道
output : 新華網 / 東京 / 電 / 記者 / 吳谷豐 / 據 / 日本共同社 / 28 / 日 / 報道 /
分詞詞典可以自定義或者從此網頁下載,然後將word_dict程式碼更換成下面這行
word_dict = [line.strip() for line in open('dict.txt')]