You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:37:05