欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自然语言处理——jieba分词

程序员文章站 2022-03-08 19:29:21
...

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

补充:
为深刻理解算法的运算,需要明白其背后的大致原理。算法的推导大量的数学运算,需要扎实的数据基础。可以补充一些概率、统计、现代相关的数学知识,虽然其作用不能立刻显现出来,但一定是“长期有价值”的事,需要“长期有耐心”。

相关标签: 自然语言处理