2011-06-30 94 views
6

我有幾個非英文文本。我想對他們進行文體比較。檢測和比較短語的算法

比較風格的一種方法是尋找類似的短語。如果我在一本書中發現「釣魚,滑雪和徒步旅行」幾次,在另一本書「釣魚,徒步旅行和滑雪」中,風格的相似點指向一位作者。不過,我也需要找到「釣魚,甚至是滑雪或徒步旅行」。理想情況下,我還會發現「釣魚,徒步旅行和滑雪」,但由於它們是非英語文本(Koine Greek),所以同義詞很難容忍,而且這方面並不重要。

什麼是最好的方法來(1)去檢測這些類型的短語,然後(2)在其他文本中以不太嚴格的方式搜索它們(以便找到「釣魚,甚至滑雪或徒步旅行「)?

回答

8
  • 把你所有的文本,並建立一個單詞列表。簡單的方法:採取所有的話。困難的方法:只採取相關的措施(即:用英語表示,「這個詞從來就不是一個經常使用的相關詞)。假設你的詞彙量中有V字。
  • 對於每個文本,建立一個大小爲V * V的鄰接矩陣A.行A(i)表示你的詞彙中的單詞與第i個單詞V(i)有多接近。例如,如果V(i)=「滑雪」,則A(i,j)是單詞V(j)與單詞「滑雪」的接近程度。你更喜歡一個小詞彙!

技術細節: 對於詞彙,你有幾種可能性來獲得一個良好的詞彙。不幸的是,我不記得名字。其中之一是刪除經常出現的字詞。相反,你應該保留少數文本中出現的罕見詞彙。但是,保存完全在一個文本中的文字是沒有用的。

對於鄰接矩陣來說,通過計算你正在考慮的單詞有多遠來計算鄰接關係(指出分隔它們的單詞的數量)。例如,讓我們用你的文字很=)

一個方法相比風格的是尋找類似的短語。如果我在一本書「釣魚,滑雪和徒步旅行」中找到幾本書,並在另一本書「釣魚,徒步旅行和滑雪」中找到風格的相似性指向一位作者。不過,我也需要找到「釣魚,甚至是滑雪或徒步旅行」。理想情況下,我還會發現「釣魚,徒步旅行和滑雪」,但因爲它們是非英文文本(Koine 希臘文),所以同義詞很難容許,而且這方面並不重要。

這些完全由值:
A(方法,比較)+ = 1.0
A(方法,相似性)+ = 0.5
A(方法,希臘語)+ = 0。0

您主要需要「典型距離」。你可以舉例說,在20個分詞之後,這些詞不能再被認爲是相鄰的。

經過一些歸一化之後,只需在兩個文本的鄰接矩陣之間建立一個L2距離即可看到它們有多接近。事後你可以做更有趣的事情,但這應該會產生可接受的結果。現在,如果你有同義詞,你可以更好地更新鄰接關係。例如,如果你有在輸入 「美麗的少女」,然後
A(美觀,少女)+ = 1.0
A(宏偉,少女)+ = 0.9
A(公平,少女)+ = 0.8
甲(高妙,處女)+ = 0.8
...

2

您應該使用一些字符串相似性度量,例如Jaccard,Dicecosine similarity。你可以用單詞,單詞或字符級別n -grams或引理句來嘗試這些。 (對於像Koinè希臘語這樣高度彎曲的語言,如果你有一個很好的lemmatizer,我會建議使用引理句。)

捕捉同義詞很難,除非你有類似WordNet的東西,它將同義詞映射到一起。

1

我會遵循兩個原則:

  • 當心匹配算法過早的優化。從一個廣泛的方法開始,然後根據需要對其進行重新定義(即檢查一個簡單的「鄰近」測試是否爲數據集提供了足夠好的結果,您知道答案,如果不是,則調整它直到它結束)。在許多情況下,您會發現高度優化的解決方案不會產生與第一次粗略嘗試不同的結果。
  • 使用某種自學習算法。通過這種方式,您可以爲AI提供一些可以使其變得更加智能的文本。從你的例子中獲取靈感:在嘗試比較兩個目標文本之前,我會提供一篇關於戶外生活的文本。這種方式AI最有可能自己學習angling是一個非常接近匹配fishing

作爲一個自我學習的AI,我會使用(至少在開始)一神經網絡。有一個簡單和完整的工作示例(在Python中),可以找到here,並準確地針對「數據挖掘」。當然,你可能希望用其他語言來實現。

關於你的兩個具體的問題:

什麼是去檢測這些類型的短語

其他答案你的問題已經消失在這個細節(和它們的作者的最佳途徑似乎知道的方式比我在這方面做的還要多!),但是再一次:我會開始簡單,只需使用一個神經網絡,告訴你兩個術語有多接近。然後,我會繼續進行優化的「波浪」(例如 - 如果它是英文文本) - 僅使用單詞的詞根,或者可能根據文本的某些其他元數據(如年份)調整分數,或作者,或地理來源,或者完全改變匹配算法......),直到你對結果感到滿意爲止。

什麼是去的方式,是不是在其他文本過於僵化爲他們尋找最佳的方式(這樣才能找到「釣魚,甚至滑雪或遠足」

我要說這相當於要求AI返回「鄰近分數」超過給定閾值的所有短語。

HTH!