正如标题所说,我有一个单词列表,就像stopWords = ["the", "and", "with", etc...]
我收到了“杀死狐狸和狗”这样的文字。我想要像“杀死狐狸狗”这样的输出非常有效和快速。我该怎么做(我知道我可以使用 for 循环进行迭代,但这不是很有效)
6 回答
最重要的改进是让 stopWords 成为一个set
. 这意味着查找将非常快
stopWords = set(["the", "and", "with", etc...])
" ".join(word for word in msg.split() if word not in stopWords)
如果您只想知道文本中是否有任何停用词
if any(word in stopWords for word in msg.split()):
...
使用 Python,最快的操作是将“停用词”设置为集合而不是列表,并使用“停用词中的 x”直接检查成员资格。这种结构被设计为对这种操作快速。
使用列表理解:
stopWords = ["the", "and", "with"]
msg = "kill the fox and the dog"
' '.join([w for w in msg.split() if w not in stopWords])
给出:
'kill fox dog'
- 将您的原始单词列表放入字典中。
- 遍历给定字符串中的字符,使用空格作为单词的分隔符。在字典中查找每个单词。
将您的停用词放在一个set()
(正如其他人所建议的那样),将您的其他单词累积到一个工作集中,然后简单地使用working = working - stopWords
...获取集合差异,以获得一个工作集,其中所有停用词都被过滤掉。或者只是为了检查这些词的存在使用条件。例如:
#!python
stopWords = set('the a an and'.split())
working = set('this is a test of the one working set dude'.split())
if working == working - stopWords:
print "The working set contains no stop words"
else:
print "Actually, it does"
实际上有更有效的数据结构,例如可用于大型、相对密集的停用词集的trie 。set()
您可以找到 Python 的 trie 模块,尽管我没有看到任何编写为二进制 (C) 扩展的模块,我想知道在纯 Python 中实现的 trie 与使用 Python支持之间的交叉点在哪里。(不过,对于Cython来说也可能是一个很好的案例)。
事实上,我看到有人在这里单独解决了这个问题,所以:如何在 cython 中创建一个固定长度的可变 python 对象数组。
当然,最终,您应该创建简单的基于集合的版本,对其进行测试和分析,然后,如有必要,尝试使用 trie 和 Cython-trie 变体作为可能的改进。
作为替代方案,您可以在正则表达式中组装您的列表,并用一个空格替换停用词和周围的空格。
import re
stopWords = ["the", "and", "with"]
input = "Kill the fox and dog"
pattern = "\\s{:s}\\s".format("\\s|\\s".join(stopWords))
print(pattern)
print(re.sub(pattern, " ", input))
将输出
\sthe\s|\sand\s|\swith\s
Kill fox dog