對於基於它們寫在一個多語種網站的語言檔案分類,語言檢測工具是必要的。這個工具應該接受無語言註釋(後設資料)的檔案,並通過檢測語言中新增這些資訊在文件的後設資料。
為了檢測一個文件的語言,語言資訊被構造和用已知的語言的資訊進行比較。設定這些已知的語言文字被稱為語料庫。
語料庫是一種書面語言,解釋了語言用於實際生活中的文字的集合。
語料庫是從書本,成績單,而像其他的網際網路資料資源開發。語料庫的精度取決於我們使用影格效能分析演算法。
檢測語言的常用方法是使用字典。在給定的一段文字中使用的詞語將與詞典進行匹配。
在語言中常用的單詞的列表將是最簡單有效的語料庫用於檢測特定的語言,例如, a, an,在英文中。
使用字集,一個簡單的演算法是框架找到兩個語料庫,其將等於的匹配單詞的頻率之間的差異的總和之間的距離。
此類演算法有以下問題:
因為匹配單詞的頻率非常少,則該演算法不能有效地與幾個句子小文字工作。它需要大量的文字進行準確匹配。
它不能檢測到字邊界具有語言複合句,而那些具有類似空格或標點符號無字分隔。
由於在使用字集作為語料庫這些困難,單個字元或字元組會被考慮。
因為這是在一種語言中常用的字元是有限的數目,很容易應用基於單詞的頻率,而不是字元的演算法。這種演算法的工作更為出色的情況下在一個或極少數語言中使用的特定的字元集。
此演算法存在下列缺點:
它是難以區分具有相似性質的頻率兩種語言。
沒有任何特定的工具或演算法來具體確定的幫助下(如文集)所使用的多語言字元集的語言。
上述的缺點就產生了利用給定長度的字元序列為分析語料的一種新方法。個字元的這樣的序列被稱為N-gram,在一般情況下,N表示該字元序列的長度。
N元演算法是一種有效的方法來檢測語言,特別是在案件歐洲語言如英語的。
該演算法與短文正常工作。
雖然有高階語言紋演算法來檢測多個語言中具有更吸引人的特徵的多語言文件,Tika使用3-grams演算法,因為它適合於大多數實際情況。
在所有由ISO639-1標準的184標準語言,Tika可檢測18種語言。語言檢測Tika是通過使用LanguageIdentifier類的getLanguage()方法。此方法返回字串格式的語言代號。下面給出由Tika檢測出的18語言程式碼對的列表中:
da—Danish | de—German | et—Estonian | el—Greek |
en—English | es—Spanish | fi—Finnish | fr—French |
hu—Hungarian | is—Icelandic | it—Italian | nl—Dutch |
no—Norwegian | pl—Polish | pt—Portuguese | ru—Russian |
sv—Swedish | th—Thai |
範例化LanguageIdentifier類,則應該將內容傳遞的字串格式將被提取,或LanguageProfile類物件。
LanguageIdentifier object=new LanguageIdentifier(“this is english”);
下面給出的是Tika語言檢測的範例程式。
import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.language.LanguageIdentifier; import org.xml.sax.SAXException; public class LanguageDetection { public static void main(String args[])throws IOException, SAXException, TikaException { LanguageIdentifier identifier = new LanguageIdentifier("this is english "); String language = identifier.getLanguage(); System.out.println("Language of the given content is : " + language); } }
將以上程式碼儲存為LanguageDetection.java並在命令提示字元處使用以下命令執行它:
javac LanguageDetection.java java LanguageDetection
它提供了以下的輸出:
Language of the given content is : en
要檢測一個給定的文件的語言,必須使用parse()方法來解析它。parse()方法解析處理程式物件,這是傳遞給它的引數的內容,並將其儲存。通過LanguageIdentifier類物件處理,建構函式的字串的格式如下圖所示:
parser.parse(inputstream, handler, metadata, context); LanguageIdentifier object = new LanguageIdentifier(handler.toString());
下面給出的是一個演示如何檢測一個給定的文件的語言完整的程式:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.Parser; import org.apache.tika.sax.BodyContentHandler; import org.apache.tika.language.*; import org.xml.sax.SAXException; public class DocumentLanguageDetection { public static void main(final String[] args) throws IOException, SAXException, TikaException { //Instantiating a file object File file = new File("Example.txt"); //Parser method parameters Parser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream content = new FileInputStream(file); //Parsing the given document parser.parse(content, handler, metadata, new ParseContext()); LanguageIdentifier object = new LanguageIdentifier(handler.toString()); System.out.println("Language name :" + object.getLanguage()); } }
將以上程式碼儲存為SetMetadata.java並在命令提示字元下執行:
javac SetMetadata.java java SetMetadata
注意:假設sample.txt 有下列內容:
Hi students welcome to yiibai
它提供了以下的輸出:
Language name :en
隨著Tika jar,Tika提供了一個圖形化使用者介面應用程式(GUI)和命令列介面(CLI)的應用程式。可以像其他Java應用程式在命令提示字元下執行 Tika 的應用程式。