日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jieba分词

發布時間:2023/12/10 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jieba分词 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • jieba中文分詞
    • 分詞模式
    • 算法操作
    • 主要功能
      • 分詞
        • HMM模型
      • 添加自定義詞典
        • 載入詞典
        • 調整詞典
        • 通過用戶自定義詞典來增強歧義糾錯能力
      • 關鍵詞提取
        • 基于TF-IDF算法的關鍵詞抽取
        • 基于 TextRank 算法的關鍵詞抽取
        • 自定義語料庫
      • 詞性標注
      • 并行分詞
      • 返回詞語在原文的起止位置
  • 參考資料

jieba中文分詞

jieba是目前最好的Python中文分詞組件,它主要有以下3種特性:

  • 支持3種分詞模式
  • 支持繁體分詞
  • 支持自定義詞典

分詞模式

分詞模式:

  • 精確模式,試圖將句子最精確地切開,適合文本分析;
  • 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非???#xff0c;但是不能解決歧義;
  • 搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。

算法操作

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

主要功能

分詞

seg_list = jieba.cut("我來到北京清華大學", cut_all=True) print("Full Mode: " + "/ ".join(seg_list)) # 全模式 >>Full Mode:/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學 seg_list = jieba.cut("我來到北京清華大學", cut_all=False) print("Default Mode: " + "/ ".join(seg_list)) # 精確模式 >>Default Mode:/ 來到/ 北京/ 清華大學 seg_list = jieba.cut("他來到了網易杭研大廈") # 默認是精確模式 print(", ".join(seg_list)) >>, 來到,, 網易, 杭研, 大廈 seg_list = jieba.cut_for_search("小明碩士畢業于中國科學院計算所,后在日本京都大學深造") # 搜索引擎模式 print(", ".join(seg_list)) >>小明, 碩士, 畢業, 于, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, ,, 后, 在, 日本, 京都, 大學, 日本京都大學, 深造

HMM模型

HMM 模型,即隱馬爾可夫模型(Hidden Markov Model, HMM),是一種基于概率的統計分析模型,用來描述一個系統隱性狀態的轉移和隱性狀態的表現概率。在 jieba 中,對于未登錄到詞庫的詞,使用了基于漢字成詞能力的 HMM 模型和 Viterbi 算法,其大致原理是:

  • 采用四個隱含狀態,分別表示為單字成詞,詞組的開頭,詞組的中間,詞組的結尾。通過標注好的分詞訓練集,可以得到 HMM 的各個參數,然后使用 Viterbi 算法來解釋測試集,得到分詞結果。
seg_list = jieba.cut("他來到了網易杭研大廈", HMM=False)#默認精確模式和未啟用HMM print("【未啟用 HMM】:" + "/ ".join(seg_list)) >>【未啟用 HMM】:他/ 來到// 網易/// 大廈 seg_list = jieba.cut("他來到了網易杭研大廈", HMM=True)#默認精確模式和啟用HMM print("【識別新詞】:" + "/ ".join(seg_list)) >>【識別新詞】:他/ 來到// 網易/ 杭研/ 大廈

添加自定義詞典

載入詞典

from __future__ import print_function, unicode_literals import sys sys.path.append("../") import jieba jieba.load_userdict("E:/NLP/nlp_learn/data/userdict.txt") import jieba.posseg as psegjieba.add_word('石墨烯') jieba.add_word('凱特琳') jieba.del_word('自定義詞')test_sent = ( "李小福是創新辦主任也是云計算方面的專家; 什么是八一雙鹿\n" "例如我輸入一個帶“韓玉賞鑒”的標題,在自定義詞庫中也增加了此詞為N類\n" "「臺中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。" ) words = jieba.cut(test_sent) print('/'.join(words))print("="*40)result = pseg.cut(test_sent)for w in result:print(w.word, "/", w.flag, ", ", end=' ')print("\n" + "="*40)terms = jieba.cut('easy_install is great') print('/'.join(terms)) terms = jieba.cut('python 的正則表達式是好用的') print('/'.join(terms))print("="*40) # test frequency tune testlist = [ ('今天天氣不錯', ('今天', '天氣')), ('如果放到post中將出錯。', ('中', '將')), ('我們中出了一個叛徒', ('中', '出')), ]for sent, seg in testlist:print('/'.join(jieba.cut(sent, HMM=False)))word = ''.join(seg)print('%s Before: %s, After: %s' % (word, jieba.get_FREQ(word), jieba.suggest_freq(seg, True)))print('/'.join(jieba.cut(sent, HMM=False)))print("-"*40) 李小福//創新辦/主任///云計算/方面//專家/;/ /什么///一雙/鹿/ /例如//輸入/一個///韓玉賞鑒///標題///自定義/詞庫///增加///詞為/N// //臺中//正確/應該/不會//切開/。/mac///分出//石墨烯///此時//可以/分出//凱特琳//。 ======================================== 李小福 / nr ,/ v , 創新辦 / i , 主任 / b ,/ d ,/ v , 云計算 / x , 方面 / n ,/ uj , 專家 / n , ; / x , / x , 什么 / r ,/ v ,/ m , 一雙 / m , 鹿 / nr , / x , 例如 / v ,/ r , 輸入 / v , 一個 / m ,/ v ,/ x , 韓玉賞鑒 / nz ,/ x ,/ uj , 標題 / n ,/ x ,/ p , 自定義 / l , 詞庫 / n ,/ f ,/ d , 增加 / v ,/ ul ,/ r ,/ n ,/ p , N / eng ,/ q , / x ,/ x , 臺中 / s ,/ x , 正確 / ad , 應該 / v ,/ d ,/ v ,/ p , 切開 / ad ,/ x , mac / eng ,/ f ,/ v , 分出 / v ,/ x , 石墨烯 / x ,/ x ,/ x , 此時 / c ,/ d , 可以 / c , 分出 / v ,/ zg , 凱特琳 / nz ,/ ul , 。 / x , ======================================== easy_install/ /is/ /great python/ //正則表達式//好用/======================================== 今天天氣/不錯 今天天氣 Before: 3, After: 0 今天/天氣/不錯 ---------------------------------------- 如果/放到/post/中將/出錯/。 中將 Before: 763, After: 493 如果/放到/post///出錯/。 ---------------------------------------- 我們////一個/叛徒 中出 Before: 3, After: 3 我們////一個/叛徒 ----------------------------------------

調整詞典

print('/'.join(jieba.cut('如果放到post中將出錯。', HMM=False))) >>如果/放到/post/中將/出錯/。 jieba.suggest_freq(('中', '將'), True) >>490 print('/'.join(jieba.cut('如果放到post中將出錯。', HMM=False))) >>如果/放到/post///出錯/。 print('/'.join(jieba.cut('「臺中」正確應該不會被切開', HMM=False))) >>////正確/應該/不會//切開 jieba.suggest_freq(('臺中'), True) >>69 print('/'.join(jieba.cut('「臺中」正確應該不會被切開', HMM=False))) >>/臺中//正確/應該/不會//切開

通過用戶自定義詞典來增強歧義糾錯能力

# "大連美容美發學校中君意是你值得信賴的選擇" 這句話首先會按照概率連乘最大路徑來切割,因為單字有一定概率, # 而“中君意是”這四個字中不含詞典中有的詞,所以會被切割成單字: # 即:大連/ 美容美發/ 學校/ 中/ 君/ 意/ 是/ 你/ 值得/ 信賴/ 的/ 選擇/ import sys import jieba jieba.load_userdict("E:/NLP/nlp_learn/data/userdict.txt") print (", ".join(jieba.cut("大連美容美發學校中君意是你值得信賴的選擇"))) # 解決方案是在詞典中補充“君意”這個詞,并給予一個詞頻,不用太大,比如3即可 >>大連, 美容美發, 學校,, 君意,,, 值得, 信賴,, 選擇 # Bad Case: '江州/ 市/ 長江大橋/ 參加/ 了/ 長江大橋/ 的/ 通車/ 儀式' import sys sys.path.append("../") import jieba jieba.load_userdict("E:/NLP/nlp_learn/data/userdict.txt") print (", ".join(jieba.cut("江州市長江大橋參加了長江大橋的通車儀式"))) # 我是這樣設置的:# ==user.dict==# 江大橋 20000 江州, 市長, 江大橋, 參加,, 長江大橋,, 通車, 儀式

關鍵詞提取

基于TF-IDF算法的關鍵詞抽取

TF-IDF(Term Frequency-Inverse Document Frequency, 詞頻-逆文件頻率)是一種統計方法,用以評估一個詞語對于一個文件集或一個語料庫中的一份文件的重要程度,其原理可概括為:

  • 一個詞語在一篇文章中出現次數越多,同時在所有文檔中出現次數越少,越能夠代表該文章

方法:jieba.analyse.extract_tags,該方法有4個參數:

  • sentence:為待提取的文本
  • topK:為返回幾個 TF/IDF 權重最大的關鍵詞,默認值為 20
  • withWeight:是否一并返回關鍵詞權重值,默認值為 False
  • allowPOS:僅包括指定詞性的詞,默認值為空
import jieba.analyse s = "此外,公司擬對全資子公司吉林歐亞置業有限公司增資4.3億元,增資后,吉林歐亞置業注冊資本由7000萬元增加到5億元。吉林歐亞置業主要經營范圍為房地產開發及百貨零售等業務。目前在建吉林歐亞城市商業綜合體項目。2013年,實現營業收入0萬元,實現凈利潤-139.13萬元。" for x, w in jieba.analyse.extract_tags(s, topK=20, withWeight=True):print('%s %s' % (x, w)) >>歐亞 0.7300142700289363 吉林 0.659038184373617 置業 0.4887134522112766 萬元 0.3392722481859574 增資 0.33582401985234045 4.3 0.25435675538085106 7000 0.25435675538085106 2013 0.25435675538085106 139.13 0.25435675538085106 實現 0.19900979900382978 綜合體 0.19480309624702127 經營范圍 0.19389757253595744 億元 0.1914421623587234 在建 0.17541884768425534 全資 0.17180164988510638 注冊資本 0.1712441526 百貨 0.16734460041382979 零售 0.1475057117057447 子公司 0.14596045237787234 營業 0.13920178509021275

基于 TextRank 算法的關鍵詞抽取

基本思想:

  • 將待抽取關鍵詞的文本進行分詞
  • 以固定窗口大小(默認為5,通過span屬性調整),詞之間的共現關系,構建圖
  • 計算圖中節點的PageRank,注意是無向帶權圖
  • TextRank 是另一種基于PageRank關鍵詞提取算法。通過 jieba.analyse.textrank 方法可以使用基于 TextRank 算法的關鍵詞提取,其與 ‘jieba.analyse.extract_tags’ 有一樣的參數,但前者默認過濾詞性(allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’))。

    for x, w in jieba.analyse.textrank(s, withWeight=True):print('%s %s' % (x, w)) >>吉林 1.0 歐亞 0.9966893354178172 置業 0.6434360313092776 實現 0.5898606692859626 收入 0.43677859947991454 增資 0.4099900531283276 子公司 0.35678295947672795 城市 0.34971383667403655 商業 0.34817220716026936 業務 0.3092230992619838 在建 0.3077929164033088 營業 0.3035777049319588 全資 0.303540981053475 綜合體 0.29580869172394825 注冊資本 0.29000519464085045 有限公司 0.2807830798576574 零售 0.27883620861218145 百貨 0.2781657628445476 開發 0.2693488779295851 經營范圍 0.2642762173558316

    自定義語料庫

    關鍵詞提取所使用逆向文件頻率(IDF)文本語料庫和停止詞(Stop Words)文本語料庫可以切換成自定義語料庫的路徑。

    jieba.analyse.set_stop_words("stop_words.txt") jieba.analyse.set_idf_path("idf.txt.big"); for x, w in anls.extract_tags(s, topK=20, withWeight=True):print('%s %s' % (x, w)) >>吉林 1.0174270215234043 歐亞 0.7300142700289363 增資 0.5087135107617021 實現 0.5087135107617021 置業 0.4887134522112766 萬元 0.3392722481859574 此外 0.25435675538085106 全資 0.25435675538085106 有限公司 0.25435675538085106 4.3 0.25435675538085106 注冊資本 0.25435675538085106 7000 0.25435675538085106 增加 0.25435675538085106 主要 0.25435675538085106 房地產 0.25435675538085106 業務 0.25435675538085106 目前 0.25435675538085106 城市 0.25435675538085106 綜合體 0.25435675538085106 2013 0.25435675538085106

    詞性標注

    jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 參數可指定內部使用的 jieba.Tokenizer 分詞器。jieba.posseg.dt 為默認詞性標注分詞器。

    import jieba.posseg as pseg words = pseg.cut("我愛北京天安門") for word, flag in words:print('%s %s' % (word, flag)) >> 我 r 愛 v 北京 ns 天安門 ns

    并行分詞

    將目標文本按行分隔后,把各行文本分配到多個 Python 進程并行分詞,然后歸并結果,從而獲得分詞速度的可觀提升。用法:

    • jieba.enable_parallel(4):開啟并行分詞模式,參數為并行進程數
    • jieba.disable_parallel() :關閉并行分詞模式
    注意:基于 python 自帶的 multiprocessing 模塊,目前暫不支持 Windows

    返回詞語在原文的起止位置

    # 默認模式 result = jieba.tokenize(u"永和服裝飾品有限公司") for tk in result:print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2])) >> word 永和 start: 0 end:2 word 服裝 start: 2 end:4 word 飾品 start: 4 end:6 word 有限公司 start: 6 end:10 # 搜索模式 result = jieba.tokenize(u'永和服裝飾品有限公司', mode='search') for tk in result:print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2])) >> word 永和 start: 0 end:2 word 服裝 start: 2 end:4 word 飾品 start: 4 end:6 word 有限 start: 6 end:8 word 公司 start: 8 end:10 word 有限公司 start: 6 end:10

    參考資料

    結巴中文分詞
    簡明jieba中文分詞教程

    總結

    以上是生活随笔為你收集整理的jieba分词的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。