本文将介绍jieba、HanLP、LAC、THULAC、NLPIR、spacy等多种常用的Python中文分词工具的简单使用方法。
官方GitHub项目:fxsjy/jieba: 结巴中文分词
安装方式:pip install jieba
精确模式:jieba.cut(text)
返回一个迭代器,每个元素是一个词语。(lcut()
直接返回list)
import jieba
print(' '.join(jieba.cut('行动才是果实,言辞不过是枝叶。')))
输出:
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 0.455 seconds.
Prefix dict has been built successfully.
行动 才 是 果实 , 言辞 不过 是 枝叶 。
cut()
函数的参数:
HMM
:发现新词功能,自动计算的词频(下文自定义词典部分)可能无效。use_paddle
:paddle模式:使用后无法自定义词典,据我猜测应该跟LAC包一样,所以不如直接用LAC包。使用jieba.enable_parallel()
可以开启并行分词模式(按行分隔文本),不支持Windows。入参是并行进程数,如无入参默认为CPU个数。
jieba.disable_parallel()
关闭并行分词模式
①添加自定义词典:jieba.load_userdict(file_name)
file_name 为文件类对象或自定义词典的路径。
词典格式和 https://github.com/fxsjy/jieba/blob/master/jieba/dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
词频省略时使用自动计算的能保证分出该词的词频。
②调整词典:add_word(word, freq=None, tag=None)
和 del_word(word)
可在程序中动态修改词典。
使用 suggest_freq(segment, tune=True)
可调节单个词语的词频,使其能(或不能)被分出来。
使用自定义词典的示例:https://github.com/fxsjy/jieba/blob/master/test/test_userdict.py
使用jieba.posseg
替换jieba
,还能返回词性标注。
使用jieba.tokenize()
还能返回词语在原文中的起止位置,入参只接受Unicode。
如果只有用户文件夹的权限而没有/tmp
的权限,则会报警告信息,可以改变分词器(默认为jieb.dt
)的tmp_dir
和cache_file
属性来解决这一问题。
官方GitHub项目:hankcs/HanLP: 中文分词 词性标注 命名实体识别 依存句法分析 成分句法分析 语义依存分析 语义角色标注 指代消解 风格转换 语义相似度 新词发现 关键词短语提取 自动摘要 文本分类聚类 拼音简繁转换 自然语言处理
官网:HanLP在线演示 多语种自然语言处理
需要申请密钥,因此还没用过,待补。
官方GitHub项目:baidu/lac: 百度NLP:分词,词性标注,命名实体识别,词重要性
论文引用:
@article{jiao2018LAC,
title={Chinese Lexical Analysis with Deep Bi-GRU-CRF Network},
author={Jiao, Zhenyu and Sun, Shuqi and Sun, Ke},
journal={arXiv preprint arXiv:1807.01882},
year={2018},
url={https://arxiv.org/abs/1807.01882}
}
安装方式 :pip install lac
或 pip install lac -i https://mirror.baidu.com/pypi/simple
extracted_sentences="随着企业持续产生的商品销量,其数据对于自身营销规划、市场分析、物流规划都有重要意义。但是销量预测的影响因素繁多,传统的基于统计的计量模型,比如时间序列模型等由于对现实的假设情况过多,导致预测结果较差。因此需要更加优秀的智能AI算法,以提高预测的准确性,从而助力企业降低库存成本、缩短交货周期、提高企业抗风险能力。"
from LAC import LAC
lac=LAC(mode='seg') #默认值mode='lac'会附带词性标注功能,对应的标签见后文
seg_result=lac.run(extracted_sentences) #以Unicode字符串为入参
print(seg_result)
seg_result=lac.run(extracted_sentences.split(',')) #以字符串列表为入参,平均速率会更快
print(seg_result)
输出:
W0625 20:03:29.850801 32781 init.cc:157] AVX is available, Please re-compile on local machine
W0625 20:03:29.868482 32781 analysis_predictor.cc:518] - GLOG's LOG(INFO) is disabled.
W0625 20:03:29.868522 32781 init.cc:157] AVX is available, Please re-compile on local machine
--- Running analysis [ir_graph_build_pass]
--- Running analysis [ir_graph_clean_pass]
--- Running analysis [ir_analysis_pass]
--- Running IR pass [simplify_with_basic_ops_pass]
--- Running IR pass [attention_lstm_fuse_pass]
--- Running IR pass [seqconv_eltadd_relu_fuse_pass]
--- Running IR pass [seqpool_cvm_concat_fuse_pass]
--- Running IR pass [fc_lstm_fuse_pass]
--- Running IR pass [mul_lstm_fuse_pass]
--- Running IR pass [fc_gru_fuse_pass]
--- Running IR pass [mul_gru_fuse_pass]
--- Running IR pass [seq_concat_fc_fuse_pass]
--- Running IR pass [fc_fuse_pass]
--- Running IR pass [repeated_fc_relu_fuse_pass]
--- Running IR pass [squared_mat_sub_fuse_pass]
--- Running IR pass [conv_bn_fuse_pass]
--- Running IR pass [conv_eltwiseadd_bn_fuse_pass]
--- Running IR pass [is_test_pass]
--- Running IR pass [runtime_context_cache_pass]
--- Running analysis [ir_params_sync_among_devices_pass]
--- Running analysis [adjust_cudnn_workspace_size_pass]
--- Running analysis [inference_op_replace_pass]
--- Running analysis [ir_graph_to_program_pass]
['随着', '企业', '持续', '产生', '的', '商品', '销量', ',', '其', '数据', '对于', '自身', '营销', '规划', '、', '市场分析', '、', '物流', '规划', '都', '有', '重要', '意义', '。', '但是', '销量', '预测', '的', '影响', '因素', '繁多', ',', '传统', '的', '基于', '统计', '的', '计量', '模型', ',', '比如', '时间', '序列', '模型', '等', '由于', '对', '现实', '的', '假设', '情况', '过多', ',', '导致', '预测', '结果', '较差', '。', '因此', '需要', '更加', '优秀', '的', '智能', 'AI', '算法', ',', '以', '提高', '预测', '的', '准确性', ',', '从而', '助力', '企业', '降低', '库存', '成本', '、', '缩短', '交货', '周期', '、', '提高', '企业', '抗', '风险', '能力', '。']
[['随着', '企业', '持续', '产生', '的', '商品', '销量'], ['其', '数据', '对于', '自身', '营销', '规划', '、', '市场分析', '、', '物流', '规划', '都', '有', '重要', '意义', '。', '但是', '销量', '预测', '的', '影响', '因素', '繁多'], ['传统', '的', '基于', '统计', '的', '计量', '模型'], ['比如', '时间', '序列', '模型', '等', '由于', '对', '现实', '的', '假设', '情况', '过多'], ['导致', '预测', '结果', '较差', '。', '因此', '需要', '更加', '优秀', '的', '智能', 'AI', '算法'], ['以', '提高', '预测', '的', '准确性'], ['从而', '助力', '企业', '降低', '库存', '成本', '、', '缩短', '交货', '周期', '、', '提高', '企业', '抗', '风险', '能力', '。']]
词性标注功能的标签:
使用自定义词典:item将不会被分割。
词典文件每行表示一个定制化的item,由一个单词或多个连续的单词组成,每个单词后使用’/‘表示标签,如果没有’/'标签则会使用模型默认的标签。每个item单词数越多,干预效果会越精准。
词典文件示例:
春天/SEASON
花/n 开/v
秋天的风
落 阳
在run()
之前就使用代码:
# 装载干预词典, sep参数表示词典文件采用的分隔符,为None时默认使用空格或制表符'\t'
lac.load_customization('custom.txt', sep=None)
官网:THULAC:一个高效的中文词法分析工具包
在线演示网址:THULAC:一个高效的中文词法分析工具包
我看到说模型下载需要申请,因此还没使用过,待补。
官方GitHub项目:NLPIR-team/NLPIR
官网:NLPIR自然语言处理与信息检索共享平台 – NLPIR Natural Language Processing & Information Retrieval Sharing Platform 自然语言处理、大数据实验室、智能语义平台 汉语分词、中文语义分析、中文信息处理、语义分析系统、中文知识图谱、大数据分析工具
NLPIR汉语分词系统官网:NLPIR-ICTCLAS汉语分词系统-首页
看了一下这个还需要下载软件,感觉用起来不方便,如果以后真的需要了再补吧。
spacy模型官网:Trained Models & Pipelines · spaCy Models Documentation
extracted_sentences="随着企业持续产生的商品销量,其数据对于自身营销规划、市场分析、物流规划都有重要意义。但是销量预测的影响因素繁多,传统的基于统计的计量模型,比如时间序列模型等由于对现实的假设情况过多,导致预测结果较差。因此需要更加优秀的智能AI算法,以提高预测的准确性,从而助力企业降低库存成本、缩短交货周期、提高企业抗风险能力。"
import zh_core_web_sm
nlp = zh_core_web_sm.load()
doc = nlp(extracted_sentences)
print([(w.text, w.pos_) for w in doc])
输出:[('随着', 'ADP'), ('企业', 'NOUN'), ('持续', 'ADV'), ('产生', 'VERB'), ('的', 'PART'), ('商品', 'NOUN'), ('销量', 'NOUN'), (',', 'PUNCT'), ('其', 'PRON'), ('数据', 'NOUN'), ('对于', 'ADP'), ('自身', 'PRON'), ('营销', 'NOUN'), ('规划', 'NOUN'), ('、', 'PUNCT'), ('市场', 'NOUN'), ('分析', 'NOUN'), ('、', 'PUNCT'), ('物流', 'NOUN'), ('规划', 'NOUN'), ('都', 'ADV'), ('有', 'VERB'), ('重要', 'ADJ'), ('意义', 'NOUN'), ('。', 'PUNCT'), ('但是', 'ADV'), ('销量', 'VERB'), ('预测', 'NOUN'), ('的', 'PART'), ('影响', 'NOUN'), ('因素', 'NOUN'), ('繁多', 'VERB'), (',', 'PUNCT'), ('传统', 'ADJ'), ('的', 'PART'), ('基于', 'ADP'), ('统计', 'NOUN'), ('的', 'PART'), ('计量', 'NOUN'), ('模型', 'NOUN'), (',', 'PUNCT'), ('比如', 'ADV'), ('时间', 'NOUN'), ('序列', 'NOUN'), ('模型', 'NOUN'), ('等', 'PART'), ('由于', 'ADP'), ('对', 'ADP'), ('现实', 'NOUN'), ('的', 'PART'), ('假设', 'NOUN'), ('情况', 'NOUN'), ('过', 'ADV'), ('多', 'VERB'), (',', 'PUNCT'), ('导致', 'VERB'), ('预测', 'NOUN'), ('结果', 'NOUN'), ('较', 'ADV'), ('差', 'VERB'), ('。', 'PUNCT'), ('因此', 'ADV'), ('需要', 'VERB'), ('更加', 'ADV'), ('优秀', 'VERB'), ('的', 'PART'), ('智能', 'NOUN'), ('AI算法', 'NOUN'), (',', 'PUNCT'), ('以', 'PART'), ('提高', 'VERB'), ('预测', 'NOUN'), ('的', 'PART'), ('准确性', 'NOUN'), (',', 'PUNCT'), ('从而', 'ADV'), ('助力', 'NOUN'), ('企业', 'NOUN'), ('降低', 'VERB'), ('库存', 'NOUN'), ('成本', 'NOUN'), ('、', 'PUNCT'), ('缩短', 'VERB'), ('交货', 'VERB'), ('周期', 'NOUN'), ('、', 'PUNCT'), ('提高', 'VERB'), ('企业', 'NOUN'), ('抗', 'NOUN'), ('风险', 'NOUN'), ('能力', 'NOUN'), ('。', 'PUNCT')]
词性标注的标签可参考:Universal POS tags
官网:The Stanford Natural Language Processing Group
这个也需要下载软件,还需要Java1.8+才能运行,对我来说有些麻烦。待补。