【问题标题】:Sorting String based on similarities [closed]根据相似性对字符串进行排序[关闭]
【发布时间】:2015-07-13 09:28:00
【问题描述】:

考虑以下字符串:

  • 嘿嘿
  • 再见
  • 你好
  • =(再见)
  • (他)(llo)
  • 再见

我正在尝试以相似的词组合在一起的方式对这些进行排序,我知道

  1. alphanumerical sorting 不是一个选项
  2. 删除特殊字符 ",-_ and etc 然后比较肯定会有所帮助,但结果不会像我希望的那样好。

注意:

可能有几个不同的期望输出,其中之一是:

期望的输出:

  1. 你好
  2. 嘿嘿
  3. (他)(llo)
  4. 再见
  5. 再见
  6. =(再见)

所以我的问题是,如果有一个 java 包可以比较字符串并最终根据它对它们进行排序。

我听说过诸如n-gramskip-gram 之类的术语,但不太了解它们。我什至不确定它们是否对我有用。

更新: 寻找相似之处当然是我的问题的一部分,但主要问题是排序部分。

【问题讨论】:

  • 也许您正在搜索的领域是 NLP,自然语言处理,正如您提到的 hello (helium) 和 goodbye 一起。 soundex 算法已建立,但对空格没有帮助。
  • @dognose thx 链接,我可以看到它对比较非常有用。但这种方法限制了排序。它如何用于排序?
  • @nafas 您可以为此使用自定义比较器。您只需要针对“特定”表达式计算相似度指数,并根据该值进行排序。例如,如果你引用“foo bar”,“foo baz”和“baz bar”应该得分高,而“hello world”应该得分低。也许识别“看起来相似”的元素,将它们分组排列,然后按字母顺序对组进行排序也是有意义的。
  • @dognose 它大部分时间都不起作用。例如,假设“foo bar”与“blah”比较为 0.1,与“double”比较也是 0.1,但并不一定意味着“blah”和“double”相似。它会变得非常非常复杂

标签: java sorting string-comparison


【解决方案1】:

这是一种可能的方法。

计算每对字符串之间的edit distance/Levenshtein distance,然后将字符串视为一个完整的图形,其中边权重来自编辑距离。为这些权重选择一个阈值并删除所有高的权重。然后在此图中找到cliques。如果您的阈值相当低,也许甚至可以找到连接的组件。

注意: 也许用@dognose 发布的链接中的一种相似性度量代替一些编辑距离会更好。 另外,请注意,如果您有大量字符串,则查找派系会很慢

【讨论】:

  • 我以前用过 clique 方法来解决一些类似的问题,它确实有效。但正如你提到的,它可能非常慢。不幸的是,我有大约 1000 万 + 数据。所以集团将无法选择
  • 只查找连接的组件怎么样?
  • 当我们有 A-B 和 B-C 和 A-D 但没有 A-C 也没有 B-D 时可能会出现问题,那么我们如何决定如何对它们进行排序?
猜你喜欢
  • 2017-04-05
  • 2021-09-26
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多