【发布时间】:2021-03-16 07:14:27
【问题描述】:
我知道类似的问题已经被问过好几次了,但我的问题有点不同,我正在寻找一个省时的解决方案,用 Python。
我有一组单词,其中一些以“*”结尾,而另一些则没有:
words = set(["apple", "cat*", "dog"])
我必须计算它们在文本中的总出现次数,考虑到任何东西都可以放在星号之后(“cat*”表示所有以“cat”开头的单词)。搜索必须不区分大小写。 考虑这个例子:
text = "My cat loves apples, but I never ate an apple. My dog loves them less than my CATS".
我希望最终得分为 4(= cat* x 2 + dog + apple)。请注意,“cat*”被计算了两次,也考虑了复数,而“apple”只计算了一次,因为它的复数没有被计算(末尾没有星号)。
我必须对大量文档重复此操作,因此我需要一个快速的解决方案。我不知道 regex 或 flashtext 是否可以达到快速解决方案。你能帮帮我吗?
编辑
我忘了说我的一些词包含标点符号,例如:
words = set(["apple", "cat*", "dog", ":)", "I've"])
这似乎在编译正则表达式时会产生额外的问题。您已经提供的代码是否有一些集成可以用于这两个附加词?
【问题讨论】:
-
感谢尼克这只是部分,但非常有用的问题。我认为答案是您和@Dani 给出的答案。我现在正试图了解哪种方法会更快。
-
这实际上取决于您的
words列表的大小 - 对于大型列表,Trie 解决方案可能会更快,但对于较短的情况,构建 Trie 的成本可能会超过加速的好处上正则表达式比较。知道您为您的具体示例找到了什么会很有趣。
标签: python string full-text-search re