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