2010-02-24 52 views
25

假設我們有內容的文本文件: 「濟豬鏈球菌未情郎HOMME ......」如何判斷寫入純文本文件的語言是什麼?

另一個具有: 「我是一個勇敢的人」

第三,在德國的文本: 「Guten morgen。Wie geht's?」

我們如何編寫一個函數來告訴我們:第一個 文件中的文本是英文的,第二個文件是法文文件?

歡迎鏈接到圖書/開箱即用的解決方案。我用Java編寫,但如果需要,我可以學習Python。

我的評論

  1. 有一個小評論,我需要補充。文本可能包含不同語言的短語,作爲整體的一部分或作爲錯誤的結果。在經典文學中,我們有很多例子,因爲貴族成員是多種語言的。所以概率更好地描述了情況,因爲文本的大部分都是用一種語言編寫的,而其他的可能是用另一種語言編寫的。
  2. Google API - Internet連接。我不想使用遠程功能/服務,因爲我需要自己做或使用可下載的庫。我想對這個話題進行研究。
+0

@EugeneP:法國人會更多「但是一個語言檢測器不太可能發現那個錯誤(或者至少非常罕見的用法)。 – SyntaxT3rr0r 2010-02-24 13:03:41

+0

@WizardOfOdds Je suis un bonhomme alors,merci,quand meme;) – EugeneP 2010-02-24 13:06:53

+2

另外,希望你已經檢查過這個:http://stackoverflow.com/questions/1383503/how-to-determine-the-natural-language-of- a-document – 2010-02-24 13:40:15

回答

19

有一個叫JLangDetect包,它似乎做你想要什麼:

langof("un texte en français") = fr : OK 
langof("a text in english") = en : OK 
langof("un texto en español") = es : OK 
langof("un texte un peu plus long en français") = fr : OK 
langof("a text a little longer in english") = en : OK 
langof("a little longer text in english") = en : OK 
langof("un texto un poco mas largo en español") = es : OK 
langof("J'aime les bisounours !") = fr : OK 
langof("Bienvenue à Montmartre !") = fr : OK 
langof("Welcome to London !") = en : OK 
// ... 

編輯:凱文指出,沒有在Nutch project類似的功能由包org.apache.nutch.analysis.lang提供。

+0

爲什麼沒有德國的例子? – Chris 2010-02-24 13:07:32

+0

@克里斯嗯,一個很好的問題。我只知道一個短語,讓我們看看我能否正確寫下它。 – EugeneP 2010-02-24 13:12:05

+0

我不知道,但德國被列爲支持的語言 – 2010-02-24 13:13:22

0

你有沒有連接到互聯網,如果你不那麼谷歌語言的API將是您的最佳選擇。

// This example request includes an optional API key which you will need to 
// remove or replace with your own key. 
// Read more about why it's useful to have an API key. 
// The request also includes the userip parameter which provides the end 
// user's IP address. Doing so will help distinguish this legitimate 
// server-side traffic from traffic which doesn't come from an end-user. 
URL url = new URL(
    "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&" 
    + "q=Paris%20Hilton&key=INSERT-YOUR-KEY&userip=USERS-IP-ADDRESS"); 
URLConnection connection = url.openConnection(); 
connection.addRequestProperty("Referer", /* Enter the URL of your site here */); 

String line; 
StringBuilder builder = new StringBuilder(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
while((line = reader.readLine()) != null) { 
builder.append(line); 
} 

JSONObject json = new JSONObject(builder.toString()); 
// now have some fun with the results... 

如果您還沒有其他方法。

3

查找馬爾可夫鏈。

基本上,您需要統計學上有意識的語言樣本。當您得到一個新文件時,請查看特定音節或音素的頻率,並比較預先計算的樣本。選擇最接近的一個。

5

對於文本較大的文本,通常使用字母,二合字母和三字母的分佈,並與您想要檢測的語言的已知分佈進行比較。

但是,單個句子很可能太短而不能產生任何有用的統計度量。然後,你可能會有更多的運氣來匹配單詞與字典。

2

雖然比您想要的更復雜的解決方案,但您可以使用Vowpal Wabbit並使用不同語言的句子進行訓練。

從理論上講,您可以獲取文檔中每個句子的語言。

http://hunch.net/~vw/

(不要被「聯機」項目的副標題所迷惑 - 這只是mathspeak用於獲悉,而無需在內存整個學習材料)

+0

謝謝你的回答。 – EugeneP 2010-02-24 13:44:57

4

NGramJ似乎有點更先進的日期:

http://ngramj.sourceforge.net/

它也有兩個字符爲導向,面向字節的配置文件,所以它應該是能夠識別的字符集了。

對於多種語言的文檔,您需要識別字符集(ICU4J有一個CharsetDetector可以做到這一點),然後將文本分割爲像多行換行符或段落(如果文本被標記)等。

+0

謝謝你的回答。 – EugeneP 2010-02-24 13:44:37

4

嘗試Nutch的Language Identifier。它使用n-gram語言配置文件進行培訓,可用語言配置文件與輸入文本匹配。有趣的是,如果你需要,你可以添加更多的語言。

+0

我們使用nutch的語言標識符,結果非常好。這是一個適用於共享字符集的語言的bigram模型的標準實現。 – 2010-02-25 08:23:03

2

如果您對可以執行語言檢測的機制感興趣,我會參考以下article(基於python),它使用(非常)天真的方法,但是特別適合介紹此問題,並且機器學習(只是一個大詞)。

對於java實現,其他海報建議的JLangDetect和Nutch非常好。也請看看Lingpipe,JTCLNGramJ


對於您有多個語言在同一個頁面上的問題,你可以用一個句子邊界探測器砍頁面到句子,然後試圖找出每個句子的語言。假設一個句子只包含一種(主要)語言,您仍然應該使用上述任何一種實現獲得良好的結果。

注意:句子邊界檢測器(SBD)在理論上是語言特定的(雞蛋問題,因爲您需要另一個)。但對於基於拉丁語腳本的語言(英語,法語,德語等),主要使用句點(除驚歎號等)作爲句子分隔符號,即使使用專爲英語設計的SBD,也會得到可接受的結果。我寫了一個基於規則的英語SBD,對法語文本非常有效。有關實現,請參閱OpenNLP

使用SBD的替代選項是使用說10個標記(空格分隔)的滑動窗口來創建僞句(PS),並嘗試識別語言更改的邊界。這有一個缺點,如果你的整個文檔有n個標記,你將對每個長度爲10個標記的字符串執行大約n-10次分類操作。在另一種方法中,如果平均句子有10個標記,則您將執行大約n/10個分類操作。如果文檔中n = 1000個字,則您將比較990個操作與100個操作:一個數量級差異。


如果您有簡短的短語(少於20個字符),則根據我的經驗,語言檢測的準確性會很差。特別是在專有名詞以及像「巧克力」這樣的語言相同的名詞中。例如。如果出現在法語的句子中,「紐約」是英語單詞還是法語單詞?

0

bigram模型運行良好,編寫簡單,培訓簡單,只需要少量文本進行檢測。 nutch語言標識符是我們發現的一個java實現,並與一個薄包裝器一起使用。

我們對於混合CJK和英文文本的bigram模型存在問題(即推文大多是日文,但只有一個英文單詞)。從數學的角度來看,這是顯而易見的(日語有更多的字符,所以任何給定字符的概率都很低)。我認爲你可以通過一些更復雜的對數線性比較來解決這個問題,但我欺騙並使用了一種基於特定語言的字符集的簡單過濾器(例如,如果它只包含統一的漢語,那麼它是中文的,如果它包含一些日本的假名和統一的漢族,然後是日語)。