我有一个包含大量字符串的字典。每个字符串的范围可以是1到4个标记(单词)。示例:
词典:
现在我有一个段落,我需要弄清楚para中有多少个字符串是字典的一部分。 例如,当下面的段落:
Shawshank Redemption 被认为是根据IMDB Top 250制作的有史以来最伟大的电影。至少有一两年我偶尔会在IMDB Top 250上查看 The Shawshank赎回已经 与教父争夺头号位置。
是针对字典运行的,我应该使用粗体字作为字典的一部分。
如何使用最少的字典调用来完成此操作。
由于
答案 0 :(得分:2)
使用Trie可能会更好。 Trie更适合于找到可能正在寻找的部分匹配(即,当您搜索段落的文本时),而不是对字典进行大量调用而非大多数失败。
我认为Trie(或某些变体)是合适的原因是因为它的构建完全符合您的要求:
如果您使用此(或在每个节点上使用标记化单词而非字母的某些修改),这在存储和检索方面将是最有效的(至少我知道);存储因为它不是在标题中具有该单词的每个Dict条目中存储单词“The”几千次(如电影标题的情况),而是将其存储在根目录下的一个节点中。下一个词“肖申克”将在一个子节点中,然后“兑换”将在下一个,共有3个查找;然后你会转到下一个短语。如果它失败了,即短语只是“The Shawshank Looper”,那么你在相同的3次查找后失败,然后移动到失败的单词,Looper(它发生时,也会是根目录下的子节点,并且如果您正在阅读没有混搭电影名称的段落,则此解决方案可以正常运行。
使用哈希表,你将不得不拆分所有单词,检查第一个单词,然后在没有匹配的情况下,继续附加单词并检查词组是否在词典中,直到你得到一个命中,或者你到达段落的末尾。因此,如果您点击没有电影标题的段落,您将拥有与段落中的单词一样多的查找。
答案 1 :(得分:1)
这不是一个完整的答案,更像是一个扩展评论。
在文献中,它被称为"多模式匹配问题"。由于您提到模式集具有数百万个元素,因此基于Trie的解决方案很可能表现不佳。
据我所知,在实践中,传统的字符串搜索与很多启发式一起使用。 DNA搜索,防病毒检测等所有这些领域都需要快速可靠的模式匹配,因此应该进行大量的研究。
我可以想象Rabin-Karp如何使用滚动哈希函数和一些过滤器(Bloom过滤器)来加速这个过程。例如,您可以先过滤(例如使用弱哈希),然后实际验证,而不是实际匹配子串,从而减少所需的验证次数。另外,这应该减少原始字典本身所做的工作,就像存储它的哈希或其他过滤器一样。
答案 2 :(得分:-1)
在Python中:
import re
movies={1:'The Shawshank Redemption', 2:'The Godfather', 3:'Pretty Woman', 4:'Pulp Fiction'}
text = 'The Shawshank Redemption considered the greatest movie ever made according to the IMDB Top 250.For at least the year or two that I have occasionally been checking in on the IMDB Top 250 The Shawshank Redemption has been battling The Godfather for the top spot.'
repl_str ='(?P<title>' + '|'.join(['(?:%s)' %movie for movie in movies.values()]) + ')'
result = re.sub(repl_str, '<b>\g<title></b>',text)
基本上它包括从你的dict值中形成一个大的替换指令字符串。 我不知道regex和sub是否对你给它们的替换指令的大小有限制。你可能想检查一下。
赖