我正在使用 Python NLTK 库在大型语料库上执行词干提取。我正在关注
text = [porter.stem(token) for token in text.split()]
text = ' '.join(text)
“文本”代表我文件的一行。我的文件中有数百万行,这个过程需要大量时间。我只想问有没有更好的方法来做这个操作?
“百万”是多少,“巨大的时间”是多少?波特词干不是一个复杂的算法,应该相当快。我怀疑你是 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
循环有一些速度优势。