Java 基于相似性的字符串排序

Java 基于相似性的字符串排序,java,sorting,string-comparison,Java,Sorting,String Comparison,考虑以下字符串: 他说 再见 你好 =(再见) (他)(罗) 再见 氦 我知道,我正试着用一种类似的方式来分类这些词 字母数字排序不是选项 删除特殊字符”、-u和etc,然后进行比较肯定会有帮助,但结果不会像我希望的那样好 注意: 可能会有几个不同的期望输出,其中之一是: 所需输出: 你好 他说 (他)(罗) 氦 再见 再见 =(再见) 所以我的问题是,如果有一个java包比较字符串并最终根据它对它们进行排序 我听说过诸如n-gram和skip gram之类的术语,但我不太理解它们。我甚至不

考虑以下字符串:

  • 他说
  • 再见
  • 你好
  • =(再见)
  • (他)(罗)
  • 再见
我知道,我正试着用一种类似的方式来分类这些词

  • 字母数字排序
    不是选项
  • 删除特殊字符
    ”、-u和etc
    ,然后进行比较肯定会有帮助,但结果不会像我希望的那样好
  • 注意:

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

    所需输出:

  • 你好
  • 他说
  • (他)(罗)
  • 再见
  • 再见
  • =(再见)
  • 所以我的问题是,如果有一个java包比较字符串并最终根据它对它们进行排序

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

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

    这里有一种可能的方法

    计算每对字符串之间的距离,然后使用将字符串视为一个完整的图形,其中边权重来自编辑距离。为这些权重选择一个阈值,并删除所有高的权重。然后在此图形中查找。如果阈值相当低,甚至查找连接的组件都可能是一个操作激动

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

    您正在搜索的区域可能是NLP,即自然语言处理,正如您提到的
    hello
    Hemia
    )和
    再见
    结合使用。soundex算法已经建立,但对空格没有帮助。@dognose thx对于链接,我可以看到它对比较非常有用。但是这种方法限制了排序。如何使用它进行排序?@nafas您可以使用自定义比较器进行排序。您只需要根据“确定”表达式,并根据该值进行排序。例如,如果您引用“foo bar”、“foo baz”和“baz bar”,则得分较高,而“hello world”应得分较低。也许识别“相似外观”也有意义“元素,按组排列,然后按字母顺序对组进行排序。@dognose大多数情况下都不起作用。例如,假设“foo bar”与“blah”的比较为0.1,与“double”的比较也为0.1,但并不一定意味着“blah”和“double”是相似的。它可能会变得非常非常复杂。我以前用过集团的方法来解决类似的问题,它确实有效。但正如你提到的,它可能非常慢。不幸的是,我有大约1000万以上的数据。所以,派克将失去选择,我们如何找到连接的组件?当我们有A-B和B-C和A-D,但没有A-C和B-D时,问题可能会出现,那么我们如何决定如何对它们进行排序?