ltp数据地址:http://ltp.ai/download.html
分句
def test_split(self):#分句
sents = SentenceSplitter.split('人工智能是一门极富挑战性的科学。从事这项工作的人必须懂得计算机知识,心理学和哲学。') # 分句
print('\n'.join(sents))
结果
人工智能是一门极富挑战性的科学。
从事这项工作的人必须懂得计算机知识,心理学和哲学。
分词
def test_segment(self):
LTP_DATA_DIR = './ltp_data_v3.4.0' # ltp模型目录的路径
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model') # 分词模型路径,模型名称为`cws.model`
segmentor = Segmentor() # 初始化实例
segmentor.load(cws_model_path) # 加载模型
# segmentor.load_with_lexicon(cws_model_path, '/path/to/your/lexicon') # 加载模型,第二个参数是您的外部词典文件路径
words = segmentor.segment('人工智能是一门极富挑战性的科学') # 分词
print('\t'.join(words))
segmentor.release() # 释放模型
结果
人工智能 是 一 门 极 富 挑战性 的 科学
个性化分词
个性化分词是LTP的特色功能。个性化分词为了解决测试数据切换到如小说、财经等不同于新闻领域的领域。 在切换到新领域时,用户只需要标注少量数据。 个性化分词会在原有新闻数据基础之上进行增量训练。 从而达到即利用新闻领域的丰富数据,又兼顾目标领域特殊性的目的。
https://ltp.readthedocs.io/zh_CN/latest/theory.html#customized-cws-reference-label
词性标注
LTP 使用 863 词性标注集,详细请参考 词性标注集 :https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id3
LTP_DATA_DIR = './ltp_data_v3.4.0' # ltp模型目录的路径
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model') # 词性标注模型路径,模型名称为`pos.model`
postagger = Postagger() # 初始化实例
postagger.load(pos_model_path) # 加载模型
words = ["人工智能","是","一","门","科学"] # 分词结果
postags = postagger.postag(words) # 词性标注
print('\t'.join(postags))
postagger.release() # 释放模型
注意:可以使用词性标注外部词典
实体识别
LTP_DATA_DIR = './ltp_data_v3.4.0' # ltp模型目录的路径
ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model') # 命名实体识别模型路径,模型名称为`pos.model`
recognizer = NamedEntityRecognizer() # 初始化实例
recognizer.load(ner_model_path) # 加载模型
words = ["数学","是","科学"]
postags = ['nh', 'v','n']
netags = recognizer.recognize(words, postags) # 命名实体识别
print('\t'.join(netags))
recognizer.release() # 释放模型
LTP 使用 863 词性标注集,详细请参考 词性标注集 :https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id4
依存句法分析
LTP_DATA_DIR = './ltp_data_v3.4.0' # ltp模型目录的路径
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model') # 依存句法分析模型路径,模型名称为`parser.model`
parser = Parser() # 初始化实例
parser.load(par_model_path) # 加载模型
words = ["数学","是","科学"]
postags = ['nh', 'v','n']
arcs = parser.parse(words, postags) # 句法分析
print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs))
parser.release() # 释放模型
arc.head 表示依存弧的父节点词的索引。ROOT节点的索引是0,第一个词开始的索引依次为1、2、3…
arc.relation 表示依存弧的关系。
arc.head 表示依存弧的父节点词的索引,arc.relation 表示依存弧的关系。
标注:https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id5
语义角色标注
LTP_DATA_DIR = './ltp_data_v3.4.0' # ltp模型目录的路径
srl_model_path = os.path.join(LTP_DATA_DIR, 'pisrl.model') # 语义角色标注模型目录路径,模型目录为`srl`。注意该模型路径是一个目录,而不是一个文件。
from pyltp import SementicRoleLabeller
labeller = SementicRoleLabeller() # 初始化实例
labeller.load(srl_model_path) # 加载模型
# arcs 使用依存句法分析的结果
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model') # 依存句法分析模型路径,模型名称为`parser.model`
parser = Parser() # 初始化实例
parser.load(par_model_path) # 加载模型
words = ["数学", "是", "科学"]
postags = ['nh', 'v', 'n']
arcs = parser.parse(words, postags) # 句法分析
roles = labeller.label(words, postags, arcs) # 语义角色标注
# 打印结果
for role in roles:
print(role.index, "".join(
["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))
labeller.release() # 释放模型
第一个词开始的索引依次为0、1、2…
返回结果 roles 是关于多个谓词的语义角色分析的结果。由于一句话中可能不含有语义角色,所以结果可能为空。
role.index 代表谓词的索引, role.arguments 代表关于该谓词的若干语义角色。
arg.name 表示语义角色类型,arg.range.start 表示该语义角色起始词位置的索引,arg.range.end 表示该语义角色结束词位置的索引。
arg.name 表示语义角色关系,arg.range.start 表示起始词位置,arg.range.end 表示结束位置。
标注集请参考 语义角色关系 :https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id6