Tika 简明教程

TIKA - Language Detection

Need for Language Detection

对于根据多语言网站中书写语言对文档进行分类,需要使用语言检测工具。此工具应接受没有语言注释(元数据)的文档,并通过检测语言将该信息添加到文档的元数据中。

Algorithms for Profiling Corpus

What is Corpus?

要检测文档的语言,需要构建语言配置文件,并将其与已知语言的配置文件进行比较。这些已知语言的文本集称为 corpus

语料库是一组书面语言的文本集合,用于说明在实际情况下如何使用该语言。

语料库是从书籍、成绩单以及互联网等其他数据资源开发的。语料库的准确性取决于我们用来构建语料库的分析算法。

What are Profiling Algorithms?

检测语言的常用方法是使用词典。文中给定的一段文字中使用的单词将与词典中的单词进行匹配。

特定语言中使用的常用单词列表将成为用于检测特定语言的最简单且最有效的语料库,例如,英语中的冠词 aanthe

Using Word Sets as Corpus

使用单词集,一个简单的算法把两个语料库之间的距离表达为匹配单词的频率之间的差值的求和。

此类算法有以下问题:

  1. 由于匹配单词的频率非常低,该算法无法有效处理只有几个句子的短文。它需要大量文本才能进行精确匹配。

  2. 它无法检测具有复合句的语言的单词边界,以及没有空格或标点符号等单词分隔符的语言的单词边界。

由于在使用单词集作为语料库中存在这些困难,因此考虑单个字符或字符组。

Using Character Sets as Corpus

由于某一语言中常用的字符数量有限,因此很容易应用基于单词频率而不是字符的算法。这种算法对于一种或极少数语言中使用的特定字符集表现得非常好。

该算法有如下缺点:

  1. 难以区分具有相似字符频率的两种语言。

  2. 没有具体的工具或算法可以使用多个语言使用的字符集(作为语料库)来专门识别一种语言。

N-gram Algorithm

上述缺点催生了一种新方法,即使用给定长度的字符序列来描述语料库。此类字符序列通常称为 n 元词,其中 n 表示字符序列的长度。

  1. n 元算法是一种有效的语言检测方法,特别是在英语等欧洲语言的情况下。

  2. 该算法与短文配合效果很好。

  3. 虽然有高级语言描述算法可以检测多语言文档中具有更吸引人的功能的多语言,但是 Tika 使用 3 元词算法,因为它适用于大多数实际情况。

Language Detection in Tika

在 ISO 639-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

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

Language Detection of a Document

要检测给定文档的语言,你必须使用 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 应用程序。