基于LTP的分句、分词、POS和依存句法分析
分句
#分句
from pyltpimport SentenceSplitter
sentence = SentenceSplitter.split('我是逗号,我是句号。我是问号?我是感叹号!')
print('\n'.join(sentence))
分词+自定义词典
没加入自定义词典之前的结果如下:
火箭|少女|是|国内|新生|少女|组合|。
新建词典文件lexicon(自定义),每个自定义词一行。如下:
自定义词典加入自定义词典之后的分词结果:
火箭少女|是|国内|新生|少女|组合|。
参考代码:
#分词
import os
LTP_DATA_DIR ='/Users/***/ltp_data' # ltp模型目录的路径
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')# 分词模型路径,模型名称为`cws.model`
lexicon_path = os.path.join(LTP_DATA_DIR, 'lexicon')# 分词词典lexicon
from pyltpimport Segmentor
segmentor = Segmentor()# 初始化实例
# segmentor.load(cws_model_path) # 加载模型,如果不想自定义词典,就用这一句load模型即可
segmentor.load_with_lexicon(cws_model_path,lexicon_path)# 加载模型,参数lexicon是自定义词典的文件路径
words = segmentor.segment('火箭少女是国内新生少女组合。')# 分词
print('|'.join(words))#打印分词结果
segmentor.release()# 释放模型
词性标注POS
结果:
火箭少女|是|国内|新生|少女|组合|。
n | v | nl | n | n | v | wp
代码:
#词性标注
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')# 词性标注模型路径,模型名称为`pos.model`
from pyltpimport Postagger
postagger = Postagger()# 初始化实例
postagger.load(pos_model_path)# 加载模型
postags = postagger.postag(words)# 词性标注,这里words是分词后的list
print(' | '.join(postags))
postagger.release()# 释放模型
更多词性标注结果,见下图,截图自LTP
词性标注解释命名实体识别
LTP提供最基本的三种实体类型人名、地名、机构名的识别。
代码:
#命名实体识别
ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model')# 命名实体识别模型路径,模型名称为`ner.model`
from pyltpimport NamedEntityRecognizer
recognizer = NamedEntityRecognizer()# 初始化实例
recognizer.load(ner_model_path)# 加载模型
nertags = recognizer.recognize(words, postags)# 命名实体识别,其中words, postags分别是分词和词性标注的结果List
print(' | '.join(nertags))
recognizer.release()# 释放模型
依存句法分析
依存句法分析结果代码:
#依存句法分析
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')# 依存句法分析模型路径,模型名称为`parser.model`
from pyltpimport Parser
parser = Parser()# 初始化实例
parser.load(par_model_path)# 加载模型
arcs = parser.parse(words, postags)# 句法分析
#信息提取,结果展示
rely_id = [arc.headfor arcin arcs]# 提取依存父节点id
relation = [arc.relationfor arcin arcs]# 提取依存关系
heads = ['Root' if id ==0 else words[id-1]for idin rely_id]# 匹配依存父节点词语
for iin range(len(words)):
print(relation[i] +'(' + words[i] +', ' + heads[i] +')')
parser.release()# 释放模型
更多依存句法分析标注结果,见下图,截图自LTP
依存句法分析参考LTP还提供了语义角色标注和语义依存分词,项目中暂时不用,稍后再学习。