我如何知道纯文本文件是用哪种语言编写的? [关闭]
java
nlp
5
0

假设我们有一个文本文件,内容为:“ Je suis un beau homme ...”

另一个带有:“我是一个勇敢的人”

第三个带有德语文本:“ Guten morgen。Wie geht的?”

我们如何编写一个告诉我们的函数:第一个文件中的文本很有可能是英语,第二个文件中有法语等?

欢迎链接到书籍/开箱即用的解决方案。我用Java编写,但是如果需要,我可以学习Python。

我的评论

  1. 我需要添加一条小评论。作为整体的一部分或由于错误,文本可能包含不同语言的短语。在经典文学中,我们有很多例子,因为贵族成员使用多种语言。因此,该概率可以更好地描述情况,因为文本的大多数部分都使用一种语言,而其他部分则可能使用另一种语言编写。
  2. Google API-Internet连接。我宁愿不使用远程功能/服务,因为我需要自己做或使用可下载的库。我想对该主题进行研究。
参考资料:
Stack Overflow
收藏
评论
共 8 个回答
高赞 时间 活跃

对于较大的文本副本,通常使用字母,有向图,甚至有向图的分布,并与要检测的语言的已知分布进行比较。

但是,单个句子很可能太短而无法产生任何有用的统计量度。然后,将单个单词与词典进行匹配可能会比较幸运。

收藏
评论

尝试使用Nutch的语言标识符 。使用n-gram语言配置文件进行训练,可用语言的配置文件与输入文本匹配。有趣的是,您可以根据需要添加更多语言。

收藏
评论

如果您对执行语言检测的机制感兴趣,请参考以下文章 (基于python),该文章使用(非常)幼稚的方法,但是特别是对机器学习 (尤其是机器学习 )的一个很好的介绍。大词)。

对于Java实现,其他消息者建议的JLangDetect和Nutch相当不错。还可以看一下LingpipeJTCLNGramJ


对于同一页面中有多种语言的问题,可以使用句子边界检测器将页面切成句子,然后尝试识别每个句子的语言。假设一个句子仅包含一种(主要)语言,那么使用上述任何一种实现方式,您仍应获得良好的结果。

注意:句子边界检测器(SBD)在理论上是特定于语言的(鸡-蛋问题,因为您需要另一个)。但是对于基于拉丁语的语言(英语,法语,德语等),它们主要使用句点(除了感叹号等)来进行句子定界,即使您使用为英语设计的SBD,也将获得可接受的结果。我写了一个基于规则的英语SBD,对法语文本效果很好。对于实现,请看一下OpenNLP

使用SBD的另一种选择是使用说10个令牌(用空格分隔)的滑动窗口来创建伪句子 (PS),并尝试识别语言改变的边界。这样做的缺点是,如果整个文档都有n个标记,则将对长度为10个标记的字符串执行大约n-10个分类操作。在另一种方法中,如果平均句子有10个标记,则您将执行大约n / 10个分类操作。如果文档中n = 1000个单词,您将比较990个操作与100个操作:数量级差。


如果您有简短的短语(少于20个字符),则根据我的经验,语言检测的准确性会很差。特别是在专有名词以及跨“巧克力”之类的语言使用相同名词的情况下。例如,“ New York”是法语单词中的英语单词还是法语单词?

收藏
评论

尽管比您正在寻找的解决方案更复杂,但是您可以使用Vowpal Wabbit并使用来自不同语言的句子对其进行训练。

从理论上讲,您可以为文档中的每个句子取回一种语言。

http://hunch.net/~vw/

(不要被项目字幕中的“在线”所迷惑-只是为了学习而数学,而不必将整个学习材料存储在内存中)

收藏
评论
收藏
评论

NGramJ似乎是最新的:

http://ngramj.sourceforge.net/

它还具有面向字符和面向字节的配置文件,因此它也应该能够识别字符集。

对于使用多种语言的文档,您需要标识字符集( ICU4J具有一个可以执行此操作的CharsetDetector ),然后将文本分割为多个行换行符或段落(如果标记了文本)等合理的内容。

收藏
评论

查找马尔可夫链。

基本上,您需要统计上要识别的语言样本。当您获得一个新文件时,请查看特定音节或音素的频率,并比较预先计算的样本。选择最接近的一个。

收藏
评论

有一个名为JLangDetect的软件包,它似乎完全可以满足您的要求:

langof("un texte en français") = fr : OK
langof("a text in english") = en : OK
langof("un texto en español") = es : OK
langof("un texte un peu plus long en français") = fr : OK
langof("a text a little longer in english") = en : OK
langof("a little longer text in english") = en : OK
langof("un texto un poco mas largo en español") = es : OK
langof("J'aime les bisounours !") = fr : OK
langof("Bienvenue à Montmartre !") = fr : OK
langof("Welcome to London !") = en : OK
// ...

编辑:正如Kevin所指出的那样,在Nutch项目中 ,由org.apache.nutch.analysis.lang包提供了类似的功能。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号