用户输入文本的语言如何检测?

46

我正在处理一个应用程序,该应用程序接受不同语言的用户输入(目前固定为3种语言)。要求是用户可以输入文本,而不必通过 UI 中提供的复选框选择语言。

是否有现有的Java库来检测文本的语言?

我想要这样的东西:

text = "To be or not to be thats the question."

// returns ISO 639 Alpha-2 code
language = detect(text);

print(language);

结果:

EN

我不想知道如何自己创建语言检测器(我已经看过很多尝试这样做的博客)。这个库应该提供一个简单的API,而且完全离线可用。是否开源或商业闭源都无所谓。

我在SO上也发现了这些问题(还有更多):

如何检测语言
如何检测文本的语言?


1
请阅读此链接:https://dev59.com/pHM_5IYBdhLWcg3waiiJ - S.Lott
1
可靠地识别自然语言被认为是一个困难的问题。任何适合于您的代码空间和硬盘的解决方案都不太可能非常好。 - Carl Smotricz
@Carl:它不必完美无缺。我正在寻找一个“足够好”的已实现和维护的库。如果它在80%的情况下工作良好,那对我来说就足够了。 - ManBugra
1
可能是重复的问题:如何确定纯文本文件使用的编程语言? - Ken Bloom
1
这个问题也与以下问题密切相关:https://dev59.com/iHM_5IYBdhLWcg3wPAjT https://dev59.com/kHE85IYBdhLWcg3wejjn http://stackoverflow.com/questions/2161290/language-detection-in-python-closed http://stackoverflow.com/questions/2024934/is-there-a-python-library-class-that-can-take-a-piece-of-text-and-determine-the-l https://dev59.com/kUXRa4cB1Zd3GeqPtqt0 - Ken Bloom
显示剩余2条评论
7个回答

33
这个 Java语言检测库 可以为53种语言提供超过99%的准确度。
另外,还有 Apache Tika,一个内容分析库,不仅提供语言检测功能,还有更多其他功能。

21

6
谷歌提供了一个API可以帮助你完成这个任务。昨天我刚刚偶然发现,但是我没有保存链接,但如果你谷歌一下,你应该能够找到它。
这个API似乎是他们翻译API的一部分,可以将文本翻译成你想要的任何语言。还有另一个调用只是为了猜测输入语言。
谷歌是机器翻译领域的世界领袖之一;他们基于极大的文本库(大部分是互联网)和通常通过具有巨大样本空间的统计方法“正确地”进行处理。
编辑:这里是链接:http://code.google.com/apis/ajaxlanguage/ 编辑2:如果您坚持“离线”:一个得到很多赞的答案是建议使用Guess-Language。它是一个C++库,可以处理大约60种语言。

3
只有当你手头有谷歌数据存储设施的备份副本时才行 ;) - Carl Smotricz
@potatopeelings:我刚才在Google上查到了同样的事情。我会更新我的答案。谢谢! - Carl Smotricz
@potatopeelings:我必须承认我的母语不是英语,但当我提到“离线”时,我指的是它应该在没有任何网络连接(=没有互联网)的情况下工作。 - ManBugra
1
Guess-Language 是 Python 编写的,因此 Jython 应该能够从 Java 中运行它。 - Denis Tulskiy
@ManBugra - 对不起,是我的错。我可能是离线阅读了但是没有注册。顺便说一下,我认为你的用法是正确的。 - potatopeelings
显示剩余2条评论

2
一个备选方案是JLangDetect,但它不是非常健壮,并且语言库有限。好的一点是它是Apache许可证,如果符合您的要求,可以使用它。我猜测,您是否在单跳和双跳事件之间释放空格键?
在0.4版本中,它非常稳健。我在自己的许多项目中都使用了它,从未遇到过任何重大问题。此外,就速度而言,它与非常专业的语言检测器(例如仅少数语言)相当。

现在已经发布了0.3版本,它甚至可以检测保加利亚语。 - nyxz
抱歉,版本0.4已经可用。 - nyxz

1

检测语言API还提供Java客户端

示例:

List<Result> results = DetectLanguage.detect("Hello world");

Result result = results.get(0);

System.out.println("Language: " + result.language);
System.out.println("Is reliable: " + result.reliable);
System.out.println("Confidence: " + result.confidence);

该方法需要互联网连接,在使用应用程序之前必须考虑这一点。 - Mateus Viccari

0

0
Just a working code from already available solution from cybozu labs:

package com.et.generate;

import java.util.ArrayList;
import com.cybozu.labs.langdetect.Detector;
import com.cybozu.labs.langdetect.DetectorFactory;
import com.cybozu.labs.langdetect.LangDetectException;
import com.cybozu.labs.langdetect.Language;

public class LanguageCodeDetection {

    public void init(String profileDirectory) throws LangDetectException {
        DetectorFactory.loadProfile(profileDirectory);
    }
    public String detect(String text) throws LangDetectException {
        Detector detector = DetectorFactory.create();
        detector.append(text);
        return detector.detect();
    }
    public ArrayList<Language> detectLangs(String text) throws LangDetectException {
        Detector detector = DetectorFactory.create();
        detector.append(text);
        return detector.getProbabilities();
    }
    public static void main(String args[]) {
        try {
            LanguageCodeDetection ld = new  LanguageCodeDetection();

            String profileDirectory = "C:/profiles/";
            ld.init(profileDirectory);
            String text = "Кремль россий";
            System.out.println(ld.detectLangs(text));
            System.out.println(ld.detect(text));
        } catch (LangDetectException e) {
            e.printStackTrace();
        }
    }

}

Output:
[ru:0.9999983255911719]
ru

可以从以下链接下载配置文件: https://language-detection.googlecode.com/files/langdetect-09-13-2011.zip


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接