例如,我有一句话:
import sys
import signal
import time
import os
os.kill('python.exe', signal.CTRL_C_EVENT)
while(1):
print ("Wait...")
time.sleep(10)
,存储在List中,其中每个元素都是一个单词:
This is a trash bag.
我有另一个存储word-freq对的字典:
List<String> wrodList = new ArrayList<String>;
一些例子:
Map<String, Integer> allWords = new HashMap<String, Integer>();
现在我想通过wordList
bag 300
trash 250
trash bag 100
big trash bag 50
并想检查句子中是否有与词典中的条目匹配的短语。在这种情况下,[&#34;垃圾&#34;,&#34; bag&#34;]应与条目&#34;垃圾袋&#34;匹配。在字典里。
我正在考虑这个算法:
从令牌列表中重建所有可能的短语:
[&#34;这&#34;,&#34;是&#34;,&#34; a&#34;,&#34;垃圾&#34;,&#34;包&#34;] = &GT;
["this", "is", "a", "trash", "bag"]
然后在字典中查找每个短语。只要找到与字典键的匹配,就返回; 这种天真的算法似乎有效(未经测试),但不会有效,因为它必须为可能失败的潜在匹配构建大量无用的短语。
如果我提取所有地图键,按空格分解并将它们插入另一个List,我将从字典键中获取:
this is a trash bag
this is a trash
this is a
this is
is a trash bag
is a trash
is a
a trash bag
a trash
trash bag
然后尝试将句子中的所有这些短语与此列表进行匹配。这应该更好吗?
有什么建议吗?
答案 0 :(得分:0)
如果单词的顺序很重要:
您可以在后缀树中修改word-freq对的字典。 搜索可以使用O(n)和KMP算法搜索字符串中的模式。您可以找到有关后缀树here和KMP算法here的详细讨论。
如果单词顺序不重要:
您可以修改字典以按排序顺序保存单词列表(在每个短语中),而不仅仅是短语。
例如:
[bag] 300
[trash] 250
[bag, trash] 100
[bag, big, trash] 50
然后在搜索期间。 您可能希望将其拆分为单词并对其进行排序并生成它们的所有组合。 (我猜这可能很小)。设n是给定字符串中的no.of字,然后我们有(2 pow n)组合。对此进行线性搜索将得到O(2 pow n)。即使对于n> 1,对于更大的n值,这绝对是一个坏的解决方案。 10
希望它有所帮助!