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 应用程序。

广告