我正在开发一个允许导入文件本地化为其他语言的系统。
这主要是一个私有项目,可以获得MVC3,EntityFramework,LINQ等等。因此,我喜欢做一些疯狂的事情来为最终结果增添趣味,其中一个就是识别相似的字符串。
想象一下,你有以下的字符串列表 - 借鉴过我曾经合作过的游戏:
正如您所看到的,一旦用户翻译了前4个字符串,以下4个字符串就有很多相似之处,在这种情况下:
考虑前4个字符串确实已经翻译,当用户从列表中选择第5个字符串时,我可以使用什么样的算法或技术向用户显示子标题下的第1个字符串(可能还有其他字符串) “类似字符串”?
编辑 - 关于Levenshtein距离的一点评论: 我目前正在数据库中定位10k字符串。 Levenshtein Distance比较每串的字符串,因此在这种情况下,10k x(10k -1)可能的组合。我将如何以可行的方式处理这个问题?这个特定算法有更好的解决方案吗?
答案 0 :(得分:5)
您可以查看Levenshtein Distance。低于某个阈值的那些将被认为是相似的。两个相同的字符串的距离为零。
在Rosetta Code上有一个C#实现,以及其他语言。
答案 1 :(得分:0)
这取决于数据的大小和词汇量的丰富程度。 这是第一个想法: 为字符串构建单词地图 然后另一个字对映射到字符串 也许如果数据不是字符串三元组到字符串的巨大映射。 删除指向单个字符串的映射(这将显着减少三元组映射的数量)。 如果构建它需要时间,请将结果字典保存在磁盘或数据库中。
现在给定一个字符串,您应该能够快速将其拆分为单词,单词对和三元组,并查找与其相关的所有字符串。你将需要玩三重奏匹配与4个单词匹配的重量。即是 “我是一个老人”更接近“一个老人吃了胡萝卜”或“男人用箭头杀死了老狗”(听起来像三胞胎比赛更重要)。
更新:如果在Microsoft SQL Server数据库中,您可以使用全文搜索功能。我从来没有尝试过。 您还应该查看Lucene。