6

我正在尝试使用一个名为langdetecthosts 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位于内部的 whichmyapp.jar提供了它在运行时工作所需的 thelangdetect.jarjsonic.jar依赖项。langdetect但是我很困惑我需要传递什么DetectFactory.loadProfile才能工作:

  • langdetectJAR 随profiles目录一起提供,但您需要从 JAR 内部对其进行初始化。那么我是复制profiles目录并将其放入我的 JAR 中(就像我上面规定的那样),还是有办法将它保留在里面langdetect.jar但从我的代码中访问它?

在此先感谢您的帮助!

编辑:我认为这里的问题是这个目录langdetect 附带profiles的,但是希望你从你的 JAR 中初始化它。API 可能会受益于稍作更改以仅考虑profiles其自己的配置,然后提供方法,例如DetectFactory.loadProfiles().except("fr")在您不希望它初始化法语等的情况下。但这仍然不能解决我的问题!

4

5 回答 5

7

我也有同样的问题。您可以使用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);
于 2013-03-11T05:51:42.427 回答
4

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

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 请求 :)

于 2014-06-25T07:12:42.107 回答
3

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

于 2012-08-17T14:27:30.170 回答
2

Mark Butler 提供的解决方案仍然有效并解决了我的问题,但是由于 jar 内容发生了变化,需要更新 dirname。Deepak 已经报告了这个问题,但我没有足够的声誉在评论中回复。这是您需要的两个声明。

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

String dirname = "profiles/shorttext/";

为了加载长配置文件:

String dirname = "profiles/longtext/";
于 2020-03-24T09:45:10.930 回答
1

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

 String workingDir = System.getProperty("user.dir");
 DetectorFactory.loadProfile(workingDir+"/profiles/");
于 2015-05-20T07:35:23.187 回答