使用langdetect进行Java语言检测 - 如何加载配置文件?

时间:2012-08-17 14:21:51

标签: java jar classpath language-detection

我正在尝试使用名为langdetect托管here的Java库。它使用起来不容易:

Detector detector;
String langDetected = "";
try {
    String path = "C:/Users/myUser/Desktop/jars/langdetect/profiles";
    DetectorFactory.loadProfile(path);
    detector = DetectorFactory.create();
    detector.append(text);
    langDetected = detector.detect();
} 
catch (LangDetectException e) {
    throw e;
}

return langDetected;
关于DetectFactory.loadProfile方法的

除外。当我传递一个绝对文件路径时,这个库工作得很好,但最终我想我需要将我的代码和langdetect的伴随profiles目录打包在同一个JAR文件中:

myapp.jar/
    META-INF/
    langdetect/
        profiles/
            af
            bn
            en
            ...etc.
    com/
        me/
            myorg/
                LangDetectAdaptor --> is what actually uses the code above

我将确保位于LangDetectAdaptor内的myapp.jar提供了langdetect.jar工作所需的jsonic.jarlangdetect依赖项在运行时。但是我很困惑我需要传递给DetectFactory.loadProfile以便工作:

  • langdetect JAR附带profiles目录,但您需要从JAR内部初始化它。那么我是否要复制profiles目录并将其放在我的JAR中(就像我上面所说的那样),或者有没有办法将它保存在langdetect.jar里面但是从我的代码中访问它?

提前感谢您的帮助!

修改:我认为这里的问题是langdetect 发送这个profiles目录,但是后来要求你从里面初始化它你的JAR。 API可能会受益于稍微更改以仅考虑profiles自己的配置,然后在您不希望它初始化法语等情况下提供DetectFactory.loadProfiles().except("fr")等方法。但这仍然无法解决我的问题!

5 个答案:

答案 0 :(得分:5)

我有同样的问题。您可以使用JarUrlConnectionJarEntry从LangDetect jar加载配置文件。请注意,在此示例中,我使用的是Java 7资源管理。

    String dirname = "profiles/";
    Enumeration<URL> en = Detector.class.getClassLoader().getResources(
            dirname);
    List<String> profiles = new ArrayList<>();
    if (en.hasMoreElements()) {
        URL url = en.nextElement();
        JarURLConnection urlcon = (JarURLConnection) url.openConnection();
        try (JarFile jar = urlcon.getJarFile();) {
            Enumeration<JarEntry> entries = jar.entries();
            while (entries.hasMoreElements()) {
                String entry = entries.nextElement().getName();
                if (entry.startsWith(dirname)) {
                    try (InputStream in = Detector.class.getClassLoader()
                            .getResourceAsStream(entry);) {
                        profiles.add(IOUtils.toString(in));
                    }
                }
            }
        }
    }

    DetectorFactory.loadProfile(profiles);
    Detector detector = DetectorFactory.create();
    detector.append(text);
    String langDetected = detector.detect();
    System.out.println(langDetected);

答案 1 :(得分:4)

由于没有可用的maven-support,并且加载配置文件的机制并不完美(因为你需要定义文件而不是资源),我创建了一个解决这个问题的分支:

https://github.com/galan/language-detector

我邮寄了原作者,所以他可以分叉/维护这些变化,但没有运气 - 似乎该项目被放弃了。

以下是如何使用它的示例(必要时可以编写自己的配置文件):

DetectorFactory.loadProfile(new DefaultProfile()); // SmProfile is also available
Detector detector = DetectorFactory.create();
detector.append(input);
String result = detector.detect();
// maybe work with detector.getProbabilities()

我不喜欢DetectorFactory使用的静态方法,但我不会重写整个项目,你必须创建自己的fork / pull请求:)

答案 2 :(得分:3)

看起来该库只接受文件。您可以更改代码并尝试向上游提交更改。或者将您的资源写入临时文件并让它加载它。

答案 3 :(得分:2)

Mark Butler提供的解决方案仍然有效并解决了我的问题,但是由于jar内容已更改,因此需要更新目录名。 迪帕克(Deepak)已报告了该问题,但我没有足够的声誉来回应评论。这是您需要的两个声明。

为了加载简短的配置文件:

String dirname = "profiles/shorttext/";

为了加载长配置文件:

String dirname = "profiles/longtext/";

答案 4 :(得分:1)

为我设置工作目录解决了问题。

 String workingDir = System.getProperty("user.dir");
 DetectorFactory.loadProfile(workingDir+"/profiles/");