LTP4 文档¶
开始使用LTP¶
如果你是第一次使用LTP,不妨花一些时间了解LTP能帮你做什么。
LTP提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、词性标注、句法分析等等工作。从应用角度来看,LTP为用户提供了下列组件:
针对单一自然语言处理任务,生成统计机器学习模型的工具
针对单一自然语言处理任务,调用模型进行分析的编程接口
系统可调用的,用于中文语言处理的模型文件
针对单一自然语言处理任务,基于云端的编程接口
如果你的公司需要一套高性能的中文语言分析工具以处理海量的文本,或者你的在研究工作建立在一系列底层中文自然语言处理任务之上,或者你想将自己的科研成果与前沿先进工作进行对比,LTP都可能是你的选择。
快速上手¶
用户自定义词典¶
负重前行 长江大桥
``` .. code-block:: python
from ltp import LTP ltp = LTP() # user_dict.txt 是词典文件, max_window是最大前向分词窗口 ltp.init_dict(path=”user_dict.txt”, max_window=4) # 也可以在代码中添加自定义的词语 ltp.add_words(words=[“负重前行”, “长江大桥”], max_window=4)
分句¶
使用LTP分句只需要调用ltp.sent_split函数
from ltp import LTP
ltp = LTP()
sents = ltp.sent_split(["他叫汤姆去拿外衣。", "汤姆生病了。他去了医院。"])
# [
# "他叫汤姆去拿外衣。",
# "汤姆生病了。",
# "他去了医院。"
# ]
分词¶
使用LTP分词非常简单,下面是一个简短的例子:
from ltp import LTP
ltp = LTP()
segment, _ = ltp.seg(["他叫汤姆去拿外衣。"])
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
词性标注¶
from ltp import LTP
ltp = LTP()
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
pos = ltp.pos(hidden)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [['r', 'v', 'nh', 'v', 'v', 'n', 'wp']]
命名实体识别¶
from ltp import LTP
ltp = LTP()
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
ner = ltp.ner(hidden)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [[('Nh', 2, 2)]]
tag, start, end = ner[0][0]
print(tag,":", "".join(seg[0][start:end + 1]))]
# Nh : 汤姆
语义角色标注¶
from ltp import LTP
ltp = LTP()
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
srl = ltp.srl(hidden)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [
# [
# [], # 他
# [('ARG0', 0, 0), ('ARG1', 2, 2), ('ARG2', 3, 5)], # 叫 -> [ARG0: 他, ARG1: 汤姆, ARG2: 拿外衣]
# [], # 汤姆
# [], # 去
# [('ARG0', 2, 2), ('ARG1', 5, 5)], # 拿 -> [ARG0: 汤姆, ARG1: 外衣]
# [], # 外衣
# [] # 。
# ]
# ]
srl = ltp.srl(hidden, keep_empty=False)
# [
# [
# (1, [('ARG0', 0, 0), ('ARG1', 2, 2), ('ARG2', 3, 5)]), # 叫 -> [ARG0: 他, ARG1: 汤姆, ARG2: 拿外衣]
# (4, [('ARG0', 2, 2), ('ARG1', 5, 5)]) # 拿 -> [ARG0: 汤姆, ARG1: 外衣]
# ]
# ]
依存句法分析¶
需要注意的是,在依存句法当中,虚节点ROOT占据了0位置,因此节点的下标从1开始。
from ltp import LTP
ltp = LTP()
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
dep = ltp.dep(hidden)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [
# [
# (1, 2, 'SBV'),
# (2, 0, 'HED'), # 叫 --|HED|--> ROOT
# (3, 2, 'DBL'),
# (4, 2, 'VOB'),
# (5, 4, 'COO'),
# (6, 5, 'VOB'),
# (7, 2, 'WP')
# ]
# ]
语义依存分析(树)¶
与依存句法类似的,这里的下标也是从1开始。
from ltp import LTP
ltp = LTP()
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
sdp = ltp.sdp(hidden, graph=False)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [
# [
# (1, 2, 'Agt'),
# (2, 0, 'Root'), # 叫 --|Root|--> ROOT
# (3, 2, 'Datv'),
# (4, 2, 'eEfft'),
# (5, 4, 'eEfft'),
# (6, 5, 'Pat'),
# (7, 2, 'mPunc')
# ]
# ]
语义依存分析(图)¶
与依存句法类似的,这里的下标也是从1开始。
from ltp import LTP
ltp = LTP()
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
sdp = ltp.sdp(hidden, graph=True)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [
# [
# (1, 2, 'Agt'),
# (2, 0, 'Root'), # 叫 --|Root|--> ROOT
# (3, 2, 'Datv'),
# (3, 4, 'Agt'),
# (3, 5, 'Agt'),
# (4, 2, 'eEfft'),
# (5, 4, 'eEfft'),
# (6, 5, 'Pat'),
# (7, 2, 'mPunc')
# ]
# ]
LTP Server¶
LTP Server 是对 LTP 的一个简单包装,依赖于 tornado,使用方式如下:
pip install ltp, tornado
python utils/server.py serve
性能¶
词性标注模块¶
与分词模块相同,我们将词性标注任务建模为基于词的序列标注问题。对于输入句子的词序列,模型给句子中的每个词标注一个标识词边界的标记。在LTP中,我们采用的北大标注集。关于北大标注集信息,请参考:
基础模型在人民日报数据集上的性能如下:
语料信息:人民日报1998年2月-6月(后10%数据作为开发集)作为训练数据,1月作为测试数据。
ACC
开发集
98.2%
测试集
98.2%
命名实体识别模块¶
与分词模块相同,我们将命名实体识别建模为基于词的序列标注问题。对于输入句子的词序列,模型给句子中的每个词标注一个标识命名实体边界和实体类别的标记。在LTP中,我们支持人名、地名、机构名三类命名实体的识别。关于LTP使用的标记参考附录。
基础模型在人民日报数据集上的性能如下:
语料信息:人民日报1998年1月做训练(后10%数据作为开发集),6月前10000句做测试作为训练数据。
F1
开发集
95.1
测试集
94.3
依存句法分析模块¶
依存句法分析模块的主要算法依据神经网络依存句法分析算法,Chen and Manning (2014)。同时加入丰富的全局特征和聚类特征。在模型训练时,我们也参考了Yoav等人关于dynamic oracle的工作。 在 Chinese Dependency Treebank(CDT) 数据集上,其中运行速度和内存开销从CDT测试集上结果中获得。
LAS
开发集
88.8
测试集
88.0