2015-04-04 16 views
1

由於我們拿到的這款代碼課業的一部分:Python的 - 正則表達式關係抽取

>>> 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") 

我得到gollowing錯誤:

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'] 
+0

'nltk.corpus.ieer.parsed_docs('NYT_19980315')'返回什麼?它應該是['nltk.corpus.reader.ieer.parsed_docs()'](http://www.nltk.org/api/nltk.corpus.reader.html#nltk.corpus.reader.ieer.IEERCorpusReader .parsed_docs)?它看起來(基於你的代碼)就像它返回一個包含'text'屬性的對象列表,而你只是使用字符串。你可以創建這些對象(不管它們是什麼)? – KSFT 2015-04-04 18:07:42

+0

@KSFT >>> c = nltk.corpus.ieer.parsed_docs('NYT_19980315') >>> c [1] returns = 除此之外,我和你一樣知道這就是我們所得到的全部 – hjalpmig 2015-04-04 18:27:29

+0

nltk.corpus.ieer.parsed_docs('NYT_19980315'):'line'中的'extract'函數錯過了'doc。這可能是問題嗎? – 2015-04-04 18:54:15

回答

0

如果你看到的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 

試一試.. !!!