- TIKA 教程
- TIKA - 首页
- TIKA - 概览
- TIKA - 架构
- TIKA - 环境
- TIKA - 参考 API
- TIKA - 文件格式
- TIKA - 文档类型检测
- TIKA - 内容提取
- TIKA - 元数据提取
- TIKA - 语言检测
- TIKA - GUI
- TIKA 有用资源
- TIKA - 快速指南
- TIKA - 有用资源
- TIKA - 讨论
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—丹麦语 | 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 应用程序。