2008-10-26 23 views
14

我想提出一個測驗系統,當quizmakers插入到問題的試題庫,我檢查DB重複/非常非常類似的問題。全文檢索相關性在?

測試MySQL的MATCH() ... AGAINST(),我得到最高的相關性是30+,當我測試針對100%相似的弦。

那麼究竟什麼是相關性?引用manual

相關性值是非負浮點數。零相關意味着沒有相似性。相關性的計算基於行中單詞的數量,該行中唯一字的數量,集合中單詞的總數以及包含特定單詞的文檔(行)的數量。

我的問題是如何測試的相關值,如果一個字符串是重複的。如果它是100%重複,請阻止它插入問題庫。但是,如果它只是如此相似,請提示測驗者驗證,插入與否。那我該怎麼做?對於100%相同的字符串,30+不是百分比,所以我是殘缺的。

在此先感謝。

回答

4

andygeers是在正確的軌道上:這些數字比他們的關係,彼此之間沒有經驗意義,不能靠自己來確定什麼是或不是「精確匹配」。你需要確定你自己。即使除了全文搜索排名的限制之外,還有一個懸而未決的問題,就是您認爲構建「完全匹配」的問題。 (僅限於實際文本還是soundex匹配計數?同義詞(例如,「沙發」與「沙發」)計爲匹配還是不同?是否嘗試補償拼寫錯誤等)

如果我有必要執行這樣的檢查,我只抓取全文搜索返回的排名最高的條目,刪除任何指定的停用詞,規範化空格,轉換爲小寫,進行比較,並將其留在那,直到遇到一個案例這呼籲進一步提煉。它不是全部很多額外的工作 - 如果你指定你的應用程序使用的語言,你可能會在這裏找到可以在十幾行代碼中編寫規範化函數的人。

1

我不知道你正在使用MySQL的函數的具體情況,但我想這可能是因爲沒有對這些數字沒有絕對意義 - 他們只是設計爲與利用所產生的其他值進行比較功能相同。要檢查絕對匹配,可以選擇文本本身並手動比較。

+0

我更喜歡儘可能使用MySQL搜索引擎。如果我要比較自己,我需要做很多準備和檢查,例如刪除所有的空格和特殊字符,將全部轉換爲大寫,以及不要。這是我的最後一招。 – syaz 2008-10-26 13:23:59

7

用於文本檢索系統中的基本數據結構是Inverted Index。這基本上是文檔集合中的單詞列表,其中包含它們出現的文檔列表。它還可以包含有關每個文檔的出現次數的元數據,例如單詞出現的次數。

包含單詞的文檔可以通過在搜索項匹配查詢。爲了確定相關性,在命中上計算被稱爲Cosine Ranking的啓發式。這通過爲n個搜索項中的每一個構造具有一個分量的n維向量來工作。如果需要,您還可以對搜索項進行加權。這個向量給出了與你的搜索項相對應的n維空間中的一個點。

基於每個文檔中的出現加權的類似載體可以從與在與軸線對每個搜索項對應的所述向量中的每個軸的反向索引來構建。如果計算這些向量的點積,則可以得到它們之間角度的餘弦。 1.0等同於cos(0),它將假定矢量佔據了從原點開始的一條共同線。矢量越接近,角度越小,餘弦越接近1.0。

如果排序的餘弦的搜索結果(或他們塞子成優先級隊列爲mg做),你獲得最相關的。 Cleverer相關算法傾向於擺弄搜索詞的權重,使得點積偏向於高度相關的詞。

如果你想挖一點,Managing Gigabytes作者:BellMoffet討論文本檢索系統的內部架構。