【问题标题】:Algorithm to find very common occurences of substrings in a set of short strings在一组短字符串中查找非常常见的子字符串的算法
【发布时间】:2011-10-13 17:10:35
【问题描述】:

我有一个来自外部数据库的大约 1500 个字符串的列表,随着时间的推移,随着一组业务用户管理它们,他们开始拥有具有语义价值的重复子字符串。

我正在构建一个前端,并希望向用户展示这些子字符串的过滤下拉列表。

例如,如果我有输入字符串:

  • 美国富豪
  • 美国酒吧(非活动)
  • 英国蝙蝠
  • 英国 baz(非活动)
  • AU womp
  • AU 大鼠

我想回来:

  • 美国
  • 英国
  • 澳大利亚
  • 无效

我的第一个想法是有一个阈值参数和一个分隔符列表。对于上述内容,我可能会说 threshold=.3 并且分隔符是空格 (, 和 )。

然后在使用分隔符时执行 string.split 并使用数据结构,例如计算重复项 (?)...

我不想让某人在这里为我做我的工作 - 向做过这件事的人提供有关方法的建议会很棒。

【问题讨论】:

    标签: c# string algorithm


    【解决方案1】:

    这个问题是 Linq 方法的一个很好的候选:

    var words = from s in listOfStrings
                from word in s.Split(new[] { ' ', '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
                group word by word;
    var dic = words.ToDictionary(g => g.Key, g => g.Count());
    

    【讨论】:

    • 更好的是,一旦你得到了组,做一个“where count > threshhold”和一个“order by count”,然后你就会得到一个查询,结果正是用户想要的.
    • 我只想再次感谢 - 它工作得很好,帮助我“思考 linq”
    【解决方案2】:

    一种简单的方法就像您所说的那样。设置Dictionary<String, int> 以包含您的数据。然后,很简单:

    for each word in string
       if word is in dictionary
          increment dictionary value
       else
          add to dictionary with value of 1
    

    然后,只需根据阈值过滤该字典,或返回按计数排序的条目。您也可以选择包含您不想跟踪的常用词的“忽略列表”。

    此外,如果您希望不区分大小写,请像这样构造字典:new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);

    【讨论】:

    • 很好 - 或者我可以预测 itme 与其计数的比率,然后按此排序,给我项目及其下降的出现百分比......这可能是一个标准的统计函数......也许有人会指出来(它让我想起了我曾经在“为了好玩”过 excel 函数时正在阅读的东西)
    • 您可以通过多种方式呈现它。如果您只是想要字符串占令牌总数的百分比,只需将计数除以总数即可。有些人喜欢将其表示为百分比,其中 100% = 最常用词,在这种情况下,您将每个计数除以找到最常用词的次数。这在很大程度上取决于您的用例。
    【解决方案3】:
    var input = new List<string>();
    input.Add("Foo"); // I'd go for splitting by delimiters as well
    input.Add("Bar");
    input.Add("Foo");
    var results = input.Distinct(); // -> Foo, Bar
    

    我不太确定你的阈值是多少。

    【讨论】:

      猜你喜欢
      • 2019-07-16
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2015-11-29
      • 2012-12-08
      • 1970-01-01
      • 2011-02-03
      • 2022-01-25
      相关资源
      最近更新 更多