內容目錄
- 一、分詞
- 二、設置分詞
- 三、詞性信息
- 四、關鍵詞提取
jieba庫是一個針對中文文本的分詞工具庫,廣泛應用于自然語言處理(NLP)領域的中文文本預處理階段。
主要功能:
- 中文分詞:能夠將連續的中文文本切割成有意義的詞語序列,這是中文信息處理的基礎。
- 三種分詞模式:
- 精確模式:力求精準地進行分詞,適合文本分析。
- 全模式:列出文本中所有可能的詞語組合,包含許多冗余項,但能發現更多潛在信息。
- 搜索引擎模式:在精確模式基礎上,對長詞再次切分,以適應搜索引擎的需求,提高召回率。
- 詞性標注:通過jieba.posseg模塊,不僅可以分詞,還能為每個詞標注其詞性,如名詞(n)、動詞(v)、形容詞(a)等。
- 自定義詞典:用戶可以根據需要添加自定義的詞語到詞典中,以便jieba在分詞時能夠正確處理專有名詞、行業術語或新詞。
- 關鍵詞提取:提供關鍵詞抽取功能,幫助從文本中快速提取出代表性的關鍵詞。
一、分詞
lcut(): jieba 分詞庫中的一個函數,用于對給定的字符串進行分詞處理,并將分詞結果以列表(list)的形式返回。這個方法非常適合于需要對分詞結果進行進一步列表操作或遍歷的場景。
lcut()可以支持三個參數:
def cut(self, sentence, cut_all=False, HMM=True, use_paddle=False):"""The main function that segments an entire sentence that containsChinese characters into separated words.Parameter:- sentence: The str(unicode) to be segmented.- cut_all: Model type. True for full pattern, False for accurate pattern.- HMM: Whether to use the Hidden Markov Model."""
- 第一個參數:待分詞的字符串 - 這是必需的參數,表示你想要進行分詞處理的文本內容。
- cut_all (可選參數):
- 類型:布爾值(True 或 False)。
- 默認值:False。
- 含義:控制分詞模式。如果設置為 True,則使用全模式分詞,會列出文本中所有可能的詞語組合;如果為 False(默認),則使用精確模式分詞,僅輸出最可能的詞語組合。
- cut_all (可選參數):
- HMM(可選參數):
- 類型:布爾值(True 或 False)。
- 默認值:True。
- 含義:是否使用隱馬爾可夫模型(Hidden Markov Model)。HMM 在 jieba 中用于新詞發現,當設置為 False 時,會關閉基于HMM模型的新詞識別功能。
import jieba
review = "之前我沒得選,但現在我想做一個好人"
words = jieba.lcut(review, cut_all=True)
# ['之前', '我', '沒得選', ',', '但', '現在', '我', '想', '做', '一個', '好人']
print("cut_all=True: ", words)review = "之前我沒得選,但現在我想做一個好人"
words = jieba.lcut(review)
# ['之前', '我', '沒得選', ',', '但', '現在', '我', '想', '做', '一個', '好人']
print("cut_all=False: ", words)
參數 cut_all 用于控制分詞模式。當 cut_all=True 時,啟用的是 全模式 分詞。全模式會將文本中的每一個詞的所有可能成詞方式都進行拆分,也就是說,它會盡可能地進行切分,包括一些較為生僻或者非通用的組合詞,這會使得分詞結果更加全面,但也可能導致較多的冗余項。
相比之下,如果設置 cut_all=False(這也是默認值),則使用 精確模式 分詞。精確模式會按照常見詞語和組合進行分詞,盡量減少拆分,提供更為準確的詞語劃分,適合大多數文本分析場景。
cut_all=True: ['之前', '我', '沒得', '選', ',', '但', '現在', '我', '想', '做', '一個', '好人']
cut_all=False: ['之前', '我', '沒得選', ',', '但', '現在', '我', '想', '做', '一個', '好人']
cut_for_search():是 jieba 分詞庫中的一個特殊分詞模式,主要用于搜索引擎分詞。這個方法結合了精確模式和全模式的優點,旨在提高搜索時的查詢詞召回率。 是 jieba 分詞庫中的一個特殊分詞模式,主要用于搜索引擎分詞。這個方法結合了精確模式和全模式的優點,旨在提高搜索時的查詢詞召回率。
cut_fo_search()支持傳入兩個參數:
def cut_for_search(self, sentence, HMM=True):"""Finer segmentation for search engines."""
- 需要分詞的字符串:即要進行分詞處理的文本內容。
- 是否使用 HMM 模型:這是一個可選參數,默認為 True。HMM(Hidden Markov Model)模型在這里用于新詞發現,當設置為 False 時,會關閉基于HMM模型的新詞識別功能。這個參數可以影響分詞結果,尤其是在處理未登錄詞(新詞、專有名詞等)時。
import jieba
review = "之前我沒得選,但現在我想做一個好人"seg_list = jieba.cut_for_search(review)
print("/".join(seg_list))
# 之前/我/沒得/沒得選/,/但/現在/我/想/做/一個/好人seg_list2 = jieba.cut_for_search(review,HMM=False)
print("/".join(seg_list2))
# 之前/我/沒/得/選/,/但/現在/我/想/做/一個/好人
二、設置分詞
add_word(): 允許用戶向分詞詞典中添加自定義的詞語。這對于確保特定詞匯(如品牌名、專業術語、新詞或專有名詞等)能夠被正確識別和處理非常有用。使用這個方法可以提升分詞的準確性和適應性。
add_word()支持傳入三個參數:
def add_word(self, word, freq=None, tag=None):"""Add a word to dictionary.freq and tag can be omitted, freq defaults to be a calculated valuethat ensures the word can be cut out."""
- word:必需參數,表示要添加的詞語字符串。
- freq:可選參數,表示詞語的頻率。在某些情況下,jieba 會根據詞語的頻率來決定分詞時的優先級。如果省略,則默認值為 None。
- tag:可選參數,表示詞語的詞性標記。這對于需要進行詞性標注的場景非常有用。如果省略,則默認值為 None。
import jieba
review = "之前我沒得選,但現在我想做一個好人"seg_list = jieba.cut(review)
print("/".join(seg_list))
# 之前/我/沒得選/,/但/現在/我/想/做/一個/好人jieba.add_word("做一個好人")
seg_list2 = jieba.cut(review)
print("/".join(seg_list2))
# 之前/我/沒得選/,/但/現在/我/想/做一個好人
三、詞性信息
pseg模塊: jieba 分詞庫中的一個模塊,用于同時進行分詞和詞性標注。相比于基礎的分詞功能,pseg 能夠提供每個分詞的詞性信息,這對于自然語言處理中的許多高級任務,如情感分析、命名實體識別等尤為重要。
import jieba.posseg as psegreview = "之前我沒得選,但現在我想做一個好人"words = pseg.cut(review)
for word, flag in words:print(f"{word}:{flag}")# 之前:f
# 我:r
# 沒得:v
# 選:v
# ,:x
# 但:c
# 現在:t
# 我:r
# 想:v
# 做:v
# 一個:m
# 好人:n
可以通過jieba.add_word() 方法添加自定義詞及詞性
import jieba.posseg as pseg
import jiebareview = "之前我沒得選,但現在我想做一個好人"jieba.add_word('一個好人', tag='n')
words = pseg.cut(review)
for word, flag in words:print(f"{word}:{flag}")# 之前:f
# 我:r
# 沒得:v
# 選:v
# ,:x
# 但:c
# 現在:t
# 我:r
# 想:v
# 做:v
# 一個好人:n
詞性含義:
# r (代詞): 代詞,指代替名詞或名詞性短語的詞,如“我”、“你”、“這”、“那”等。
# p (介詞): 介詞,用在名詞、代詞或名詞性短語前邊,一起組成介賓短語,在句中作狀語或補語,如“在”、“對”、“從”等。
# ns (地名): 地名,包括特定區域、地域的名稱,如“北京”、“中國”等。
# v (動詞): 動詞
# n (名詞): 名詞,表示人、事物、地方、抽象概念等名稱的詞。
# a (形容詞): 形容詞,主要用來修飾名詞或代詞,表示性質或特征,如“美麗”、“高興”。
# ad (副詞): 副詞,用來修飾動詞、形容詞或其他副詞,表示程度、時間、頻率、范圍等意義,如“很”、“非常”、“經常”。
# m (數詞): 數詞,表示數目或順序的詞,如“一”、“二”、“第三”。
# q (量詞): 量詞,與數詞結合使用,表示數量,如“個”、“次”、“件”。
# c (連詞): 連詞,連接詞、短語或句子,如“和”、“但”、“因為”。
# u (助詞): 助詞,附著在詞或短語之后,表示結構關系或附加意義,如“的”、“著”、“了”。
# x (非語素字): 非語素字,不能單獨成詞但有語法意義的字符,如“阿”、“哎”。
# w (標點符號): 標點符號,文本中的各種標點符號。
# d (副詞性代詞): 如“都”、“僅僅”。
# f (方位詞): 表示方向或位置關系的詞,如“上”、“下”、“內”。
# an (形容詞性慣用語): 形容詞性的固定短語,如“黑乎乎”。
# b (區別詞): 用來表示人或事物與其他同類相區別的詞,如“野生”、“男”、“女”。
# e (嘆詞): 表達強烈感情或呼喚應答的詞,如“哎呀”、“喂”。
# i (成語): 固定的四字或四字以上的漢語成語,如“畫蛇添足”。
# j (簡稱略語): 簡稱或略語,如“北約”、“GDP”。
# o (擬聲詞): 模仿聲音的詞,如“嘩啦”、“咚咚”。
# t (時間詞): 表示時間的詞,如“現在”、“昨天”。
# y (語氣詞): 位于句尾或句中,表達說話人的語氣或情感,如“啊”、“吧”。
四、關鍵詞提取
textrank(): 使用TextRank算法提取關鍵詞
textrank()支持傳入五個參數:
def textrank(self, sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'), withFlag=False):"""Extract keywords from sentence using TextRank algorithm.Parameter:- topK: return how many top keywords. `None` for all possible words.- withWeight: if True, return a list of (word, weight);if False, return a list of words.- allowPOS: the allowed POS list eg. ['ns', 'n', 'vn', 'v'].if the POS of w is not in this list, it will be filtered.- withFlag: if True, return a list of pair(word, weight) like posseg.cutif False, return a list of words"""
- sentence: 需要分析的文本。
- topK: 返回關鍵詞的數量,默認為20。
- withWeight: 是否一并返回關鍵詞的權重,默認為False。
- allowPOS: 限定詞性的列表,只把符合詞性要求的詞語當作關鍵詞,默認包括名詞、形容詞等。
import jieba.analysetext1 = '全世界的無產階級聯合起來'
keywords = jieba.analyse.textrank(text1, topK=5, withWeight=True)
for keyword, weight in keywords:print(f"關鍵詞: {keyword}, 權重: {weight}")
# 關鍵詞: 起來, 權重: 1.0
# 關鍵詞: 聯合, 權重: 0.9966849915940917
# 關鍵詞: 全世界, 權重: 0.9929941828082526
extract_tags(): 基于TF-IDF算法提取關鍵詞。
extract_tags()支持傳入五個參數:
def extract_tags(self, sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False):"""Extract keywords from sentence using TF-IDF algorithm.Parameter:- topK: return how many top keywords. `None` for all possible words.- withWeight: if True, return a list of (word, weight);if False, return a list of words.- allowPOS: the allowed POS list eg. ['ns', 'n', 'vn', 'v','nr'].if the POS of w is not in this list,it will be filtered.- withFlag: only work with allowPOS is not empty.if True, return a list of pair(word, weight) like posseg.cutif False, return a list of words"""
參數說明同上
import jieba.analysereview = "之前我沒得選,但現在我想做一個好人"# 使用TF-IDF算法提取關鍵詞
keywords = jieba.analyse.extract_tags(review, topK=5, withWeight=True)
for keyword, weight in keywords:print(f'關鍵詞: {keyword}, 權重: {weight}')
# 關鍵詞: 沒得選, 權重: 2.39095350058
# 關鍵詞: 好人, 權重: 1.556957105298
# 關鍵詞: 之前, 權重: 1.038705095328
# 關鍵詞: 現在, 權重: 0.79074950832
# 關鍵詞: 一個, 權重: 0.5635101944259999
tips: 權重值含義
權重值通常反映了一個詞項(關鍵詞)在文檔或語料庫中的重要性。
TextRank中的權重值:類似于Google的PageRank算法,TextRank算法會為文本中的每個詞計算一個分數,這個分數代表了該詞作為關鍵詞的重要程度。它是基于詞語共現的統計信息得出的,如果一個詞經常與其他關鍵詞共同出現,那么它的TextRank權重就相對較高。簡而言之,TextRank權重體現了詞在文本網絡中的中心性或影響力。
TF-IDF中的權重值: TF-IDF(Term Frequency-Inverse Document Frequency)是一種衡量詞項重要性的經典方法。TF-IDF權重由兩部分組成:
TF(Term Frequency):詞頻,即某個詞在文檔中出現的次數。出現次數越多,初步認為其越重要。
IDF(Inverse Document Frequency):逆文檔頻率,衡量詞的罕見度。如果一個詞在很多文檔中都出現,則IDF值低,表明這個詞對于區分文檔的重要性小;反之,如果一個詞僅僅在少數文檔中出現,則IDF值高,意味著這個詞具有很好的區分能力。 綜合起來,TF-IDF權重值高的詞,就是在文檔中出現頻繁但在整個文檔集合中不常見的詞,這些詞往往更能代表文檔的主題。通過這些權重值,用戶可以識別出哪些詞匯對于理解文本內容最為關鍵
可以使用jieba.add_word()方法設置抽取的關鍵詞
import jieba
import jieba.analyse
review = "之前我沒得選,但現在我想做一個好人"
jieba.add_word("一個好人")# 使用TF-IDF算法提取關鍵詞
keywords = jieba.analyse.extract_tags(review, topK=5, withWeight=True)
for keyword, weight in keywords:print(f'關鍵詞: {keyword}, 權重: {weight}')# 關鍵詞: 沒得選, 權重: 2.988691875725
# 關鍵詞: 一個好人, 權重: 2.988691875725
# 關鍵詞: 之前, 權重: 1.29838136916
# 關鍵詞: 現在, 權重: 0.9884368854