1. 程式人生 > >中文分詞簡單理解及 jieba的簡單運用

中文分詞簡單理解及 jieba的簡單運用

漢語分詞中的基本問題:分詞規範,歧義的切分和未登入詞的識別

分詞規範:(一般也就是指“詞”的概念的糾纏不清的問題,),一方面來源於 單字詞和詞素之間的劃界,另一方面就是詞和短語(片語)的劃界問題

歧義切分問題

  交集型切分歧義:漢字串AJB  其中 AJ,JB同時為詞,此時的J 稱作交集串

        例如:結合成,   “結合”, “合成”分別為詞,此時的“合”則為交集串

  鏈長的概念:一個交集型切分歧義所擁有的交集串的集合成為交集串鏈,他的個數成為鏈長

  組合型切分歧義:漢字串AB同時滿足,A,B,AB同時為詞,

        例如:“起身”分別有兩種不同的切分,a: 他站|起|身|來,b:他明|天|起身|去北京

  多義組合型切分歧義:漢字串AB,滿足:1:A,B,AB同時為詞,2:問題中至少存在一個上下文語境C,在語境c的約束下A,B在語法和語義上都成立

未登入詞

  為登陸詞又稱為生詞,一個是指已有的詞表中沒有收錄的詞,二是指已有的訓練語料中未曾出現的詞

  一般分為幾類:(1)、新出現的普通詞彙,(2)、專有名詞,(3)、專業名詞和研究領域名稱,(4)、其他專用名詞

jieba(“結巴”)的簡單運用

jieba分詞簡介:

  jieba分詞演算法使用了基於字首詞典實現高效的詞圖掃描,生成句子中漢字所有可能生成詞情況所構成的有向無環圖(DAG), 再採用了動態規劃查詢最大概率路徑,找出基於詞頻的最大切分組合,對於未登入詞,採用了基於漢字成詞能力的HMM模型,使用了Viterbi演算法

結巴分詞的三種模式:
        精準模式:試圖將句子最精確地切開,適合文字分析
        全模式:吧句子中所有的可以成詞的詞語都掃描出來,但不能解決歧義
        搜尋引擎模式:在精準模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞

   jieba的主要功能:

    1、jieba.cut(sentence, cut_all=False, HMM=True)    sentence是要分詞的語句,cut_all是是否採用全模式,false為精準模式,HMM是控制是否適用HMM模型

    2、jieba.cut_for_search(sentence, HMM=True)   引數就不細說,該方法適用於搜尋引擎模式,分詞力度比較細

    3、jieba.lcut()

    4、jieba.lcut_for_search()

    5、

    備註:cut,cut_for_search返回的是一個生成器物件可以用for迴圈遍歷,lcut, lcut_for_search返回的列表可以直接輸出使用

import jieba

a = jieba.cut('中華人民共和國成立了', cut_all=False, HMM=True)
print('/'.join(a))
b = jieba.cut_for_search('中華人民共和國成立了')
print('/'.join(b))
c = jieba.lcut('中華人民共和國成立了', cut_all=False, HMM=True)
print(c)
d = jieba.lcut_for_search('中華人民共和國成立了')
print(d)

Loading model cost 0.975 seconds.
a: 中華人民共和國/成立/了
b: 中華/華人/人民/共和/共和國/中華人民共和國/成立/了
Prefix dict has been built successfully.
c: ['中華人民共和國', '成立', '了']
d: ['中華', '華人', '人民', '共和', '共和國', '中華人民共和國', '成立', '了']

Process finished with exit code 0

利用jieba進行關鍵詞提取:

  e = jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False)

      sentence: 語句,topk: 返回權重最大的前20個詞(預設就是20),withWeight:True返回關鍵詞的權重值,withflag:僅包含指定詞性的詞 

import jieba
import jieba.analyse
import codecs

file = codecs.open('D:\\PycharmProjects\\jieba\\data\\北京五環雙新工業有限公司與北京中賽國信科技發展有限責任公司合..._UTF-8.txt', encoding='utf-8')
word = file.read()
e = jieba.analyse.extract_tags(word, topK=20, withWeight=False, allowPOS=(), withFlag=False)
print(e)

e: [('中賽', 0.46317736484181693), ('五環', 0.44161073871943884), ('雙新', 0.4152624650305945), ('國信', 0.3012275175559853), ('500', 0.12777306616325984), ('原審', 0.11621335229458918), ('發票', 0.09795034552924514), ('合同', 0.0951704406034068), ('事實', 0.07558163070853709), ('萬元', 0.06746161603875751), ('判決', 0.06737630140485637), ('損失', 0.06716787270968604), ('另案', 0.0649998287000668), ('專案', 0.06197313122931195), ('條碼', 0.05947902485014028), ('付款', 0.05895460144782899), ('青苗', 0.05576455176593186), ('二維', 0.055311807331743484), ('解除', 0.0535768954555177), ('借條', 0.052659547265731466)]

  備註:文字格式必須為utf-8 windows下中文為gbk 需要進行處理(我的問題是一個法院的判決書)

  下面用textrank進行關鍵詞提取

 

 

import jieba
import jieba.analyse
import codecs
file = codecs.open('D:\\PycharmProjects\\jieba\\data\\北京五環雙新工業有限公司與北京中賽國信科技發展有限責任公司合..._UTF-8.txt', encoding='utf-8')
word = file.read()
e = jieba.analyse.extract_tags(word, topK=5,  withWeight=True)
file.close()
print(e)
file = codecs.open('D:\\PycharmProjects\\jieba\\data\\北京五環雙新工業有限公司與北京中賽國信科技發展有限責任公司合..._UTF-8.txt', encoding='utf-8')
word = file.read()
f = jieba.analyse.textrank(word, topK=5, withWeight=True)
print(f)
file.close()

e: [('中賽', 0.46317736484181693), ('五環', 0.44161073871943884), ('雙新', 0.4152624650305945), ('國信', 0.3012275175559853), ('500', 0.12777306616325984)]
f: [('中賽', 1.0), ('專案', 0.4889681449083135), ('損失', 0.3692275287965435), ('事實', 0.350037544658924), ('判決', 0.3236495086380529)]

 

 

  e,f分別為兩種關鍵詞提取方法的權重對比

jieba分詞的詞性標註

import jieba.posseg as pseg

word = pseg.cut('中華人民共和國成立了', HMM=False)
for k, w in word:
    print(k, w)

中華人民共和國 ns
成立 v
了 ul