开发手册 欢迎您!
软件开发者资料库

Python 使用结巴分词(jieba)提取关键词和词性标注方法及示例代码

本文主要Python中,使用结巴分词(jieba)进行关键词提取,和词性标注的方法,以及相关的示例代码。

1、基于 TF-IDF 算法的关键词抽取

1) 使用方法

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

sentence:为待提取的文本。

topK:为返回几个 TF/IDF 权重最大的关键词,默认值为 20

allowPOS:仅包括指定词性的词,默认值为空,即不筛选。

jieba.analyse.TFIDF(idf_path=None): 新建 TFIDF 实例,idf_path IDF 频率文件

使用示例:

import syssys.path.append('../')import jiebaimport jieba.analysefrom optparse import OptionParserUSAGE = "usage:    python extract_tags.py [file name] -k [top k]"parser = OptionParser(USAGE)parser.add_option("-k", dest="topK")opt, args = parser.parse_args()if len(args) < 1:    print(USAGE)    sys.exit(1)file_name = args[0]if opt.topK is None:    topK = 10else:    topK = int(opt.topK)content = open(file_name, 'rb').read()tags = jieba.analyse.extract_tags(content, topK=topK)print(",".join(tags))

2) 关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径

用法

 jieba.analyse.set_idf_path(file_name) # file_name为自定义语料库的路径

自定义语料库示例https://github.com/fxsjy/jieba/blob/master/extra_dict/idf.txt.big

使用示例:

import syssys.path.append('../')import jiebaimport jieba.analysefrom optparse import OptionParserUSAGE = "usage:    python extract_tags_idfpath.py [file name] -k [top k]"parser = OptionParser(USAGE)parser.add_option("-k", dest="topK")opt, args = parser.parse_args()if len(args) < 1:    print(USAGE)    sys.exit(1)file_name = args[0]if opt.topK is None:    topK = 10else:    topK = int(opt.topK)content = open(file_name, 'rb').read()jieba.analyse.set_idf_path("../extra_dict/idf.txt.big");tags = jieba.analyse.extract_tags(content, topK=topK)print(",".join(tags))

3) 关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径

用法

jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径

自定义语料库示例https://github.com/fxsjy/jieba/blob/master/extra_dict/stop_words.txt

使用示例

import syssys.path.append('../')import jiebaimport jieba.analysefrom optparse import OptionParserUSAGE = "usage:    python extract_tags_stop_words.py [file name] -k [top k]"parser = OptionParser(USAGE)parser.add_option("-k", dest="topK")opt, args = parser.parse_args()if len(args) < 1:    print(USAGE)    sys.exit(1)file_name = args[0]if opt.topK is None:    topK = 10else:    topK = int(opt.topK)content = open(file_name, 'rb').read()jieba.analyse.set_stop_words("../extra_dict/stop_words.txt")jieba.analyse.set_idf_path("../extra_dict/idf.txt.big");tags = jieba.analyse.extract_tags(content, topK=topK)print(",".join(tags))

4) 关键词一并返回关键词权重值示例

import syssys.path.append('../')import jiebaimport jieba.analysefrom optparse import OptionParserUSAGE = "usage:    python extract_tags_with_weight.py [file name] -k [top k] -w [with weight=1 or 0]"parser = OptionParser(USAGE)parser.add_option("-k", dest="topK")parser.add_option("-w", dest="withWeight")opt, args = parser.parse_args()if len(args) < 1:    print(USAGE)    sys.exit(1)file_name = args[0]if opt.topK is None:    topK = 10else:    topK = int(opt.topK)if opt.withWeight is None:    withWeight = Falseelse:    if int(opt.withWeight) is 1:        withWeight = True    else:        withWeight = Falsecontent = open(file_name, 'rb').read()tags = jieba.analyse.extract_tags(content, topK=topK, withWeight=withWeight)if withWeight is True:    for tag in tags:        print("tag: %s\t\t weight: %f" % (tag[0],tag[1]))else:    print(",".join(tags))

2、基于 TextRank 算法的关键词抽取

1)jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。

2) jieba.analyse.TextRank()新建自定义 TextRank 实例

算法论文: TextRank: Bringing Order into Texts

使用示例

#encoding=utf-8from __future__ import unicode_literalsimport syssys.path.append("../")import jiebaimport jieba.possegimport jieba.analyseprint('='*40)print('1. 分词')print('-'*40)seg_list = jieba.cut("我来到北京清华大学", cut_all=True)print("Full Mode: " + "/ ".join(seg_list))  # 全模式seg_list = jieba.cut("我来到北京清华大学", cut_all=False)print("Default Mode: " + "/ ".join(seg_list))  # 默认模式seg_list = jieba.cut("他来到了网易杭研大厦")print(", ".join(seg_list))seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式print(", ".join(seg_list))print('='*40)print('2. 添加自定义词典/调整词典')print('-'*40)print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))#如果/放到/post/中将/出错/。print(jieba.suggest_freq(('中', '将'), True))#494print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))#如果/放到/post/中/将/出错/。print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))#「/台/中/」/正确/应该/不会/被/切开print(jieba.suggest_freq('台中', True))#69print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))#「/台中/」/正确/应该/不会/被/切开print('='*40)print('3. 关键词提取')print('-'*40)print(' TF-IDF')print('-'*40)s = "此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。"for x, w in jieba.analyse.extract_tags(s, withWeight=True):    print('%s %s' % (x, w))print('-'*40)print(' TextRank')print('-'*40)for x, w in jieba.analyse.textrank(s, withWeight=True):    print('%s %s' % (x, w))print('='*40)print('4. 词性标注')print('-'*40)words = jieba.posseg.cut("我爱北京天安门")for word, flag in words:    print('%s %s' % (word, flag))print('='*40)print('6. Tokenize: 返回词语在原文的起止位置')print('-'*40)print(' 默认模式')print('-'*40)result = jieba.tokenize('永和服装饰品有限公司')for tk in result:    print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))print('-'*40)print(' 搜索模式')print('-'*40)result = jieba.tokenize('永和服装饰品有限公司', mode='search')for tk in result:    print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))

3、使用结巴分词(jieba)词性标注

1) jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。

2) 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。

3) 除了jieba默认分词模式,提供paddle模式下的词性标注功能。paddle模式采用延迟加载方式,通过enable_paddle()安装paddlepaddle-tiny,并且import相关代码;

使用示例:

>>> import jieba>>> import jieba.posseg as pseg>>> words = pseg.cut("我爱北京天安门") #jieba默认模式>>> jieba.enable_paddle() #启动paddle模式。 0.40版之后开始支持,早期版本不支持>>> words = pseg.cut("我爱北京天安门",use_paddle=True) #paddle模式>>> for word, flag in words:...    print('%s %s' % (word, flag))...我 r爱 v北京 ns天安门 ns

paddle模式词性标注对应表如下:

paddle模式词性和专名类别标签集合如下表,其中词性标签 24 个(小写字母),专名类别标签 4 个(大写字母)。

标签

含义

标签

含义

标签

含义

标签

含义

n

普通名词

f

方位名词

s

处所名词

t

时间

nr

人名

ns

地名

nt

机构名

nw

作品名

nz

其他专名

v

普通动词

vd

动副词

vn

名动词

a

形容词

ad

副形词

an

名形词

d

副词

m

数量词

q

量词

r

代词

p

介词

c

连词

u

助词

xc

其他虚词

w

标点符号

PER

人名

LOC

地名

ORG

机构名

TIME

时间

官方文档https://github.com/fxsjy/jieba

相关文档:

Python 结巴分词(jieba)使用方法文档及示例代码

Python 使用结巴分词(jieba)并行分词及示例代码