2011-03-23 100 views
0

这个问题对我来说是一个挑战,我的朋友不能告诉我如何去做,但他是一个很好的程序员(我认为) 。找到类似的字符串给予关键字,每个关键字都得到了它自己的'权力'

用户可以放入数据库语句。当用户放置一个句子时,它被保存在sentences表中。 接下来,将句子拆分为单词,将单词的每个单词索引保存到具有拆分句子的标识的表tags中。

最后,这个词的每个soundax被放入weights表中,如果有相同的soundex,函数将这个soundex的counter加1。

(对于那些谁不知道:同音是返回一个字符串的拼音表示(它的音色)函数)的数据库

结构: 一个表sentences包含两行:idsentence 。 其他表tags包含id(带有一个句子的id)和tag(带有一个单词)。 tag不是真的只是普通的词,而是这个词的soundex。 最后表weights包含tagweight(带是数字,它告诉我们有多少个这样的标签表tags

我的问题是:如何才能让一个函数返回巫类似的句子来给定的字符串。 它应该使用标签(soundex的单词),每个标签应该有自己的权力基于weights表。 标签,经常使用的标签更重要,然后是更原始的标签。它可以在一个MySQL查询中完成吗?

下一个问题:我认为这种寻找类似句子的方法很好,但是用这个函数的速度是什么? 我需要在我的网站中经常使用它。

回答

1

那么为什么没有将标签与句子相关联的表而不是有一个权重表呢?因此,有一个名为sentence_tags的表,其中sentence_idtag_id列。然后,您可以通过在这两个表上进行连接来计算权重,并仍然参考包含该标记的句子。您可以在标签表中存储标签和soundex,而您也可以将它存储在标签表中。

+0

好的提示,谢谢。但它还没有解决我的问题 – monthon1 2011-03-23 21:19:57

+0

好吧,一旦你的数据库设计正确,你可以回到类似的句子。看看[这个答案类似的问题](http://stackoverflow.com/questions/4717093/mysql-find-related-articles/4717366#4717366)。在你的情况下,只需用'句子'替换'articles'并根据需要进行修改即可。 – 2011-03-24 13:15:57

0

也许Levenshtein Distance是你在找什么。它会计算从一个词到另一个词所需的步数。

是否意识到这是一个代价高昂的操作。

+0

我知道levenshtein alghoritm,但我不知道如何在这种情况下使用它。 – monthon1 2011-03-23 21:34:43

+0

我的错误,我反过来读它。我认为你应该分解每个单词。不要试图一次完成整个句子 – pderaaij 2011-03-23 21:37:58

0

对于良好的数据库设计,Joe K的建议似乎很有用。

不要存储可外推的信息。

含义,使用join语句和PHP在运行时计算权重。

我知道这可能不是您设计中的正确解决方案,但通常在智能数据库结构设计上花费一点时间会使所有工作都变得更好。

相关问题