【问题标题】:Python - regex relation extractionPython - 正则表达式关系提取
【发布时间】:2015-04-04 17:57:46
【问题描述】:

作为学校作业的一部分,我们得到了这个代码:

>>> IN = re.compile(r'.*\bin\b(?!\b.+ing)')
>>> for doc in nltk.corpus.ieer.parsed_docs('NYT_19980315'):
...     for rel in nltk.sem.extract_rels('ORG', 'LOC', doc,
...                corpus='ieer', pattern = IN):
...         print(nltk.sem.rtuple(rel))

我们被要求用我们自己的一些句子来试试看输出,所以为此我决定定义一个函数:

def extract(sentence):
    import re
    import nltk

    IN = re.compile(r'.*\bin\b(?!\b.+ing)')
    for rel in nltk.sem.extract_rels('ORG', 'LOC', sentence, corpus='ieer', pattern = IN):
        print(nltk.sem.rtuple(rel))

当我尝试运行这段代码时:

>>> from extract import extract
>>> extract("The Whitehouse in Washington")

我得到了令人发指的错误:

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    extract("The Whitehouse in Washington")
  File "C:/Python34/My Scripts\extract.py", line 6, in extract
    for rel in nltk.sem.extract_rels('ORG', 'LOC', sentence, corpus='ieer', pattern = IN):
  File "C:\Python34\lib\site-packages\nltk\sem\relextract.py", line 216, in extract_rels
    pairs = tree2semi_rel(doc.text) + tree2semi_rel(doc.headline)
AttributeError: 'str' object has no attribute 'text'

谁能帮助我了解我的功能哪里出了问题? 测试句的正确输出应该是:

[ORG: 'Whitehouse'] 'in' [LOC: 'Washington']

【问题讨论】:

  • nltk.corpus.ieer.parsed_docs('NYT_19980315') 返回什么?它应该是nltk.corpus.reader.ieer.parsed_docs() 吗?它看起来(基于您的代码)就像它返回具有 text 属性的对象列表,而您只是使用字符串。你能创建那些对象(不管它们是什么)吗?
  • @KSFT >>> c = nltk.corpus.ieer.parsed_docs('NYT_19980315') >>> c[1] 返回 = 除此之外,我和你一样知道这是我们得到的一切
  • 您的 extract 函数错过了 for doc in nltk.corpus.ieer.parsed_docs('NYT_19980315'): 行。会不会是问题?
  • @stribizhev 我相信该行正在从语料库中提取许多文档(字符串?),然后检查这些字符串以找到关系。但是,我想使用自己的自定义字符串,而不是使用语料库中的字符串。

标签: python regex nltk


【解决方案1】:

如果您看到extract_rels 的方法定义,它期望解析的文档作为第三个参数。
在这里,您正在传递句子。要克服此错误,您可以执行以下操作:

tagged_sentences = [ nltk.pos_tag(token) for token in tokens]
class doc():
    pass
IN = re.compile(r'.*\bin\b(?!\b.+ing)')
doc.headline=["test headline for sentence"]
for i,sent in enumerate(tagged_sentences):
    doc.text = nltk.ne_chunk(sent)
    for rel in nltk.sem.relextract.extract_rels('ORG', 'LOC', doc, corpus='ieer', pattern=IN):
        print(nltk.sem.rtuple(rel) )// you can change it according

试试看..!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2017-05-13
    相关资源
    最近更新 更多