【问题标题】:How to implement this string match in a dictionary?如何在字典中实现这个字符串匹配?
【发布时间】:2017-05-23 01:21:57
【问题描述】:

比如我有一句话:

This is a trash bag.

,它存储在一个List中,其中每个元素都是一个单词:

List<String> wrodList = new ArrayList<String>;

我有另一个存储单词频率对的字典:

Map<String, Integer> allWords = new HashMap<String, Integer>();

几个例子:

  bag 300
  trash 250
  trash bag 100
  big trash bag 50

现在我想通过 wordList

["this", "is", "a", "trash", "bag"]

并想检查句子中是否有与字典中的条目匹配的短语。在这种情况下,["trash", "bag"] 应该匹配字典中的条目 "trash bag"。

我在想这个算法:

  1. 从标记列表中重构所有可能的短语:

    ["this", "is", "a", "trash", "bag"]=>

    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
    

然后在字典中查找这些短语中的每一个。一旦找到与字典键的匹配项,就返回; 这种幼稚的算法似乎有效(未经测试),但效率不高,因为它必须为必须失败的潜在匹配构造大量无用的短语。

如果我提取所有映射键,用空格分隔它们并将它们插入另一个列表,我将从字典键中获取:

[[trash], [bag], [trash, bag], [big, trash, bag]]

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

有什么建议吗?

【问题讨论】:

  • 你受限于当前的数据结构吗?因为我可能会考虑实现树结构。
  • 您有什么建议?请具体。

标签: java algorithm


【解决方案1】:

如果词序很重要:

您可以考虑在后缀树中维护词频对的字典。 可以使用 O(n) 和 KMP 算法在字符串中搜索模式来完成搜索。你可以找到关于后缀树here和KMP算法here的详细讨论。

如果词序不重要:

您可以修改字典以按排序顺序保存单词列表(在每个短语中),而不仅仅是短语。

例如:

[bag] 300
[trash] 250
[bag, trash] 100
[bag, big, trash] 50

然后在搜索期间。 您可能希望将其拆分为单词并对它们进行排序并生成它们的所有组合。 (我猜这可能很小)。让 n 是给定字符串中的单词数,那么我们有 (2 pow n) 组合。对此进行线性搜索将导致 O(2 pow n)。对于较大的 n 值,即使对于 n > 10,这绝对是一个糟糕的解决方案

希望对你有帮助!

【讨论】:

  • "您可能希望将其拆分为单词并将它们排序并生成它们的所有组合。" 'it'(给定字符串)是指字典或句子中的条目吗?
  • 将“大垃圾袋”分类为“袋大垃圾”的目的是什么?你能把你的解释说得更具体一点吗?谢谢。
  • 排序将帮助您避免检查给定单词集的所有排列。
猜你喜欢
  • 2012-02-23
  • 2011-07-08
  • 2015-03-08
  • 1970-01-01
  • 2016-10-23
  • 2012-10-23
  • 2019-05-01
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多