TIKA - 语言检测


需要语言检测

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

分析语料库的算法

什么是语料库?

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

语料库是书面语言文本的集合,解释该语言在实际情况中的使用方式。

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

什么是分析算法?

检测语言的常见方法是使用字典。给定文本片段中使用的单词将与词典中的单词相匹配。

一种语言中使用的常用单词列表将是用于检测特定语言的最简单且有效的语料库,例如英语中的文章aanthe 。

使用单词集作为语料库

使用单词集,构建一个简单的算法来查找两个语料库之间的距离,该距离等于匹配单词的频率之间的差异之和。

此类算法存在以下问题 -

  • 由于匹配单词的频率非常低,因此该算法无法有效地处理句子较少的小文本。它需要大量文本才能准确匹配。

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

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

使用字符集作为语料库

由于语言中常用的字符数量有限,因此很容易应用基于词频而不是字符的算法。在一种或极少数语言使用某些字符集的情况下,该算法效果更好。

该算法存在以下缺点 -

  • 区分具有相似字符频率的两种语言是很困难的。

  • 没有特定的工具或算法可以借助(作为语料库)多种语言使用的字符集来专门识别一种语言。

N-gram算法

上述缺点催生了一种使用给定长度的字符序列来分析语料库的新方法。这种字符序列一般称为N-gram,其中N表示字符序列的长度。

  • N-gram 算法是一种有效的语言检测方法,特别是对于英语等欧洲语言。

  • 该算法对于短文本效果很好。

  • 尽管有先进的语言分析算法可以检测多语言文档中的多种语言,这些算法具有更有吸引力的功能,但 Tika 使用 3-grams 算法,因为它适合大多数实际情况。

Tika 中的语言检测

在 ISO 639-1 标准化的所有 184 种标准语言中,Tika 可以检测 18 种语言。Tika 中的语言检测是使用LanguageIdentifier类的getLanguage()方法完成的。此方法以字符串格式返回语言的代码名称。下面给出的是 Tika 检测到的 18 个语言代码对的列表 -

da——丹麦语 de—德语 et—爱沙尼亚语 el——希腊语
en—英语 es—西班牙语 fi—芬兰语 fr—法语
hu—匈牙利语 是——冰岛语 它——意大利语 nl—荷兰语
不——挪威语 pl—波兰语 pt—葡萄牙语 ru—俄语
sv—瑞典语 th—泰语

在实例化LanguageIdentifier类时,您应该传递要提取的内容的String格式,或者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 应用程序。