我正在尝试使用名为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.jar
和langdetect
依赖项在运行时。但是我很困惑我需要传递给DetectFactory.loadProfile
以便工作:
langdetect
JAR附带profiles
目录,但您需要从JAR内部初始化它。那么我是否要复制profiles
目录并将其放在我的JAR中(就像我上面所说的那样),或者有没有办法将它保存在langdetect.jar
里面但是从我的代码中访问它?提前感谢您的帮助!
修改:我认为这里的问题是langdetect
发送这个profiles
目录,但是后来要求你从里面初始化它你的JAR。 API可能会受益于稍微更改以仅考虑profiles
自己的配置,然后在您不希望它初始化法语等情况下提供DetectFactory.loadProfiles().except("fr")
等方法。但这仍然无法解决我的问题!
答案 0 :(得分:5)
我有同样的问题。您可以使用JarUrlConnection和JarEntry从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/");