自然语言处理——jieba分词
1.基本分词函数与用法
jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)
jieba.cut 方法接受三个输入参数:
- 需要分词的字符串
- cut_all 参数用来控制是否采用全模式
- HMM 参数用来控制是否使用 HMM 模型
jieba.cut_for_search 方法接受两个参数
- 需要分词的字符串
- 是否使用 HMM 模型。
该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
import jieba
sent = '中文分词是文本处理不可或缺的一步!'
seg_list = jieba.cut(sent, cut_all=True)
print('全模式:', '/ ' .join(seg_list))
seg_list = jieba.cut(sent, cut_all=False)
print('精确模式:', '/ '.join(seg_list))
seg_list = jieba.cut(sent)
print('默认精确模式:', '/ '.join(seg_list))
seg_list = jieba.cut_for_search(sent)
print('搜索引擎模式', '/ '.join(seg_list))
#词性标注
import jieba.posseg as psg
sent = '中文分词是文本处理不可或缺的一步!'
seg_list = psg.cut(sent)
print(' '.join(['{0}/{1}'.format(w, t) for w, t in seg_list]))
import jieba.posseg as pseg
words = pseg.cut("我爱自然语言处理")
for word, flag in words:
print('%s %s' % (word, flag))
添加用户自定义词典
很多时候我们需要针对自己的场景进行分词,会有一些领域内的专有词汇。
1.可以用jieba.load_userdict(file_name)加载用户字典
2.少量的词汇可以自己用下面方法手动添加:
用 add_word(word, freq=None, tag=None) 和 del_word(word) 在程序中动态修改词典
用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
import jieba
sent = '好丑的证件照片'
print('/ '.join(jieba.cut(sent, HMM=False)))
# 同样是像jieba存入自定义词典,不过不单独弄成一个文件,直接在代码里加载
jieba.suggest_freq(('证件照片'), True)
print('/ '.join(jieba.cut(sent, HMM=False)))
>>> 好丑/ 的/ 证件/ 照片
好丑/ 的/ 证件照片
import jieba
#加载系统词典
jieba.set_dictionary('./data/dict.txt.big')
print('自定义词典内容:')
with open('./data/user_dict.utf8', 'r') as f:
for l in f:
print(l)
print('------华丽的分割线-------')
sent = 'jieba分词非常好用,可以自定义金融词典!'
seg_list = jieba.cut(sent)
print('加载词典前:', '/ '.join(seg_list))
# 加载自定义词典
jieba.load_userdict('./data/user_dict.utf8')
seg_list = jieba.cut(sent)
print('加载词典后:', '/ '.join(seg_list))
>>> 加载词典前: jieba/ 分词/ 非常/ 好用/ ,/ 可以/ 自定义/ 金融/ 词典/ !
加载词典后: jieba分词/ 非常/ 好用/ ,/ 可以/ 自定义/ 金融词典/ !
关键词提取
基于 TF-IDF 算法的关键词抽取
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
- sentence 为待提取的文本
- topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
- withWeight 为是否一并返回关键词权重值,默认值为 False
- allowPOS 仅包括指定词性的词,默认值为空,即不筛选
关于TF-IDF 算法的关键词抽取补充
-
关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径
用法: jieba.analyse.set_idf_path(file_name) # file_name为自定义语料库的路径
-
关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径
用法: jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径
import jieba.analyse as aly
content = '''
自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。
因此,自然语言处理是与人机交互的领域有关的。在自然语言处理面临很多挑战,包括自然语言理解,因此,自然语言处理涉及人机交互的面积。
在NLP诸多挑战涉及自然语言理解,即计算机源于人为或自然语言输入的意思,和其他涉及到自然语言生成。
'''
#加载自定义idf词典
aly.set_idf_path('./data/idf.txt.big')
#加载停用词典
aly.set_stop_words('./data/stop_words.utf8')
# 第一个参数:待提取关键词的文本
# 第二个参数:返回关键词的数量,重要性从高到低排序
# 第三个参数:是否同时返回每个关键词的权重
# 第四个参数:词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词
keywords = aly.extract_tags(content, topK=10, withWeight=True, allowPOS=())
for item in keywords:
# 分别为关键词和相应的权重
print(item[0], item[1])
>>>
自然语言 2.0790900005043476
NLP 0.5197725001260869
计算机 0.5197725001260869
领域 0.5197725001260869
人机交互 0.5197725001260869
挑战 0.5197725001260869
理解 0.5197725001260869
处理 0.4705091875965217
涉及 0.3839134341652174
人工智能 0.25988625006304344
基于 TextRank 算法的关键词抽取
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)) 直接使用,接口相同,注意默认过滤词性。
jieba.analyse.TextRank() 新建自定义 TextRank 实例
算法论文: TextRank: Bringing Order into Texts
基本思想:
- 将待抽取关键词的文本进行分词
- 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
- 计算图中节点的PageRank,注意是无向带权图
import jieba.analyse as aly
content = '''
自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。
因此,自然语言处理是与人机交互的领域有关的。在自然语言处理面临很多挑战,包括自然语言理解,因此,自然语言处理涉及人机交互的面积。
在NLP诸多挑战涉及自然语言理解,即计算机源于人为或自然语言输入的意思,和其他涉及到自然语言生成。
'''
# 第一个参数:待提取关键词的文本
# 第二个参数:返回关键词的数量,重要性从高到低排序
# 第三个参数:是否同时返回每个关键词的权重
# 第四个参数:词性过滤,为空表示过滤所有,与TF—IDF不一样!
keywords = jieba.analyse.textrank(content, topK=10, withWeight=True, allowPOS=('ns', 'n', 'vn', 'v'))
for item in keywords:
# 分别为关键词和相应的权重
print(item[0], item[1])
>>>涉及 1.0
计算机 0.9618169519358478
处理 0.8124660402732825
理解 0.7885898958379202
挑战 0.7833575495518058
人机交互 0.7343470452632993
语言学 0.727536034596871
人类 0.6290562193534068
人工智能 0.5809911385488661
关注 0.577881611632419
补充:
为深刻理解算法的运算,需要明白其背后的大致原理。算法的推导大量的数学运算,需要扎实的数据基础。可以补充一些概率、统计、现代相关的数学知识,虽然其作用不能立刻显现出来,但一定是“长期有价值”的事,需要“长期有耐心”。
上一篇: 自然语言处理与信管这一专业的关系
推荐阅读
-
FileNotFoundError: [Errno 2] No such file or directory: ‘errors.out‘ (python自然语言处理 5.6 最后的示例报错)
-
中文自然语言处理入门实战
-
Python3自然语言处理——获得文本语料库和词汇资源
-
【自然语言处理基础技能(NLP)】语言模型基础
-
自然语言处理学习笔记2:分词工具及分词原理
-
自然语言处理环境搭建流程
-
一文看懂自然语言处理-NLP(4个典型应用+5个难点+6个实现步骤)
-
Python自然语言处理第三章 - 详解一个简单的分词方法
-
Python使用jieba分词
-
Python自然语言处理之词干,词形与最大匹配算法代码详解