【问题标题】:Recognizing similarity in strings识别字符串中的相似性
【发布时间】:2012-10-22 20:17:12
【问题描述】:

我正在开发一个允许将导入的文件本地化为其他语言的系统。

这主要是一个私人项目,用于掌握 MVC3、EntityFramework、LINQ 等的窍门。因此,我喜欢做一些疯狂的事情来为最终结果增添趣味,其中之一就是识别相似的字符串。

假设您有以下字符串列表 - 从我过去使用过的游戏中借用:

  • Megabeth:Holy Roller 制服 - 包括头部、躯干和腿部
  • Megabeth:神圣滚轮制服头
  • Megabeth:Holy Roller 制服腿
  • Megabeth:Holy Roller 制服躯干
  • Megabeth:PAX East 2012 制服 - 包括头部、躯干和腿部
  • Megabeth:PAX East 2012 制服主管
  • Megabeth:PAX East 2012 制服腿
  • Megabeth:PAX East 2012 制服躯干

如您所见,一旦用户翻译了前 4 个字符串,以下 4 个字符串有很多相似之处,在这种情况下:

  • 百兆
  • 制服
  • 包括头部、躯干和腿部
  • 躯干

考虑到前 4 个字符串确实已经翻译,当用户从列表中选择第 5 个字符串时,我可以使用哪种算法或技术向用户显示子标题下的第一个字符串(可能还有其他字符串) “相似的字符串”?

编辑 - 对 Levenshtein 距离的一点评论: 我目前的目标是数据库中的 10k 个字符串。 Levenshtein Distance 比较每个字符串的字符串,因此在这种情况下有 10k x (10k -1) 个可能的组合。我将如何以可行的方式解决这个问题?有没有比这个特定算法更好的解决方案?

【问题讨论】:

  • 有趣的问题。我不知道从哪里开始回答这个问题,但我想出去看看。
  • 编辑距离。其中有很多品种。并且相当直截了当。如果矩阵变大,计算量可能会很大。
  • 你可以连接所有的字符串,然后用空格分割(使用正则表达式),然后用.Distint() linq 并用替换执行翻译。问题在于,并非所有语言都逐字翻译。
  • @Jay 没关系,它应该帮助用户完成翻译过程,而不是为他完成所有工作......但至少:p

标签: c# asp.net-mvc-3 entity-framework localization similarity


【解决方案1】:

您可以查看Levenshtein Distance。低于某个阈值的将被视为相似。两个相同的字符串的距离为零。

Rosetta Code 上有一个 C# 实现以及其他语言。

【讨论】:

  • +1,刚要推荐 Levenshtein,你比我强
  • 我确实遇到过这种算法,但坦率地说忘记了名字,谢谢。我很想知道更多答案,所以我暂时不回答这个问题;)
  • 那很好,我也有兴趣看看其他人是否有其他解决方案:)
  • 更多信息:我目前的目标是数据库中的 10k 个字符串。 Levenshtein Distance 比较每个字符串的字符串,因此在这种情况下有 10k x (10k -1) 个可能的组合。我将如何以可行的方式解决这个问题?
  • @LennardFonteijn 什么数据库?
【解决方案2】:

这将取决于数据的大小和词汇的丰富程度。 这是第一个想法: 构建单词到字符串的映射 然后是另一个单词对到字符串的映射 也许如果数据不是字符串三元组到字符串的巨大映射。 删除指向单个字符串的映射(这将大大减少三元组映射的数量)。 如果构建需要时间,则将结果字典保存在磁盘或数据库中。

现在给定一个字符串,您应该能够快速将其拆分为单词、单词对和三元组,并查找与其相关的所有字符串。您将需要重视三元组匹配与 4 个单词匹配。 IE。是 “我是一个老人”更接近于“一个老人吃了一根胡萝卜”或“男人用箭杀死了老狗”(听起来像三联更重要)。

更新:如果这在 Microsoft SQL Server 数据库中,您可以使用全文搜索功能。不过我从来没有尝试过。 你也应该看看Lucene

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2014-03-16
    • 1970-01-01
    • 2010-10-31
    • 2019-05-01
    • 2011-07-02
    相关资源
    最近更新 更多