使用NLTK的RecursionError

时间:2018-05-03 11:21:13

标签: python for-loop recursion

我在处理文本之前运行此代码是为了处理文本

并得到RecursionError:比较超出了最大递归深度

train_text是一个带文字的python系列 stem是来自nltk库的PorterStemmer对象

train_corpus = []
for i in range(0, len(train_text)):
    data = re.sub("[^a-zA-Z]", ' ', train_text[i]).lower().split()
    data = [ps.stem(word) for word in data if not word in set(stopwords.words("english"))]
    data = ' '.join(data)
    train_corpus.append(data)
RecursionError                            Traceback (most recent call last)
<ipython-input-25-4a8646f33f6f> in <module>()

     57 for i in range(0, len(train_text)):
     58     data = re.sub("[^a-zA-Z]", ' ', train_text[i]).lower().split()
---> 59     data = [ps.stem(word) for word in data if not word in set(stopwords.words("english"))]
     60     data = ' '.join(data)
     61     train_corpus.append(data)

<ipython-input-25-4a8646f33f6f> in <listcomp>(.0)
     57 for i in range(0, len(train_text)):
     58     data = re.sub("[^a-zA-Z]", ' ', train_text[i]).lower().split()
---> 59     data = [ps.stem(word) for word in data if not word in set(stopwords.words("english"))]
     60     data = ' '.join(data)
     61     train_corpus.append(data)

~\Anaconda3\lib\site-packages\nltk\stem\porter.py in stem(self, word)
    665         stem = self._step1a(stem)
    666         stem = self._step1b(stem)
--> 667         stem = self._step1c(stem)
    668         stem = self._step2(stem)
    669         stem = self._step3(stem)
....

我该怎么做才能解决这个问题?

感谢。

2 个答案:

答案 0 :(得分:0)

看起来它可以通过Docs获胜: setrecursionlimit()
但是请记住,递归不是免费的 - 它会消耗memory_of_function_consumes * amount_of_circles_of_recursion - 所以当你有大量的递归运行时你可能会耗尽内存。这就是为什么这个限制在Python中是硬编码的,我认为覆盖它是个坏主意。

答案 1 :(得分:-1)

您可以手动设置递归深度但请小心

sys.setrecursionlimit(n) #replace n具有您想要达到的深度

原因:当堆栈超出其限制(Stack Overflow)时发生

解决方法:或者使用迭代而不是递归技术

修改 来自Python Doc

https://docs.python.org/2/library/sys.html#sys.setrecursionlimit

  

将Python解释器堆栈的最大深度设置为limit。这个   limit可防止无限递归导致C溢出   堆栈并崩溃Python。

     

可能的最高限制取决于平台。当用户需要深度的程序时,用户可能需要将限制设置得更高   递归和支持更高限制的平台。这应该是   小心,因为太高的限制可能会导致崩溃。