📅  最后修改于: 2020-11-10 04:29:29             🧑  作者: Mango
为了基于在多语言网站中编写的语言对文档进行分类,需要一种语言检测工具。该工具应接受没有语言注释(元数据)的文档,并通过检测语言将该信息添加到文档的元数据中。
为了检测文档的语言,构建语言配置文件并将其与已知语言的配置文件进行比较。这些已知语言的文本集称为语料库。
语料库是一种书面语言文本的集合,它解释了在实际情况下如何使用该语言。
语料库是根据书籍,成绩单和其他数据资源(例如Internet)开发的。语料库的准确性取决于我们用来构架语料库的性能分析算法。
检测语言的常用方法是使用字典。给定文本中使用的单词将与词典中的单词匹配。
在语言使用的常用单词的列表将用于检测特定的语言,例如最简单有效的语料库,文章一,一个在英语。
使用单词集,可以构造一个简单的算法来查找两个语料库之间的距离,该距离等于匹配单词的频率之间的差异之和。
这样的算法存在以下问题-
由于匹配单词的频率非常少,因此该算法无法有效地处理句子少的小文本。它需要大量文本才能准确匹配。
对于具有复合语句的语言以及没有单词分隔符(如空格或标点符号)的语言,它无法检测到单词边界。
由于在使用单词集作为语料库方面存在这些困难,因此考虑了单个字符或字符组。
由于语言中常用的字符数是有限的,因此很容易应用基于单词频率而非字符的算法。在某些字符集以一种或几种语言使用的情况下,该算法效果更好。
该算法具有以下缺点-
很难区分具有相似字符频率的两种语言。
没有(借助语料库)多种语言使用的字符集来专门识别语言的特定工具或算法。
上述缺点导致了一种使用给定长度的字符序列进行语料库分析的新方法。此类字符序列通常称为N-gram,其中N表示字符序列的长度。
N-gram算法是一种有效的语言检测方法,尤其是在欧洲语言(例如英语)的情况下。
该算法适用于短文本。
尽管在具有更吸引人的功能的多语言文档中有先进的语言分析算法可以检测多种语言,但Tika使用3-grams算法,因为它适合大多数实际情况。
在由ISO 639-1标准化的184种标准语言中,Tika可以检测18种语言。 Tika中的语言检测是使用LanguageIdentifier类的getLanguage()方法完成的。此方法以字符串格式返回语言的代码名称。下面给出的是蒂卡检测到的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
如果执行上述程序,它将给出以下结果:
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 tutorialspoint
如果执行上述程序,它将为您提供以下输出-
Language name :en
除Tika jar之外,Tika还提供了图形用户界面应用程序(GUI)和命令行界面(CLI)应用程序。您也可以像其他Java应用程序一样从命令提示符处执行Tika应用程序。