TIKA - 语言检测
语言检测的必要性
为了根据多语言网站中编写的语言对文档进行分类,需要一个语言检测工具。此工具应接受没有语言注释(元数据)的文档,并通过检测语言将该信息添加到文档的元数据中。
用于分析语料库的算法
什么是语料库?
为了检测文档的语言,需要构建语言配置文件并将其与已知语言的配置文件进行比较。这些已知语言的文本集称为语料库。
语料库是书面语言的文本集合,用于解释该语言在实际情况下的使用方式。
语料库是从书籍、抄本和其他数据资源(如互联网)开发而来的。语料库的准确性取决于我们用来构建语料库的分析算法。
什么是分析算法?
检测语言的常用方法是使用词典。给定文本中使用的单词将与词典中的单词进行匹配。
一种语言中常用单词的列表将是检测特定语言的最简单和最有效的语料库,例如,英语中的文章a,an,the。
使用词集作为语料库
使用词集,可以构建一个简单的算法来查找两个语料库之间的距离,该距离等于匹配词频率差异的总和。
这种算法存在以下问题−
由于匹配词的频率非常低,因此该算法无法有效地处理只有少量句子的小文本。它需要大量的文本才能实现准确匹配。
对于具有复合句的语言以及没有空格或标点符号等单词分隔符的语言,它无法检测单词边界。
由于使用词集作为语料库存在这些困难,因此会考虑单个字符或字符组。
使用字符集作为语料库
由于一种语言中常用的字符数量有限,因此很容易应用基于词频而不是字符的算法。如果某些字符集只用于一种或极少数几种语言,该算法的效果会更好。
该算法存在以下缺点 −
很难区分具有相似字符频率的两种语言。
没有特定的工具或算法可以借助多种语言使用的字符集(作为语料库)来专门识别一种语言。
N-gram 算法
上述缺点催生了一种使用给定长度的字符序列来分析语料库的新方法。这种字符序列通常称为 N-gram,其中 N 表示字符序列的长度。
N-gram 算法是一种有效的语言检测方法,尤其是对于英语等欧洲语言。
此算法适用于短文本。
尽管有高级语言分析算法可以检测具有更多吸引人特征的多语言文档中的多种语言,但 Tika 使用的是 3-gram 算法,因为它适用于大多数实际情况。
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 |
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); } }
将上述代码保存为 LanguageDetection.java,然后使用以下命令从命令提示符运行它 −
javac LanguageDetection.java java LanguageDetection
如果执行上述程序,它将给出以下输出−
给定内容的语言为: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 { //实例化文件对象 File file = new File("Example.txt"); //解析器方法参数 Parser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream content = new FileInputStream(file); //解析给定的文档 parser.parse(content, handler, metadata, new ParseContext()); LanguageIdentifier object = new LanguageIdentifier(handler.toString()); System.out.println("语言名称 :" + object.getLanguage()); } }
将上述代码保存为 SetMetadata.java 并从命令提示符运行它 −
javac SetMetadata.java java SetMetadata
下面给出了 Example.txt 的内容。
Hi students welcome to tutorialspoint
如果执行上述程序,它将为您提供以下输出 −
语言名称 :en
除了 Tika jar,Tika 还提供了图形用户界面应用程序 (GUI) 和命令行界面 (CLI) 应用程序。您也可以像其他 Java 应用程序一样从命令提示符执行 Tika 应用程序。