我试图将 Apache Tika LanguageIdentifier 限制为一系列语言。当我运行下面的代码时,它只检测到文本为“de”,因此是德语。我想这样做的原因是为了让 LanguageIdentifier 由于语言限制而表现得更好。清理标准配置文件后,我只将我想要的配置文件添加到 map 中,并使用此 map 初始化 LanguageIdentifier。
String[] languages = {"de", "en", "fr", "nl", "es"};
Map<String, LanguageProfile> languageMaps = new HashMap <String, LanguageProfile>();
LanguageIdentifier.clearProfiles();
for (String language : languages) {
LanguageProfile profile = new LanguageProfile();
languageMaps.put(language, profile);
}
LanguageIdentifier.initProfiles(languageMaps);
String docText = "Hello";
LanguageIdentifier identifier = new LanguageIdentifier(docText);
System.out.println(identifier.getLanguage());
当我运行以下代码时
LanguageIdentifierLanguageIdentifier.getSupportedLanguages())
它从数组中返回语言,所以我真的不知道出了什么问题。
最佳答案
当您创建新的LanguageProfile
时,您必须再次自行添加定义语言的所有ngram信息。通过此设置,您只需创建空容器,然后始终选择数组中的第一个,因为它是第一个,并且您没有任何其他信息。
参见API documentation of LanguageProfile
只需从以下位置获取 nedded 语言 ngram 文件 http://svn.apache.org/repos/asf/tika/trunk/tika-core/src/main/resources/org/apache/tika/language/
使用以下命令初始化它(假设 ngram 文件位于类路径根目录中):
String[] languages = { "de", "en" };
Map<String, LanguageProfile> languageMaps = new HashMap<String, LanguageProfile>();
LanguageIdentifier.clearProfiles();
for (String language : languages) {
LanguageProfile profile = new LanguageProfile();
InputStream stream;
try {
stream = new FileInputStream(new File("./" + language + ".ngp"));
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, UTF_8));
String line = reader.readLine();
while (line != null) {
if (line.length() > 0 && !line.startsWith("#")) {
int space = line.indexOf(' ');
profile.add(line.substring(0, space), Long.parseLong(line.substring(space + 1)));
}
line = reader.readLine();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
languageMaps.put(language, profile);
}
LanguageIdentifier.initProfiles(languageMaps);
关于java - 将 Tika LanguageIdentifier 限制为仅特定语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34032488/