【问题标题】:Getting AttributeError on nltk Textual entailment classifier在 nltk 文本蕴涵分类器上获取 AttributeError
【发布时间】:2016-02-08 20:48:02
【问题描述】:

我指的是该部分中的链接 http://www.nltk.org/book/ch06.html#recognizing-textual-entailment

def rte_features(rtepair):
    extractor = nltk.RTEFeatureExtractor(rtepair)
    features = {}
    features['word_overlap'] = len(extractor.overlap('word'))
    features['word_hyp_extra'] = len(extractor.hyp_extra('word'))
    features['ne_overlap'] = len(extractor.overlap('ne'))
    features['ne_hyp_extra'] = len(extractor.hyp_extra('ne'))
    return features
rtepair = nltk.corpus.rte.pairs(['rte3_dev.xml'])

extractor = nltk.RTEFeatureExtractor(rtepair)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-39-a7f96e33ba9e> in <module>()
----> 1 extractor = nltk.RTEFeatureExtractor(rtepair)

C:\Users\RAVINA\Anaconda2\lib\site-packages\nltk\classify\rte_classify.pyc in __init__(self, rtepair, stop, lemmatize)
     65 
     66         #Get the set of word types for text and hypothesis
---> 67         self.text_tokens = tokenizer.tokenize(rtepair.text)
     68         self.hyp_tokens = tokenizer.tokenize(rtepair.hyp)
     69         self.text_words = set(self.text_tokens)

AttributeError: 'list' object has no attribute 'text'

它是书中提到的确切代码,任何人都可以帮助我这里出了什么问题。 谢谢 拉维娜

【问题讨论】:

  • 这与书中提到的代码不完全相同:rtepair = nltk.corpus.rte.pairs(['rte3_dev.xml'])[33] 他们取列表的第 33 个元素,而不是整个列表。
  • 对不起,您弄错了,[33] 只是一个传说,提到了第 33 个代码 sn-p。 :-)
  • “为了说明这些特征的内容,我们检查了前面显示的文本/假设对 34 的一些属性:”。它们的意思是项目编号 34 (33 + 1)。

标签: python nltk text-classification


【解决方案1】:

看看类型签名。在 python shell 中输入:

import nltk
x = nltk.corpus.rte.pairs(['rte3_dev.xml'])
type(x)

告诉你x 是列表类型。

现在,输入:

help(nltk.RTEFeatureExtractor)

告诉你:

:param rtepair: 一个RTEPair,应该从中提取特征

很明显,x 没有正确的类型来调用nltk.RTEFeatureExtractor。而是:

type(x[33])
<class 'nltk.corpus.reader.rte.RTEPair'>

列表中的单个项目确实具有正确的类型。


更新: 如评论部分所述,extractor.text_words 仅显示空字符串。这似乎是由于自编写文档以来在 NLTK 中所做的更改。长话短说:如果不降级到旧版本的 NLTK 或自己修复 NLTK 中的问题,您将无法解决此问题。 在文件nltk/classify/rte_classify.py 中,您将找到以下代码:

class RTEFeatureExtractor(object):
    …
    import nltk
    from nltk.tokenize import RegexpTokenizer
    tokenizer = RegexpTokenizer('([A-Z]\.)+|\w+|\$[\d\.]+')
    self.text_tokens = tokenizer.tokenize(rtepair.text)
    self.text_words = set(self.text_tokens)

如果您使用提取器中的确切文本运行相同的RegexpTokenizer,它将只产生空字符串:

import nltk
rtepair = nltk.corpus.rte.pairs(['rte3_dev.xml'])[33]
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer('([A-Z]\.)+|\w+|\$[\d\.]+')
tokenizer.tokenize(rtepair.text)

返回['', '', …, ''](即空字符串列表)。

【讨论】:

  • 当你在 python shell 中输入type(nltk.corpus.rte.pairs(['rte3_dev.xml'])[33]) 时它会说什么?
  • 代码在 nltk 3.1 版中对我来说非常好用。你要么做错了什么,要么你有另一个版本的 nltk。这是对我有用的代码:sprunge.us/KXNK
  • 但是 - print(extractor.text_words) ,没有给我任何输出。
  • 在我的回答中查看更新。该错误要么在 NLTK 文档中,要么在 NLTK 的代码中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
相关资源
最近更新 更多