gpt4 book ai didi

python - 在 NLTK 中使用 block 标签(而非 NER)在句子中创建关系 |自然语言处理

转载 作者:太空狗 更新时间:2023-10-29 23:56:47 24 4
gpt4 key购买 nike

我正在尝试创建自定义 block 标签并从中提取关系。以下是将我带到级联 block 树的代码。

grammar = r"""
NPH: {<DT|JJ|NN.*>+} # Chunk sequences of DT, JJ, NN
PPH: {<IN><NP>} # Chunk prepositions followed by NP
VPH: {<VB.*><NP|PP|CLAUSE>+$} # Chunk verbs and their arguments
CLAUSE: {<NP><VP>} # Chunk NP, VP
"""
cp = nltk.RegexpParser(grammar)
sentence = [("Mary", "NN"), ("saw", "VBD"), ("the", "DT"), ("cat", "NN"),
("sit", "VB"), ("on", "IN"), ("the", "DT"), ("mat", "NN")]


chunked = cp.parse(sentence)

输出-

(小号 (NPH 玛丽/NN) 锯/VBD (NPH/DT猫/NN) 坐/VB 打开/输入 (NPH the/DT垫/NN))

现在我尝试使用 nltk.sem.extract_rels 函数提取 NPH 标记值与文本之间的关系,但它似乎仅适用于使用 ne_chunk 函数生成的命名实体。

IN = re.compile(r'.*\bon\b')
for rel in nltk.sem.extract_rels('NPH', 'NPH', chunked,corpus='ieer',pattern = IN):
print(nltk.sem.rtuple(rel))

这给出了以下错误 -

ValueError:您的主题类型值未被识别:NPH

有没有一种简单的方法只使用 block 标签来创建关系,因为我真的不想重新训练 NER 模型来检测我的 block 标签作为各自的命名实体

谢谢!

最佳答案

  1. extract_rels ( doc )检查参数 subjclassobjclass 是否是已知的 NE 标签,因此 NPH 出现错误。
  2. 简单的临时方法是重写自定义的 extract_rels 函数(如下例)。

    import nltk
    import re

    grammar = r"""
    NPH: {<DT|JJ|NN.*>+} # Chunk sequences of DT, JJ, NN
    PPH: {<IN><NP>} # Chunk prepositions followed by NP
    VPH: {<VB.*><NP|PP|CLAUSE>+$} # Chunk verbs and their arguments
    CLAUSE: {<NP><VP>} # Chunk NP, VP
    """
    cp = nltk.RegexpParser(grammar)
    sentence = [("Mary", "NN"), ("saw", "VBD"), ("the", "DT"), ("cat", "NN"),
    ("sit", "VB"), ("on", "IN"), ("the", "DT"), ("mat", "NN")]

    chunked = cp.parse(sentence)

    IN = re.compile(r'.*\bon\b')

    def extract_rels(subjclass, objclass, chunked, pattern):

    # padding because this function checks right context
    pairs = nltk.sem.relextract.tree2semi_rel(chunked) + [[[]]]

    reldicts = nltk.sem.relextract.semi_rel2reldict(pairs)

    relfilter = lambda x: (x['subjclass'] == subjclass and
    pattern.match(x['filler']) and
    x['objclass'] == objclass)


    return list(filter(relfilter, reldicts))

    for e in extract_rels('NPH', 'NPH', chunked, pattern=IN):
    print(nltk.sem.rtuple(e))

    输出:

    [NPH: 'the/DT cat/NN'] 'sit/VB on/IN' [NPH: 'the/DT mat/NN']

关于python - 在 NLTK 中使用 block 标签(而非 NER)在句子中创建关系 |自然语言处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51390568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com