语言检测(Language Detection)
需要语言检测
对于基于在多语言网站中编写的语言的文档分类,需要语言检测工具。 此工具应接受没有语言注释(元数据)的文档,并通过检测语言将该信息添加到文档的元数据中。
分析语料库的算法
什么是语料库?
为了检测文档的语言,构造语言简档并与已知语言的简档进行比较。 这些已知语言的文本集称为corpus 。
语料库是一种书面语言文本的集合,用于解释语言在实际情况下的使用方式。
语料库是从书籍,成绩单和其他数据资源(如Internet)开发的。 语料库的准确性取决于我们用于构建语料库的分析算法。
什么是分析算法?
检测语言的常用方法是使用字典。 给定文本中使用的单词将与字典中的单词匹配。
语言中使用的常用单词列表将是用于检测特定语言的最简单有效的语料库,例如,文章a , an ,英语。
使用Word集作为语料库
使用单词集,构造一个简单的算法来找到两个语料库之间的距离,这将等于匹配单词的频率之间的差异之和。
这些算法存在以下问题 -
由于匹配单词的频率非常低,因此该算法不能有效地处理具有少量句子的小文本。 它需要大量文本才能准确匹配。
它不能检测具有复合句的语言的单词边界,以及没有单词分隔符的单词边界,如空格或标点符号。
由于使用单词集作为语料库的这些困难,考虑了单个字符或字符组。
使用字符集作为语料库
由于语言中常用的字符数量有限,因此很容易应用基于字频而不是字符的算法。 对于在一种或几种语言中使用的某些字符集,该算法甚至更好地工作。
该算法存在以下缺点 -
难以区分具有相似字符频率的两种语言。
没有特定的工具或算法可以借助(作为语料库)多种语言使用的字符集来专门识别语言。
N-gram Algorithm
上述缺点产生了一种使用给定长度的字符序列来分析语料库的新方法。 这种字符序列通常称为N-gram,其中N表示字符序列的长度。
N-gram算法是一种有效的语言检测方法,特别是在欧洲语言如英语的情况下。
该算法适用于短文本。
虽然有高级语言分析算法可以在具有更多吸引人功能的多语言文档中检测多种语言,但Tika使用3-gram算法,因为它适用于大多数实际情况。
Tika中的语言检测
在ISO 639-1标准化的所有184种标准语言中,Tika可以检测18种语言。 Tika中的语言检测是使用LanguageIdentifier类的getLanguage()方法完成的。 此方法以String格式返回语言的代码名称。 以下是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类时,应传递要提取的内容的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
如果你执行上面的程序,它给出了以下outpu-
Language of the given content is : en
文档的语言检测
要检测给定文档的语言,必须使用parse()方法对其进行解析。 parse()方法解析内容并将其存储在处理程序对象中,该对象作为参数之一传递给它。 将处理程序对象的String格式传递给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 xnip
如果你执行上面的程序,它会给你以下输出 -
Language name :en
与Tika jar一起,Tika提供了图形用户界面应用程序(GUI)和命令行界面(CLI)应用程序。 您可以像其他Java应用程序一样从命令提示符执行Tika应用程序。