如何在字典中实现此字符串匹配?

时间:2017-05-23 01:21:58

标签: java algorithm

例如,我有一句话:

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;匹配。在字典里。

我正在考虑这个算法:

  1. 从令牌列表中重建所有可能的短语:

    [&#34;这&#34;,&#34;是&#34;,&#34; a&#34;,&#34;垃圾&#34;,&#34;包&#34;] = &GT;

    ["this", "is", "a", "trash", "bag"]
    
  2. 然后在字典中查找每个短语。只要找到与字典键的匹配,就返回; 这种天真的算法似乎有效(未经测试),但不会有效,因为它必须为可能失败的潜在匹配构建大量无用的短语。

    如果我提取所有地图键,按空格分解并将它们插入另一个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
    

    然后尝试将句子中的所有这些短语与此列表进行匹配。这应该更好吗?

    有什么建议吗?

1 个答案:

答案 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

希望它有所帮助!