识别字符串中的相似性

时间:2012-10-22 20:17:13

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

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

这主要是一个私有项目,可以获得MVC3,EntityFramework,LINQ等等。因此,我喜欢做一些疯狂的事情来为最终结果增添趣味,其中一个就是识别相似的字符串。

想象一下,你有以下的字符串列表 - 借鉴过我曾经合作过的游戏:

  • Megabeth:神圣的滚轮制服 - 包括头部,躯干和腿部
  • Megabeth:Holy Roller Uniform Head
  • Megabeth:神圣的滚轮制服腿
  • Megabeth:Holy Roller Uniform Torso
  • Megabeth:PAX East 2012制服 - 包括头部,躯干和腿部
  • Megabeth:PAX East 2012 Uniform Head
  • Megabeth:PAX East 2012 Uniform Legs
  • Megabeth:PAX East 2012 Uniform Torso

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

  • Megabeth
  • 均匀
  • 包括头部,躯干和腿部
  • 躯干

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

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

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

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