文章目录
中文 NLP 工具总结
前言: 最近由于实验室研究需要,需要调研一下目前已有的中文 NLP 工具,于是在调研完了之后就写了这篇总结,如果哪里有错误还请指出。
1. Jieba 分词
1.1 简介
官网介绍:“结巴”中文分词:做最好的 Python 中文分词组件
但是不是最好的呢?详情见最后的横向对比。
GitHub地址:https://github.com/fxsjy/jieba
1.2 模型原理
- 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
- 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
- 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法
1.3 安装
安装方式很简单,只要一个命令即可:
pip install jieba
#或者
pip3 install jieba
1.4 使用
# encoding=utf-8
import jieba
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算法识别出来了)
【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
1.5 分词评测
ctb6 | msra | pku | |
---|---|---|---|
jieba | 80.79 | 81.45 | 81.82 |
2. pyltp——哈工大
2.1 简介
pyltp 是 LTP 的 Python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能。
官网:https://ltp.readthedocs.io/zh_CN/latest/begin.html
官方pyltp介绍:https://pyltp.readthedocs.io/zh_CN/develop/api.html
标注体系等详细介绍:http://www.ltp-cloud.com/intro
GitHub 主页:https://github.com/HIT-SCIR/pyltp
2.2 模型原理
2.2.1 分词
基于字的序列标注,对于输入句子的字序列,模型给句子中的每个字标注一个标识词边界的标记,通过机器学习算法框架从标注数据中学习参数。
2.2.2 词性标注
与分词模块相同,将词性标注任务建模为基于词的序列标注问题。对于输入句子的词序列,模型给句子中的每个词标注一个标识词边界的标记。
2.2.3 依存分析
依存句法分析模块的主要算法依据神经网络依存句法分析算法,Chen and Manning (2014)。同时加入丰富的全局特征和聚类特征。在模型训练时,我们也参考了Yoav等人关于dynamic oracle的工作。
2.3 安装
- 安装
pyltp
的包
pip install pyltp
目前最新的模型是 3.4.0
,解压之……
2.4 使用
2.4.1 分词
# -*- coding: utf-8 -*-
import os
LTP_DATA_DIR = '/home/username/pyltp/ltp_model' # ltp模型目录的路径
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model') # 分词模型路径,模型名称为`cws.model`
from pyltp import Segmentor
segmentor = Segmentor() # 初始化实例
segmentor.load(cws_model_path) # 加载模型
words = segmentor.segment('元芳你怎么看') # 分词
print(list(words))
for word in list(words):
print(word)
segmentor.release() # 释放模型
输出:
['元芳', '你', '怎么', '看']
元芳
你
怎么
看
2.4.2 词性标注
# -*- coding: utf-8 -*-
import os
LTP_DATA_DIR = '/home/knight/pyltp/ltp_model' # ltp模型目录的路径
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model') # 词性标注模型路径,模型名称为`pos.model`
from pyltp import Postagger
postagger = Postagger() # 初始化实例
postagger.load(pos_model_path) # 加载模型
words = ['元芳', '你', '怎么', '看'] # 分词结果
postags = postagger.postag(words) # 词性标注
print('\t'.join(postags))
postagger.release() # 释放模型
输出:
nh r r v
2.4.3 依存分析
# -*- coding: utf-8 -*-
import os
LTP_DATA_DIR =<