2011-05-01 79 views
2

我希望能夠找到具有相同含義的句子。我有一個查詢語句,還有一長串數以百萬計的其他句子。句子是單詞,或稱爲符號的一種特殊類型的單詞,它只是一種象徵正在談論的某個對象的單詞。從一個句子列表中查找類似相對含義的句子

例如,我的查詢語句是:

實施例:添加(x)至(Y),得到(Z)

可能有在我的數據庫已經存在如句子的列表:1 (x)和(y)的和爲(z)2。(x)加上(y)等於(z)3.(x)乘以(y)不等於(z)4.(z)是(x)和(y)的總和

該示例應該與我的數據庫1,2,4中的句子匹配,但不是3.同樣,對於句子匹配應該有一些權重。

它不只是數學句子,它的任何句子都可以與任何其他基於單詞含義的句子相比較。我需要一些方法來比較一個句子和許多其他句子,以找到具有相對含義的句子。即根據它們的含義在句子之間映射。

謝謝! (該標籤是語言設計,因爲我無法創建任何新標籤)

+1

你有沒有具體的使用案例,或者你只是想創建一個廣義系統? – Bashwork 2011-05-09 19:22:44

回答

6

首先:你想要解決的是很難難題。根據數據集中的內容,它可能是AI-complete

你需要你的程序知道或得知添加總和指的是同一個概念,而是不同的概念。您可能可以通過測量WordNet/FrameNet中的單詞「synsets」之間的距離來完成此操作,但如果您不想查找乘以,則必須精確計算距離。否則,您可能需要手動建立一些字概念映射(如{'add' : 'addition', 'plus' : 'addition', 'sum' : 'addition', 'times' : 'multiplication'})。

如果您想要完整的句子語義,您還需要解析句子並從解析樹/依賴關係圖中派生出含義。 Stanford parser是解析的流行選擇。

你也可以在問題回答研究中找到這個問題的靈感。在那裏,常用的方法是解析句子,然後將分析樹的片段存儲在索引中,並通過常見的搜索引擎技術(例如,在Lucene中實現的tf-idf)來搜索它們。這也會給你每句話的分數。

+0

我想,從一組框架句子開始,然後嘗試將句子與一組框架句子進行匹配是當時的出路。由於加法可以是一個簡單的框架句子,但在英語中表達加法的方法有很多。我正在查看你引用的項目。 – Phil 2011-05-07 08:04:11

+0

@菲爾:一定要看問題解答文獻。我認爲這些人的做法與你想要的很相似,儘管適應他們的想法並不是免費的午餐。 – 2011-05-09 07:53:40

1

你將需要stem句子中的單詞到一個共同的同義詞,然後比較這些詞幹並使用句子中詞幹匹配的比例(10個詞中的5個)與某個閾值比較該句子是一場比賽。例如,所有與80%以上的單詞匹配的句子(或者你認爲有理有據的百分比)。至少這是做到這一點的一種方式。

+1

這可能會用作粗略的基線方法。我至少會對文本應用tf-idf轉換,並使用lemmatizer而不是stemmer。 – 2011-05-10 07:06:09

+0

tf-idf會適用於單個句子嗎?根據我的理解,這比單個句子更適合文本。 – 2011-05-10 14:27:14

+0

的確如此,但小句子肯定會有一些變體。此外,idf不依賴於句子的長度,而是依賴於句子的數量。 – 2011-05-10 16:27:18

1

編寫一個函數,它可以從一個句子中創建一些有點散列或「表達式」,與其他句子的散列相比可以很容易。

Cca:
1。「(x)和(y)的總和是(Z)」 =>X + Y = Z
4. 「(z)是總和(x)和(y)的」 =>Z = X + Y

一些技巧進行了改造:忽略「了」的話,轉換雙字方面一個字=>「sumof」「的總和」,發現運營商的字和替換「和「 用它。

0

不那麼容易^^ 您應該首先使用停用詞過濾器,以便從中獲取非信息承載詞。 Here are some good ones

然後你想要處理同義詞。這實際上是一個非常複雜的主題,因爲你需要某種形式的詞義消歧才能做到這一點。大多數最先進的方法都比最簡單的解決方案好一點。那就是說,你用了一個詞最常用的意思。你可以用WordNet來做。您可以獲取一個單詞的同義詞,其中包含所有同義詞。然後你可以概括這個詞(它被稱爲一個同音詞),並採用最常用的含義,並用它替換搜索詞。

就這麼說吧,在NLP中處理同義詞很難。如果你只是想處理不同的字形,如添加和添加例如,你可以使用stemmer,但沒有stemmer會幫助你從添加到總和(wsd是唯一的方式)

然後你有不同的單詞如果你想得到確切的答案(x + y = z不同於x + z = y),你的句子中的順序也不應該被忽略。所以你也需要單詞依賴,所以你可以看到哪些單詞相互依賴。如果你想使用英語,The Stanford Parser實際上是最好的。

也許你應該把一個句子中的名詞和動詞放在一起,並對它們進行所有的預處理,然後在你的搜索索引中請求依賴關係。 依賴關係會是什麼樣子

x (sum, y) 
y (sum, x) 
sum (x, y) 

,你可以使用UR搜索

所以,你需要來標記,概括,得到的依賴,過濾不重要的話,讓您的結果。如果你想用德語做這個,你還需要一個詞解壓器。