HIT-SCIR / pyltp

pyltp: the python extension for LTP
1.53k stars 353 forks source link

pyltp中怎么按列输出词、词性、父节点词性、句法依存关系、语义依存关系? #152

Closed yongyuan923 closed 5 years ago

yongyuan923 commented 6 years ago

问题1语义角色关系不能按分词的词语按列输出

代码片段

-- coding: utf-8 --

import os from pyltp import SentenceSplitter from pyltp import Postagger from pyltp import Segmentor from pyltp import NamedEntityRecognizer
from pyltp import Parser

模型路径

LTP_DATA_DIR = 'F:/LTP_cs/ltp_data' # ltp模型目录的路径
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model') # 分词模型路径,模型名称为cws.model
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')

初始化实例化

segmentor = Segmentor() postagger = Postagger() parser = Parser()

加载模型路径

segmentor.load(cws_model_path)

segmentor.load_with_lexicon(cws_model_path,'F:\LTP_cs\ltp_data\lexicon.txt') postagger.load(pos_model_path) parser.load(par_model_path)

分句

sent=SentenceSplitter.split(“速度很快,信号强,照相清晰。”)

分词

words_list=[] for s1 in sent: words = segmentor.segment(s1) # 分词 words=[w for w in words] postags = postagger.postag(words)) arcs = parser.parse(words, postags) for word,tag, arc in zip(words,postags,arcs): print ((word.strip()+"\t"+'/'+tag)+"\t"+"%d:%s" % (arc.head, arc.relation)+"\n")# for arc in arcs)

释放模型

segmentor.release() postagger.release()

recognizer.release()

parser.release()

现在能够输出词、词性、句法

default

运行环境

win7 Python3.6.0 pyltp 0.2.1

期望结果

ltp1 请问能够输出按列词、词性、父节点词性、句法依存关系、语义依存关系?——》如上图的结果输出。 每次在最后一列输出语义关系都是数据类型不对,如果我单独输出的话就能够正常输出? 我只是想把有语义关系的输出,没有语义关系的就用其他代替或者空白。

其他

还有一个问题就是:加载了分词的词典,比如“信号强”这个词,我的词典设置是“信号”、“强”两个词,但是我在Python中输出的结果就是一个词。而且词典里面的一个词也没有加载进来,但程序输出的时候也显示了加载了多少外部词典。

我知道这个不是pyltp技术问题,不知道能不能在这个版块问此问题,还是想请知道的能够给予帮助。望回复,谢谢!

mashagua commented 6 years ago

好像词典是加入不进去,我也遇到这个问题,同求

yongyuan923 commented 6 years ago

我曾经也问过这个问题。。 刘洋老师的回答:“ltp分词为概率模型。而且分词是前后有依赖的,不能保证分词结果一致。在系统实现方面可能没有办法帮你解决问题。你可以尝试预、后处理,或者使用两个不同的模型预测之后再整合结果。如果你希望将所有出现在词表中的词都准确分出,可以进行后处理。” 我最开始只用了五六句去分词,发现没有一个是按词典输入的那样分词。然后我就用了两千多句子拿进去分词,出现的情况是:比如“性价比”,部分分词的结果是“性价比”;另一部分就是“性价”、“比”两个词。这可能就是概率模型的原因。 后面因为我要使用语义相关的。我就直接用的API方法输出,没有加载词典了。 回答的比较凌乱,希望你能看懂。

jiangweisuc commented 5 years ago

你用pyltp怎么做语义依存分析的?谢谢哈@yongyuan923

liu946 commented 5 years ago

我们采用的语义分析的语义角色标注任务,是一种抽取句中“谓词”与“论元”(目前论元定义为句子片段),并标注其关系的任务。因为一句话中可能存在多个谓词,语义角色标注的结果无法表示为一列标签。不过可以参考Conll2012的表示方法,将ltp输出的结果进行转化。格式参考 https://conll.cemantix.org/2012/data.html 中的 12:N Predicate Arguments 字段。 我尝试使用如下代码格式化为此issue描述的格式,希望有所帮助(接本仓库 example/example.py ):

srl_as_tag_matrix = [['*'] * len(roles) for _ in sentence]
for predicate_id, role in enumerate(roles):
    srl_as_tag_matrix[role.index][predicate_id] = '(V*)'
    for arg in role.arguments:
        srl_as_tag_matrix[arg.range.start][predicate_id] = '(%s*' % arg.name
        srl_as_tag_matrix[arg.range.end][predicate_id] += ')'

for id, (word, pos, arc, ne, role) in enumerate(zip(words, postags, arcs, netags, srl_as_tag_matrix)):
    print('\t'.join([str(id), word, pos, str(arc.head), arc.relation, ne, '\t'.join(role)]))

输出为:

1           中国          ns          3           ATT         B-Ni        (A0*      
2           进出口         v           3           ATT         I-Ni        *         
3           银行          n           6           SBV         E-Ni        *)        
4           与           p           6           ADV         O           *         
5           中国银行        ni          4           POB         S-Ni        *         
6           加强          v           0           HED         O           (V*)      
7           合作          v           6           VOB         O           (A1*)     
8           。           wp          6           WP          O           *       
jiangweisuc commented 5 years ago

谢谢刘老师回复的这么详细,非常感谢

---原始邮件--- 发件人: "刘洋"notifications@github.com 发送时间: 2019年5月27日(星期一) 下午2:01 收件人: "HIT-SCIR/pyltp"pyltp@noreply.github.com; 抄送: "Comment"comment@noreply.github.com;"jiangweisuc"jiangwei_suc@foxmail.com; 主题: Re: [HIT-SCIR/pyltp] pyltp中怎么按列输出词、词性、父节点词性、句法依存关系、语义依存关系? (#152)

我们采用的语义分析的语义角色标注任务,是一种抽取句中“谓词”与“论元”(目前论元定义为句子片段),并标注其关系的任务。因为一句话中可能存在多个谓词,语义角色标注的结果无法表示为一列标签。不过可以参考Conll2012的表示方法,将ltp输出的结果进行转化。格式参考 https://conll.cemantix.org/2012/data.html 中的 12:N Predicate Arguments 字段。 我尝试使用如下代码格式为此issue描述的格式(接本仓库 example/example.py ): srl_as_tagmatrix = [[''] len(roles) for in sentence] for predicate_id, role in enumerate(roles): srl_as_tag_matrix[role.index][predicate_id] = '(V)' for arg in role.arguments: srl_as_tag_matrix[arg.range.start][predicate_id] = '(%s' % arg.name srl_as_tag_matrix[arg.range.end][predicate_id] += ')' for id, (word, pos, arc, ne, role) in enumerate(zip(words, postags, arcs, netags, srl_as_tag_matrix)): print('\t'.join([str(id), word, pos, str(arc.head), arc.relation, ne, '\t'.join(role)]))

输出为: 1 中国 ns 3 ATT B-Ni (A0 2 进出口 v 3 ATT I-Ni 3 银行 n 6 SBV E-Ni ) 4 与 p 6 ADV O 5 中国银行 ni 4 POB S-Ni 6 加强 v 0 HED O (V) 7 合作 v 6 VOB O (A1) 8 。 wp 6 WP O
— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or mute the thread.