如何判斷兩段文本說的是「同一件事情」?

現有的語義模型,例如 Word2Vec,LDA 等,能判斷文本與文本之間的「相似程度」。但很難斷言兩段文本是否說的是「同一件事」。例如這樣的文本,我們定義為相同:
Iphone 有什麼缺點?/蘋果手機有哪些不好的地方?
2月20日,川普總統訪問了中亞五國。/2月20日,美國總統特朗普對哈薩克等國進行了訪問。

但下面的只能說「語義相關」,而不是「相同」;使用語義分析的技術,得到的語義相似度度量,卻常常和「相同文本」的語義相似度度量沒有什麼區別。例如:
Iphone 有什麼缺點?/ Ipad 有什麼缺點?
特朗普總統訪問了中亞五國。/普京總統訪問了北歐的一些國家。

現在有什麼技術可以完成這種「語義相同」的識別?

本題已收錄至知乎圓桌:人工智慧 · 語言智能,更多「人工智慧」相關話題歡迎關注討論


剛剛被邱錫鵬大神贊了。。好激動。。這兩天正好在看相關方向的論文,在原回答後面又補充回答一下attention based method, 怎樣的siamese architecture, 不同的distance metrics,甚至怎樣利用unsupervised pretraining在數據量有限的情況下盡量地generalize model達到最佳效果。歡迎吐嘈

----------------------

雖然問題放出來才七天,但感覺有種要歪樓的趨勢,逼得不研究這個的工業狗來強答一波真的好嗎。

首先先反對說這事做不了的,Paraphrase Identification即使是短文本的我感覺做的已經很不錯了。微軟的Microsoft Research Paraphrase Corpus (MSRP)數據集就是來搞這個事情的。這裡貼一下地址Paraphrase Identification (State of the art) 所有引用這個數據集的最高的F score已經到85.9%了,還是在training data只有4000+句子的基礎上啊。這麼小的數據自然需要加很多額外的feature才能跑得好,所以dependency tree啊wordnet啊的方法表現都很不錯。SRL (Semantic Role Labelling)的結果也可以加進來當作feature啊,但純用information extraction來做的方法我是不支持的,能作用到的句子範圍太窄了

而如果你的數據量本身比較大的話完全可以嘗試end-to-end的方法啊,省時省力遷移性也好。Quora作為一個國外知乎前些時間放出了一個公共數據集,用於檢測問題是否是duplicated (下載地址First Quora Dataset Release: Question Pairs).

這裡面有很多干擾項,比如有些相關而非意思相同的問題。對這個問題Quora自家放出一個benchmark,是基於LSTM的,請看這裡Semantic Question Matching with Deep Learning

結構非常簡單,就是把一對問題Embedding了以後想辦法用LSTM encode成representation再計算距離。端到端計算簡直完美,然後他們好像並沒有放code。但是不貼代碼對初學者而言幫助並不大,於是我查了reddit,還真有人用類似的方法實現了,並將代碼放在了github上,請移步這裡 lampts/my_dl_solutions 據作者稱其F1達到了79%,auc達到了92%。數據集本身比較大嘛,並不稀奇。

這顯然並不是最優的解法,加了attention的做法效果至少要再好5個百分點,然而我本人並沒有實驗過,坐等大神們來答state of the art的方法。因為類似的方法拿來做information retrieval based Question Answering基本連代碼都不用改,最近也是相當火啊。抱歉中文有沒有類似的數據集我不清楚但是方法應該是類似的。

最後頂一下2PiR的答案,希望他能詳細說說

---------------------

暫時還沒有大神登陸,所以我再自力更生貢獻一點乾貨。我在之前的答案里說了,paraphrase identification和information retrieval based QA很像,為什麼呢?因為一個問題的答案(e.g. 天空是藍色的)從某種角度來看,可以看作是這個問題的paraphrase (e.g.天空是什麼顏色的?)然後,假設我有一堆備選答案,有一些干擾項是相關但並不準確的(e.g.天空下的大地是綠色的),這時搜索引擎如何能排除干擾選項而找到最準確的答案呢?用paraphrase identification的模型一個個去比對備選答案唄,比對相似度最高的那個作為答案(基本是這個思路,當然實際當中不可能遍歷去比如)

大家試想如果這個模型訓練的好,對於用戶的每一個問題,你都能從維基百科裡找出最符合答案的一句話來作為回答,這樣的成果是不是很誘人?基本上一個問答機器人的雛形就浮出水面了呀。確實不錯,所以這一塊現在也非常的火。有兩個數據集提一下,一個叫insuranceQA,一個叫wikiQA,大家都在這上面跑benchmark。

我前面說了,Quora這個模型顯然不是最優的。我下面會列舉一些文章,談談它們的架構為什麼有良好的表現,有代碼的也貼貼代碼,造福一下大家。

先介紹一下這一篇,APPLYING DEEP LEARNING TO ANSWER SELECTION: A STUDY AND AN OPEN TASK,真是業界良心。說它有良心倒真不是因為它的模型好,而是因為它做了很多實驗,把我能想到的結構都試了一遍,這樣我就不需要自己去試了,很費時間的。

它最終表示這個框架最好,全連接層和CNN層用的是共享權重(Siamese 結構),而這個P+T是指pooling和tanh層是Q和A分開的,說是這樣的結構效果最佳。至於最終他們模型建議用的是GESD距離,而不是cosine similarity距離,CNN的filter加到4000之後模型在insuranceQA上表現最好能到0.65

然後下一篇是Attentive Pooling Networks,創新點在於用Q和A的representation構造了一個矩陣G,分別對這個G的row和column做max pooling, 這樣就能分別能得到Q和A的attention vector。作為比較簡單的attention實現,在wikiQA上表現大概是0.68幾

說到這裡要吐槽一下不用attention的模型,比如說Quora的模型,單憑一個cosine distance想把error BP傳回去,這個也太理想了吧。真正句子之前相似度的比較是多個維度的比較,有word level, syntax level, semantic level,每個level都很微妙而難以捕捉,這時要通過attention機制把能匹配上的先匹配上再來看high-level層面的相似度,這樣的模型才make sense不是嗎。

還有三篇我想講,但今天講不動了。分別是Attentive CNN (Yin and Schütze, 2015) , L.D.C. (Wang et al., 2016) 和 Key-Value Memory Networks for Directly Reading Documents, 他們中間最好的在wikiQA上達到了0.70幾,雖然就那麼兩個百分點,但是啟示性是不一樣的。所以等我有機會還要好好說說。

接下來要放代碼了,這個博客用了keras的實現,是比較簡單的Siamese結構用於insuranceQA的,也配有代碼Deep Language Modeling for Question Answering using Keras但是該博主的代碼效果並不理想,我覺得有幾個原因,一來它Embedding用了fixed的word2vec,大家都知道fixed embedding會挺傷的,二來它cnn filter設太少,三來它Q和A的pooling並沒有分開,所以效果真的還好。另外一個github, 效果是不錯基本實現了論文中宣稱的準確率,但是注釋比較少,新手學習曲線有點小高,在這裡也貼一下white127/insuranceQA-cnn-lstm

key-value memory network的實現也很多啦,這裡貼兩個https://github.com/facebook/MemNN/tree/master/KVmemnn 和https://github.com/siyuanzhao/key-value-memory-networksTensorflow

--------------------------------------------------------

本來打算很快更新來補充完那些想說卻沒說完的,但隨著研究的深入卻發現這裡水之深遠沒想的那麼簡單。於是我只好暫時先擱筆,每一段時間有了新的感悟就寫一段分享一下。之前我提到的論文往往較為小型理想化,對於同一個物體的不同種說法應該已經能判斷得比較準確,並且也確實是end-to-end。但是除非公司真的有無限資源可以用來label data,實際上同一物體不同說法的數據是非常sparse的,如果training data中沒見過「蘋果手機」和「iphone」,僅憑word embedding的相似程度,是很難判斷兩個說的是不是同一個東西的。所以如果要強調實用性,首要的問題就是能否將prior knowledge加入模型,或者換句話來說,如果我有一個knowledge graph (base),怎樣將裡面的triple進行embedding並支持模型的判斷。如果可以實現的話,那麼如果有新詞或新的object產生,就不需要加入新的label data而是只要update knowledge base就能達到同樣的效果,這樣一來成本就低的多。我覺得這完全是可行的,只是涉及到KB-QA的領域,對我而言有點新,所以我也正在學習,希望不久的將來能夠補完這部分的模型,奉上一份令自己滿意的答案。


謝@Epic Composer邀。現有的答案沒答到點子上,還是局限於最簡單的word-level文本表示的範疇。

解決這個問題的一個比較簡單的思路是語義角色標註(SRL, semantic role labelling)。直觀來看,兩句話如果指同一件事情(在這裡「同一件事情」沒有嚴格的被定義,暫且這麼粗略的表述),其predicate-argument的相似性會極高。

SRL是NLP中一個很經典的任務。SRL建立在Frame Semantics的基礎上,目的在於figure out who did what do whom. 在信息抽取和對話系統中用的比較多,下面的圖很直觀了:

現在比較常用的PropBank規定的標準argument如下(比起Frame Semantics粒度更粗一些):

基於傳統機器學習模型的SRL多是從上層的句法層面抽取比較複雜的語言學特徵。基於深度學習的系統可以以非常簡單特徵的embedding作為輸入,深層網路處理後最後加一層CRF做inference。貼個論文鏈接End-to-end Learning of Semantic Role Labeling Using Recurrent Neural Networks: http://www.aclweb.org/anthology/P/P15/P15-1109.pdf

對這個問題來說,做paraphrase或者text entailment的學習推斷也是很好的選擇,但可能會相對複雜一些。

最近due太多不詳細介紹了,有人看再展開說。


因為最近正在看這方面的論文,試著回答一下,如果有不完善的地方還希望各位指正。

題主問的問題實際上屬於判斷文本相似度的問題,假設有文本T1和T2,則其匹配程度可用下列公式表示

match(T1,T2) = F(f(T1), f(T2))

這些問題目前有兩種主流的做法:一種稱為representation-focused,即傾向於首先將文本整體按照某種規則表示出來,即更注重上式中的函數f,我見過文章中使用過CNN和RNN來實現對f的擬合,獲得了文本表示之後即可用餘弦相似度等簡單的函數計算文本的相似度;另一種方法稱為interaction-focused,即將兩個文本以某種方式聯繫,更注重上式中的F,對兩者的聯繫(如矩陣)進行擬合。我感覺在representation-focused方法中對文本的表示也許會導致某些細節的缺失,所以第二種方法可能效果好一點。

可能上面介紹的有些枯燥,以一篇自己覺得很有意思的論文說明一下interaction-focused是怎麼做的,論文鏈接為[1602.06359] Text Matching as Image Recognition

對於兩個文本T1={w1, ... , wm}和T2={v1, ... vn},其中wi和vj分別為T1和T2中的第i和j個單詞,我們可以通過word embedding獲得其對應的詞向量,此時單詞之間的關係是可以通過向量的運算(如餘弦、點乘等)體現的;

此時構建一個關係矩陣M,其元素Mij表示單詞wi的向量和vj的向量的相似程度;

將矩陣M通過訓練好的CNN,獲得兩個文本之間的相似程度。


SemEval每年(從2012年到2017年)都組織Semantic Textual Similarity這個share task,就是看兩個句子之間的語義相關度,應該和題主的問題差不多。這個任務還有個wiki Semantic Textual Similarity Wiki 以及每年的結果排名:

以上倆圖都來自Semantic Textual Similarity Wiki ,表格中有論文連接,非常方便。通過這些論文基本可以知道當前比較有效的方法有哪些。


謝邀。

題主的意思應該是短文本的處理。而短文本的相似度計算確實是信息檢索與自然語言處理領域的一個難題。使用傳統的向量空間模型/詞袋模型,去處理短文本,再加上語料受限的話,幾乎不可能完成題主所述的「相似度計算」的任務。

所以目前在理論上比較可行的辦法便是使用詞向量/詞嵌入/word embedding。由於詞向量可以編碼單詞語義,因此對於題主提到的「iphone有什麼缺點」和「蘋果手機有哪些不好的地方」會得到很高的相似度。(經詞向量編碼,「iphone」與「蘋果手機」,「什麼」與「哪些」,「缺點」與「不好」都會被看作是近似相等的詞。)

剩下的交給神經網路出相似度預測結果吧(當然,像過濾掉「iphone有什麼缺點」與「ipad有什麼缺點」,可以通過交叉驗證尋找一個較優閾值。如果濾掉的同時又會將正確的句子濾掉,那麼一般來說,想辦法訓練質量更好的詞向量較為明智)

神經網路可以嘗試RNTN,這是目前主流的神經網路架構中最接近文本自然結構的架構。頂層加個softmax判斷「句子向量」的相似度就可以了。

這是目前比較主流的方法。至於計算tf-idf餘弦相似度這類信息檢索中的方法,一般來說是不適合用來處理短文本的。如果不用神經網路,也是可以考慮計算句向量餘弦相似度來計算文本相似度。

而長文本的相似度計算就簡單多了,傳統的信息檢索模型足以應付,即基於tf-idf的餘弦相似度計算。


排第一的那個回答里提到了Quora的數據集,碰巧看到這個問題上了kaggle,各位有興趣不妨關注下裡面的討論。實踐出真知,我先試著認真做一下了再回來答題。https://www.kaggle.com/c/quora-question-pairs#description


算是Textural Entailment的應用,可以參見The Stanford Natural Language Inference (SNLI) Corpus:The Stanford Natural Language Processing Group

這個語料庫包含了Text、Hypothesis,和一個Judgement標註了Text和Hypothesis的語義是相同的(entailment)/相反的(contradiction)/無法判斷的(neutral):

一些模型和準確率:


謝邀,已經有很多優質回答了~ 不贅述,簡要說兩個可行操作

(深度學習角度)有大量訓練集的話,用bi-lstm對兩段字元串encode,設計相似度函數作為目標函數訓練模型

(知識圖譜角度)沒有訓練集的話,可先做詞性標註,將重要的名詞 形容詞 用Wordnet對這些特徵辭彙做數據增強,找到同義詞群 匹配同義詞群相似度

當測試句子相似度高於某閾值,可判為「同一件事情」


可以用知識圖譜相關的技術來解決。

最近正好在做特定領域的多語言短文本相似度判斷工作,用到了NLP、知識圖譜相關的一些技術,結合題主的問題,說一下大概的思路:

1. 先針對大量的領域語料通過分詞、NCR、關鍵詞抽取的方式抽出實體(有條件可以再抽出屬性和屬性值),然後糾錯、去重、消歧等,建立起領域知識圖譜。

2. 接下來是建立實體之間的關係,比如蘋果手機和iPhone是等價關係,iPhone 8和蘋果手機是屬於關係,iPhone和iPad分別與蘋果公司是從屬關係,川普和特朗普是Trump的不同音譯名,也是等價關係,中亞五國和哈薩克是組合關係。

這塊工作最難且沒有特別系統全面的方法,需要根據不同的情況使用不同的方案,比如音譯詞可以通過詞典先導入一批,然後通過雙語語料的訓練提高準確性和發現新詞;國家這種可以提取地域相關概念庫來填充,等等。

3. 定義實體邊關係的權重,簡單點就是絕對權重,比如等價關係xx分,包含關係xx分;複雜點的話需要考慮到不同實體類別的不同關係的權重,以及關係強弱也設定不同權重。

4. 對短文本分詞,抽取並對應到實體、屬性和值,然後根據邊關係權重計算距離;注意到實體的多義性,需要用到CRF的方法來判斷最可能的情況,比如:

「蘋果好吃嗎」「蘋果好看嗎」「蘋果好用嗎」,在三種屬性「吃」「看」「用」的情況下,「蘋果」是水果的概率還是手機的概率是不一樣的,那麼三者之間的距離也會有很大差別。

本質來說,是用統計得出規則,人工完善規則,然後應用在具體的場景上。


不太可能,如果能做到語義識別,那就和人工智慧不遠了。

但是你試試這些:

1.冬天:能穿多少穿多少;夏天:能穿多少穿多少。

2.剩女產生的原因:一是誰都看不上,二是誰都看不上。

3.單身人的來由:原來是喜歡一個人,現在是喜歡一個人。

4.女致電男友:我到西直門了,你快往地鐵站走。如果你到了,我還沒到,你就等著吧。如果我到了,你還沒到,你就等著吧!

5.兩種人容易被甩:一種不知道什麼叫做愛,一種不知道什麼叫做愛。

6.想和某個人在一起的兩種原因:

一種是喜歡上人家,另一種是喜歡上人家。

其他評論里的演算法都差得遠了,不信你用他們提到的任何一種演算法去計算「能穿多少穿多少」和「能穿多少穿多少」是否說的是「同一件事情」,保證程序一臉槽逼。

一模一樣的句子意思都不一樣,更別提不一樣的句子了。


查找近義詞 或者搜索關鍵詞

例如川普總統訪問了中亞五國。/2月20日,美國總統特朗普對哈薩克等國進行了訪問。

上面這句話 關鍵詞川普 等同於 特朗普,關鍵詞中亞五國,首先需要理解什麼是中亞五國,即搜索關鍵詞中亞五國是哪五國,其中包含哈薩克,第二句話哈薩克中包含關鍵字「等」,即出現一個或部分成員即略等同於中亞五國

應該是NLP相關的,但是我並沒有選擇這門課/捂臉 有錯輕拍


統計語言模型應該是覆蓋不到這個場景的,回答統計語言模型的都根本沒搞清統計語言模型是啥


1,分詞

2,刪除不重要的詞和字元

3,分析語句結構,構造相應語義函數

4,文章支持特徵進行相似性分析

最後根據相似詞語和語句結構分析文章相似性


目前主要通過無監督的相似性來判斷。如果是做監督學習,我覺得可以利用問答對來做,主流社區的問答數據。

通過問題和答案之間的相關性來建模,一個問題的對應回答,比其他問題的回答更相關。通過這個訓練出問題的特徵向量模型。


目前還做不到這麼智能,之前這麼做過:直接查表得到向量後,經過autoencoder然後算馬氏距離,準確率85左右。這種判斷是不是一個事實的,還可以用句法+消歧的方式來做,有機會會嘗試一下。


推薦閱讀:

triplet loss 在深度學習中主要應用在什麼地方?有什麼明顯的優勢?
人工智慧的自我提升是可能的嗎?目前有什麼不可破的技術障礙嗎?
人工智慧在哪些領域還落後於人類?
人工智慧四問?

TAG:人工智慧 | 演算法 | 自然語言處理 | 信息檢索 | 人工智慧演算法 |