需要一种算法来查找近似重复的文本值

时间:2011-09-20 19:06:52

标签: php algorithm duplicates taxonomy custom-taxonomy

我运行一个照片网站,用户可以随意输入他们喜欢的任何标签,甚至是以前没有使用过的标签。结果,标签的照片有时可以被标记为“昆虫”,而其他人将其标记为“昆虫”。

我想保留自由标记功能,但希望有办法过滤掉这些近似重复的内容。标签的总集合目前为1,500。我的想法是将所有这些从DB读入mem,然后在其上运行一个显示“嫌疑人”的alghoritm。

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

编辑:忘记提及:仅仅对标签进行排序是不够的,因为这需要我通过整个集来查找欺骗。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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/

答案 2 :(得分:0)

“要么包含”要么“好吗?如果您的图像位于数据库中(这只是有意义的话),您可以执行类似这样的SQL查询:

SELECT * FROM ImageTags WHERE INSTR('theNewTag', TagName) > 0 OR INSTR(TagName, 'theNewTag') > 0 LIMIT 1;

答案 3 :(得分:0)

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

您可以加载大量的单词列表,并在用户输入时将其缩小。我觉得如果你想要预测拼写正确的单词,这可能是非常简单的esp。如果有人错过了一封信,他们可能会在他们看到一些完全不符合他们意图的建议列表时回去修理它。当他们正确输入一个单词时,它会弹出建议。