4

我经营一个照片网站,用户可以自由输入他们喜欢的任何标签,甚至是以前未使用过的标签。结果,标签的照片有时可能被标记为“昆虫”,而其他人则将其标记为“昆虫”。

我想保留免费标记功能,但希望有一种方法可以过滤掉这种近乎重复的内容。标签的总收藏量目前为 1,500 个。我的想法是将所有这些从数据库读入内存,然后在其上运行显示“嫌疑人”的算法。

我对嫌疑人的看法是字符串中 x% 的字符是相同的(相同的字符和顺序),其中 x 是可配置的。我可能可以编写一个非常低效的方法来做到这一点,但我想知道是否有解决这个问题的现有解决方案?

编辑:忘了提一下:仅仅对标签进行排序是不够的,因为这需要我遍历整个集合才能找到骗子。

4

4 回答 4

2

也许您正在寻找的算法是近似字符串匹配。 http://en.wikipedia.org/wiki/Approximate_string_matching

通过给定的单词,您可以将其与单词列表匹配,如果“距离”接近,则将其添加到嫌疑人中。

一个快速的实现是使用像 Needleman-Wunsch 算法这样的动态规划。我在 C# 中制作了一个博客示例,您可以在其中使用矩阵字符查找文件配置“距离”。 http://kunuk.wordpress.com/2010/10/17/dynamic-programming-example-with-c-using-needleman-wunsch-algorithm/

于 2011-09-21T10:22:25.207 回答
2

你的逻辑有一些缺陷。例如,当一个对象的复数与单数不同时会发生什么(即人与人,甚至糖果与糖果)。

如果英语是主要语言,请查看允许语音匹配的Soundex 。还可以考虑使用众包同义词模型,用户可以在其中创建指向现有标签的链接。

于 2011-09-20T19:14:03.003 回答
0

“两者中的任何一个”都可以吗?如果您的图像在数据库中(这才有意义),您可以执行类似这样的 SQL 查询:

SELECT * FROM ImageTags WHERE INSTR('theNewTag', TagName) > 0 OR INSTR(TagName, 'theNewTag') > 0 LIMIT 1;
于 2011-09-20T19:14:07.830 回答
0

如果你真的想有效地做到这一点,我会建议某种 JavaScript 实现,当用户输入他们想要的标签时,它会显示可能性。它不仅可以节省用户在输入时愉快地看到 5 条建议的时间。当“嫌疑人”作为建议出现时,它会自动阻止他们输入“嫌疑人”。那是,当然,除非他们真的想要“嫌疑人”作为紧急点。

您可以加载一个巨大的单词列表,并随着用户类型缩小它们。我觉得这可能非常简单,尤其是如果您想预测正确拼写的单词。如果有人遗漏了一封信,当他们看到一个根本不是他们想要输入的建议列表时,他们可能会回去修复它。当他们正确输入一个单词时,它会在建议中弹出。

于 2011-09-20T19:30:29.937 回答