TIKA - 語言檢測



語言檢測的必要性

對於在多語言網站上根據文件的書寫語言進行分類,需要一個語言檢測工具。此工具應接受沒有語言註釋(元資料)的文件,並透過檢測語言在文件的元資料中新增該資訊。

語料庫分析演算法

什麼是語料庫?

為了檢測文件的語言,構建語言特徵並將其與已知語言的特徵進行比較。這些已知語言的文字集稱為語料庫

語料庫是書面語言文字的集合,解釋了語言在現實情況中的使用方式。

語料庫是從書籍、記錄和其他資料資源(如網際網路)中開發的。語料庫的準確性取決於我們用來構建語料庫的分析演算法。

什麼是分析演算法?

檢測語言的常用方法是使用字典。給定文字中使用的單詞將與字典中的單詞進行匹配。

一種語言中常用詞的列表將是檢測特定語言最簡單有效的語料庫,例如英語中的冠詞aanthe

使用詞集作為語料庫

使用詞集,構建一個簡單的演算法來查詢兩個語料庫之間的距離,這將等於匹配詞的頻率差異之和。

此類演算法存在以下問題:

  • 由於匹配詞的頻率非常低,因此該演算法無法有效處理只有幾句話的短文字。它需要大量文字才能進行準確匹配。

  • 它無法檢測具有複合句的語言的詞邊界,以及那些沒有詞分隔符(如空格或標點符號)的語言。

由於使用詞集作為語料庫存在這些困難,因此考慮使用單個字元或字元組。

使用字元集作為語料庫

由於一種語言中常用的字元數量是有限的,因此很容易應用基於詞頻而不是字元的演算法。對於某些字元集中只在一兩種語言中使用的字元,此演算法的效果更好。

此演算法存在以下缺點:

  • 難以區分字元頻率相似的兩種語言。

  • 沒有特定的工具或演算法可以專門利用(作為語料庫)多種語言使用的字元集來識別某種語言。

N-gram 演算法

上述缺點催生了一種新的方法,即使用給定長度的字元序列來分析語料庫。這些字元序列通常稱為 N-gram,其中 N 表示字元序列的長度。

  • N-gram 演算法是語言檢測的一種有效方法,尤其是在英語等歐洲語言中。

  • 此演算法適用於短文字。

  • 儘管存在更高階的語言分析演算法可以檢測多語言文件中的多種語言,並且具有更吸引人的功能,但 Tika 使用 3-gram 演算法,因為它適用於大多數實際情況。

Tika 中的語言檢測

在 ISO 639-1 標準化的所有 184 種標準語言中,Tika 可以檢測 18 種語言。Tika 中的語言檢測是使用LanguageIdentifier類的getLanguage()方法完成的。此方法以字串格式返回語言的程式碼名稱。以下是 Tika 檢測到的 18 個語言程式碼對的列表:

da—丹麥語 de—德語 et—愛沙尼亞語 el—希臘語
en—英語 es—西班牙語 fi—芬蘭語 fr—法語
hu—匈牙利語 is—冰島語 it—義大利語 nl—荷蘭語
no—挪威語 pl—波蘭語 pt—葡萄牙語 ru—俄語
sv—瑞典語 th—泰語

在例項化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 

以下是 Example.txt 的內容。

Hi students welcome to tutorialspoint

如果執行上述程式,它將輸出以下內容:

Language name :en

除了 Tika jar 之外,Tika 還提供了一個圖形使用者介面應用程式 (GUI) 和一個命令列介面 (CLI) 應用程式。您也可以像其他 Java 應用程式一樣從命令提示符執行 Tika 應用程式。

廣告

© . All rights reserved.