目錄
- 語料庫
- 中文分詞
- 基於規則的中文分詞:最大匹配法
- 正向最大匹配法
- 逆向最大匹配法
- 雙向最大匹配法
- 基於規則的中文分詞:最大匹配法
- 分詞
- jieba
- HMM模型 Hidden Markov Model
- jieba
- 詞頻統計
語料庫
存放語言真實使用場景、且經過加工的例句,而非脫離具體場景的標準例句。
國家語委現代漢語語料庫:http://corpus.zhonghuayuwen.org
美國國家語料庫:http://www.anc.org
清華大學開放中文詞庫:http://thuocl.thunlp.org
NLPIR-ICTCLAS漢語分詞系統:http://ictclas.nlpir.org
中文分詞
基於規則的中文分詞:最大匹配法
最大匹配法方法簡單,速度快,分詞效果可以滿足基本需求,但嚴重依賴詞典,無法很好處理分詞歧義和未登入詞。
正向最大匹配法
對句子從左到右選擇詞典中最長的詞條進行匹配。
統計分詞詞典,確定詞典中最長詞條的長度m
從左到右取待切分語句的m個字元作為匹配字典,查詢詞典,若匹配成功,則作為一個切分後的詞語,否則去掉待匹配衣
#定義匹配詞典
dictA=['南京市','南京市長','長江大橋','大橋']
# 確定詞典中最長詞條的字元m
maxDictA=max([ len(word) for word in dictA])
sentence="南京市長江大橋"
def cutA(sentence):
result=[]
sentenceLen=len(sentence)
n=0
while n<sentenceLen:
matched=0
# i倒序
for i in range(maxDictA,0,-1):
piece=sentence[n:n+i]
if piece in dictA:
result.append(piece)
matched=1
n=n+i
break
if not matched:
n+=1
print(result)
南京市長
江大橋
大橋
['南京市長', '大橋']
逆向最大匹配法
對句子從右到左選擇詞典中最長的詞條進行匹配。
準確性優於正向匹配法
def cutB(sentence):
result=[]
sentenceLen=len(sentenct)
while sentenceLen>0:
matched=0
for i in range(maxDictA,0,-1):
piece=sentence[sentenctLen-i:sentenceLen]
if piece in dictA:
result.append(piece)
sentenctLen-=i
matched=1
break
if matched==0:
sentenctLen=-1
雙向最大匹配法
當兩種匹配演算法切分的詞彙結果相同,取任一結果;
當兩種匹配演算法切分的詞彙結果不同,分別統計兩種詞彙切分結果切分的詞語的個數,取數目小的作為切分結果;
當兩種匹配演算法切分的詞彙結果不同,且切割後的詞語的數目相同,選擇逆向匹配演算法作為切分結果;
分詞
jieba
jieba分詞利用字首詞典切分句子,得到所有的切分可能,根據切分位置,構造一個有向無環圖;透過動態規劃演算法,得到最大機率的路徑,作為切分結果。
jieba也可以用於關鍵詞提取、詞性標準等。
import jieba
str="利用字首詞典切分句子,得到所有的切分可能。"
'''分詞'''
print(" ".join(jieba.cut(str)))
print(" ".join(jieba.lcut(str)))
print(" ".join(jieba.cut(str,cut_all=True)))
print(" ".join(jieba.cut_for_search(str)))
print(" ".join(jieba.lcut_for_search(str)))
'修改詞典'
jieba.add_word('字首詞典')
print(" ".join(jieba.cut(str)))
'自定義詞典'
# 詞典檔案要求:一詞佔一行 使用空格符 UTF-8編碼
# 格式 詞 詞頻(可省略) 詞性(可省略)
jieba.load_userdict()
利用 字首 詞典 切分 句子 , 得到 所有 的 切分 可能 。
利用 字首 詞典 切分 句子 , 得到 所有 的 切分 可能 。
利用 字首 詞典 切分 分句 句子 , 得到 所有 的 切分 可能 。
利用 字首 詞典 切分 句子 , 得到 所有 的 切分 可能 。
利用 字首 詞典 切分 句子 , 得到 所有 的 切分 可能 。
利用 字首詞典 切分 句子 , 得到 所有 的 切分 可能 。
HMM模型 Hidden Markov Model
jieba.cut(str,HMM=False)
對於未登入詞,jieba使用了基於漢字成詞的HMM模型,採用Viterbi(動態規劃)演算法推導:
使用四個隱藏狀態: 單字成詞、片語的開頭、片語的中間、片語的截尾。透過標註好的分詞訓練集,可以得到HMM的各個引數,再使用Viterbi演算法解釋測試集,得到分詞結果。