-1

我正在使用 Python NLTK 库在大型语料库上执行词干提取。我正在关注

text = [porter.stem(token) for token in text.split()] 
text = ' '.join(text)

“文本”代表我文件的一行。我的文件中有数百万行,这个过程需要大量时间。我只想问有没有更好的方法来做这个操作?

4

1 回答 1

1

“百万”是多少,“巨大的时间”是多少?波特词干不是一个复杂的算法,应该相当快。我怀疑你是 I/O 受限而不是其他任何东西。仍然......可能会有一些改进,你可以勉强解决。

如果顺序不重要并且您不需要每个词干的每个副本,您可能会发现使用字典和/或集合来存储词干更简单(并且更节省内存)。这将使您避免需要对已经看过的词进行词干处理,这应该会提高性能,并且每个词干只存储一次。

例如:

seenwords = set()
seenstems = set()

for line in input_file:
    line = line.lower().split()
    seenstems.union(porter.stem(token) for token in line if token not in seenwords)
    seenwords.union(line)

如果它们在同一行上,这可以不止一次地阻止单词,但对于后续行,它们将不再需要被阻止。您还可以一个一个地处理单词,这将避免在同一行中多次将它们词干,但是使用生成器表达式而不是for循环有一些速度优势。

于 2012-12-10T20:08:38.420 回答