0

我已經在Calculating Word Proximity in an inverted Index處提出了類似的問題。 但是我覺得這個問題太籠統了,還不夠完善。所以在這裏。計算用於計算鄰近度的點積

我有一個列表,其中包含文檔中的標記位置。對於每個令牌它會爲

public List<int> hitLocation; 

比方說在該文件是

Java programming language has a name similar to java island in Indonesia however 
local language in java bears no resemblance to the programming language called java. 

和查詢

java island language 

所以說我鎖定到Java結果列表,直接嘗試計算Java HisList,Island HitList和Language Hitlist之間的距離。

現在第一個問題是句子中有4個java令牌出現。我選擇哪一個。假設我選擇了第一個。

我進入島標記列表,並在比較後發現它與第二次出現的java相鄰。所以我改變我的選擇並鎖定到第二次出現的Java。

繼續使用第三種標記語言,我發現它位於距離我們的選擇很遠的地方,但是我發現它距離第一個Java事件很近。

所以你看到這裏的困境,如果現在再次恢復到原來的選擇,即Java的第一次出現的距離第二個令牌「島」增加,如果我留在我目前的選擇第二次出現的絕對距離令牌「語言」會使相關性破壞。

以前有點產品的建議,但我對如何繼續前進該選項的損失。

任何其他解決方案也將受到歡迎。

我明白這個問題很詳細。不過,我已經搜索了很長時間,並且沒有在這個主題上發現任何類似的問題。

我覺得如果這個問題得到解答,它將成爲社區的一個很好的補充,並且會讓任何設計任何與相關性相關的東西都相當開心。

謝謝。

回答

0

你似乎正在使用命中列表有點不同,然後他們打算如何使用(至少給我的理解)。

通常人們比較不同文檔返回的匹配列表。這就是他們如何將一個文檔排序爲「比其他文檔更」相關「。這就是說,如果你想找到所有的位置的單詞「java」和「島」的多個單詞短語,如「java島」的所有位置,你會......

  • 找對的「java」
  • 位置的列表,同時獲得一個位置列表的「孤島」
  • 排序兩個列表,通過這兩個列表
  • 迭代。你開始獲得這兩個列表的第一個條目。現在測試這一對條目。 I.E.,如果這些條目是「一個」,你已經找到了一個「java island」(或者「island java」)實例。獲取當前顯示最小值的列表中的下一個條目。測試這對新的條目。重複。

順便說一句 - 比較2種不同文檔時,點積更有用。

0

好吧,既然你明確詢問點積產品的建議,我會試着更正式地解釋一下我的想法。請記住,它不是非常有效,因爲它可能會將基於長度的複雜度從基於長度的文本轉換爲基於長度的文本(除非有一些技巧可以削減)。

我最初的想法是將每個匹配列表轉換爲文本長度的一系列二進制值,其中有一個命中,否則爲低。

例如, java會看起來

1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 

但是,既然你想接近,將每個事件轉換爲金字塔,例如, -

3 2 1 0 0 0 1 2 3 2 1 0 0 0 1 2 3 2 0 0 0 0 0 1 2 3 

島嶼同樣的方式 -

0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

現在的點積會給你某種兩個向量之間的接近度「得分」的,因爲它積累都在那裏兩個字是接近的位置(越接近越好)。 Java和島嶼可以說有16的相互得分。對於更高的門檻,您可以進一步拉伸金字塔,或者使用形狀來玩。

現在,在這裏您添加另一個建議,這種方法不是非常適合,你也想捕捉最接近的確切位置,這是不是很好定義恕我直言,如果word1匹配word2(在某些level)在position1中,但word2匹配位於同一級別的word3 - 你想要什麼位置?

另外,請注意,此方法是O(*長度text_length話^ 2),這可能是在某些情況下很好的,但對其他人來說很糟糕(如果你正在尋找如天書)