文字挖掘之語料庫、分詞、詞頻統計

txmmy發表於2024-05-20

目錄
  • 語料庫
  • 中文分詞
    • 基於規則的中文分詞:最大匹配法
      • 正向最大匹配法
      • 逆向最大匹配法
      • 雙向最大匹配法
  • 分詞
    • jieba
      • HMM模型 Hidden Markov Model
  • 詞頻統計

語料庫

存放語言真實使用場景、且經過加工的例句,而非脫離具體場景的標準例句。

國家語委現代漢語語料庫: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演算法解釋測試集,得到分詞結果。

詞頻統計

相關文章