NLP深入学习(一):jieba 工具包介绍

文章目录

  • 1. jieba 介绍
  • 2. 分词
  • 3. 添加自定义词典
    • 3.1 添加词典
    • 3.2 调整词典
  • 4. 关键词提取
    • 4.1 基于 TF-IDF 算法的关键词抽取
    • 4.2 基于 TextRank 算法的关键词抽取
  • 5. 词性标注
  • 6. 参考


1. jieba 介绍

jieba(结巴)是一款用于中文文本处理的开源分词工具。它是基于 Python 编写的,具有简单易用、高效准确的特点,成为处理中文文本分词任务中常用的工具之一。jieba 的 github 点击这里。

以下是jieba分词库的一些主要特点和功能:

  1. 中文分词: jieba主要用于中文分词,可以将连续的中文文本切分成有意义的词语。分词是中文自然语言处理的基础步骤,对于词语的准确切分对后续的文本处理和分析具有重要意义。

  2. 支持多种分词模式: jieba支持三种分词模式,包括精确模式(cut),全模式(cut_all),和搜索引擎模式(cut_for_search)。用户可以根据具体需求选择合适的分词模式。

  3. 支持自定义词典: 用户可以通过添加自定义词典来调整分词效果,使其更符合特定领域或任务的需求。这对于处理领域特定词汇或专业术语非常有帮助。

  4. 高性能: jieba 分词采用了基于前缀词典的分词算法,具有较高的分词速度和准确性。这使得它在实际应用中能够处理大规模文本数据。

  5. 开源: jieba 是开源项目,用户可以自由获取源代码,并根据需求进行修改和定制。同时,由于其开源特性,也能够不断得到社区的更新和维护。

使用jieba分词通常包括以下步骤:

  • 安装jieba库:可以通过pip安装,命令为 pip install jieba
  • 导入jieba库:在Python代码中导入jieba库。
  • 载入词典(可选):可以加载自定义词典以适应特定需求。
  • 进行分词:使用jieba库提供的分词函数进行文本分词。

例如:

import jieba

# 精确模式分词
seg_list = jieba.cut("我喜欢自然语言处理", cut_all=False)
print(" ".join(seg_list))

上述代码将输出:

"我 喜欢 自然 语言 处理"

2. 分词

  1. jieba.cut 方法接受四个输入参数:
    • 需要分词的字符串;
    • cut_all 参数用来控制是否采用全模式;
    • HMM 参数用来控制是否使用 HMM 模型;
    • use_paddle 参数用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny
  2. jieba.cut_for_search 方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。接受两个参数:
    • 需要分词的字符串;
    • 是否使用 HMM 模型。

示例:

# encoding=utf-8
import jieba

jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持
strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"]
for str in strs:
    seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式
    print("Paddle Mode: " + '/'.join(list(seg_list)))

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))

输出:

【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

【精确模式】: 我/ 来到/ 北京/ 清华大学

【新词识别】:他, 来到, 了, 网易, 杭研, 大厦    (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)

【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

3. 添加自定义词典

3.1 添加词典

用法: jieba.load_userdict(file_name) file_name 为文件类对象或自定义词典的路径。

词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
例如:

创新办 3 i
云计算 5
凱特琳 nz
台中

3.2 调整词典

  1. add_word(word, freq=None, tag=None)del_word(word) 可在程序中动态修改词典。
  2. suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。

>>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中将/出错/。
>>> jieba.suggest_freq(('中', '将'), True)
494
>>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中/将/出错/。
>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台/中/」/正确/应该/不会/被/切开
>>> jieba.suggest_freq('台中', True)
69
>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台中/」/正确/应该/不会/被/切开

4. 关键词提取

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

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

    • sentence 为待提取的文本
    • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
    • withWeight 为是否一并返回关键词权重值,默认值为 False
    • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
  2. jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件

示例:

import sys
sys.path.append('../')

import jieba
import jieba.analyse
from optparse import OptionParser

USAGE = "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 = 10
else:
    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))

4.2 基于 TextRank 算法的关键词抽取

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

示例:

s = "此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。"
for x, w in jieba.analyse.textrank(s, withWeight=True):
    print('%s %s' % (x, w))

5. 词性标注

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

示例:

>>> 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模式词性标注对应表如下:

标签 含义 标签 含义 标签 含义 标签 含义
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 时间

6. 参考

https://github.com/fxsjy/jieba

欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;

也欢迎关注我的wx公众号:一个比特定乾坤

你可能感兴趣的:(NLP,自然语言处理,学习,nlp)