NLP示例中出现TypeError:切片索引需为整数等类型的问题求助
解决TypeError: slice indices must be integers or None or have an index method
这个错误的根源很明确:你在切片操作中使用了浮点数作为索引,而Python要求切片的起止索引必须是整数、None,或者实现了__index__方法的对象。
问题出在哪?
看你代码里这一行:
wc = width/4 # words of context
在Python 3中,/做除法会返回浮点数(比如当width=40时,wc的值是10.0)。之后你用这个浮点数去做切片:
lcontext = ' '.join(self._text[i-wc:i]) rcontext = ' '.join(self._text[i:i+wc])
这就触发了TypeError,因为切片不接受浮点数索引。
另外还有个隐藏问题
你的代码里调用了self._stem(word),但IndexedText类里并没有定义_stem方法!你应该是想调用传入的stemmer对象的stem方法,比如nltk.PorterStemmer()的stem方法,所以这里要改成self._stemmer.stem(word)。
修复后的完整代码
import nltk from nltk.stem import PorterStemmer # 示例用PorterStemmer,你可以换成其他词干提取器 class IndexedText(object): def __init__(self, stemmer, text): self._text = text self._stemmer = stemmer # 修复:用stemmer的stem方法替代未定义的self._stem self._index = nltk.Index((self._stemmer.stem(word), i) for (i, word) in enumerate(text)) def concordance(self, word, width=40): # 修复:用整数除法//确保wc是整数 wc = width // 4 # words of context key = self._stemmer.stem(word) print(self._index[key]) for i in self._index[key]: # 现在i-wc和i+wc都是整数,切片正常工作 lcontext = ' '.join(self._text[i-wc:i]) rcontext = ' '.join(self._text[i:i+wc]) # 这里补上你原来的后续逻辑,比如打印上下文 print(f"{lcontext.rjust(width)} {self._text[i]} {rcontext.ljust(width)}") # 测试示例 if __name__ == "__main__": text = nltk.word_tokenize("The quick brown fox jumps over the lazy dog. The dog barks at the fox.") stemmer = PorterStemmer() indexed_text = IndexedText(stemmer, text) indexed_text.concordance("fox")
两种修复浮点数索引的方式
除了用整数除法//,你也可以用int()把浮点数转为整数:
wc = int(width / 4)
不过//更直接,也更符合“取整获取上下文词数”的语义。
内容的提问来源于stack exchange,提问作者Sarang Manjrekar
相关产品推荐
相关产品推荐

