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 contains
Chinese 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 value
that 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 pseg
review = "之前我没得选,但现在我想做一个好人"
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 jieba
review = "之前我没得选,但现在我想做一个好人"
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.cut
if False, return a list of words
"""
- sentence: 需要分析的文本。
- topK: 返回关键词的数量,默认为20。
- withWeight: 是否一并返回关键词的权重,默认为False。
- allowPOS: 限定词性的列表,只把符合词性要求的词语当作关键词,默认包括名词、形容词等。
import jieba.analyse
text1 = '全世界的无产阶级联合起来'
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.cut
if False, return a list of words
"""
参数说明同上
import jieba.analyse
review = "之前我没得选,但现在我想做一个好人"
# 使用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