LTP4.2 SRL 语义角色标注抽取知识图谱三元组

LTP4.2 版本更新后使用语法发生变化,下面演示使用新语法进行语义角色标注抽取三元组的使用方法。

代码:

# filename:SRL.py
# author:李杳然
# created:2022.11.25
# function:对事件语句进行语义角色标注。工具:LTP4。

from ltp import LTP
from ltp import StnSplit
ltp = LTP()
# LTP分句
sents = StnSplit().split("该僵尸网络包含至少35000个被破坏的Windows系统,攻击者和使用者正在秘密使用这些系统来开采Monero加密货币。该僵尸网络名为“ VictoryGate”,自2019年5月以来一直活跃。")


# 使用语义角色标注构造关系抽取
def srl_AtoA(sent):
    rst = ltp.pipeline([sent],tasks=["cws", "pos", "srl"])
    seg = rst.cws[0]
    srl = rst.srl[0]
    results = []
    for s in srl:
        key = s['predicate']
        values = s['arguments']
        start = ''
        end = ''
        for value in values:
            # 语义角色只需要获取A0,A1
            if value[0] == 'A0':
                start = value[1]
            if value[0] == 'A1':
                end = value[1]
        if start != '' and end != '':
            results.append((start,key,end))
    return results

for sent in sents:
    print('sent:', sent)
    results = srl_AtoA(sent)
    print('res:', results)

结果:

sent: 该僵尸网络包含至少35000个被破坏的Windows系统,攻击者和使用者正在秘密使用这些系统来开采Monero加密货币。
res: [('该僵尸网络', '包含', '至少35000个被破坏的Windows系统'), ('攻击者和使用者', '使用', '这些系统'), ('攻击者和使用者', '开采', 'Monero加密货币')]
sent: 该僵尸网络名为“ VictoryGate”,自20195月以来一直活跃。
res: [('名', '为', '“ VictoryGate”')]

LTP4更新后使用pipeline函数对文本语句进行处理,高级任务(如srl)前需包含分词任务cws,通过调用任务结果查询函数或下标访问结果。

你可能感兴趣的:(知识图谱,自然语言处理,nlp)