我正在使用Python NLTK库来执行大型语料库。我正在做以下
text = [porter.stem(token) for token in text.split()]
text = ' '.join(text)
“text”表示我文件的一行。我的文件中有数百万行,这个过程耗费了大量时间。我只是想问有没有更好的方法来做这个操作?
答案 0 :(得分:1)
多少是“数百万”,多长时间是“大量的时间”? Porter词干不是一个复杂的算法,应该相当快。我怀疑你的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
循环有一些速度优势。