2011-03-23 101 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在運行時計算權重。

我知道這可能不是您設計中的正確解決方案,但通常在智能數據庫結構設計上花費一點時間會使所有工作都變得更好。

相關問題