6

正如标题所说,我有一个单词列表,就像stopWords = ["the", "and", "with", etc...]我收到了“杀死狐狸和狗”这样的文字。我想要像“杀死狐狸狗”这样的输出非常有效和快速。我该怎么做(我知道我可以使用 for 循环进行迭代,但这不是很有效)

4

6 回答 6

9

最重要的改进是让 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()):
    ...
于 2012-06-14T02:05:06.850 回答
3

使用 Python,最快的操作是将“停用词”设置为集合而不是列表,并使用“停用词中的 x”直接检查成员资格。这种结构被设计为对这种操作快速。

查看设置文档

于 2012-06-14T02:07:03.943 回答
1

使用列表理解

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'
于 2012-06-14T02:04:57.420 回答
0
  1. 将您的原始单词列表放入字典中。
  2. 遍历给定字符串中的字符,使用空格作为单词的分隔符。在字典中查找每个单词。
于 2012-06-14T02:05:38.220 回答
0

将您的停用词放在一个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 变体作为可能的改进。

于 2012-06-14T02:31:46.147 回答
0

作为替代方案,您可以在正则表达式中组装您的列表,并用一个空格替换停用词和周围的空格。

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
于 2012-06-14T02:37:18.823 回答