如何在 Hibernate 搜索中使用 Wordnet 同义词?
How to use Wordnet Synonyms with Hibernate Search?
我一直在努力弄清楚如何将 WordNet 同义词与我正在开发的使用 Hibernate Search 5.6.1 的搜索功能结合使用。一开始,我想到了使用Hibernate Search注解:
@TokenFilterDef(factory = SynonymFilterFactory.class, params = {@Parameter(name = "ignoreCase", value = "true"),
@Parameter(name = "expand", value = "true"),@Parameter(name = "synonyms", value = "synonymsfile") })
但是,这需要一个填充了同义词的实际文件。从 WordNet 我只能得到“.pl”文件。所以我尝试手动制作一个 SynonymAnalyzer class,它将从“.pl”文件中读取:
public class SynonymAnalyzer extends Analyzer {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
final Tokenizer source = new StandardTokenizer();
TokenStream result = new StandardFilter(source);
result = new LowerCaseFilter(result);
SynonymMap wordnetSynonyms = null;
try {
wordnetSynonyms = loadSynonyms();
} catch (IOException e) {
e.printStackTrace();
}
result = new SynonymFilter(result, wordnetSynonyms, false);
result = new StopFilter(result, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
return new TokenStreamComponents(source, result);
}
private SynonymMap loadSynonyms() throws IOException {
File file = new File("synonyms\wn_s.pl");
InputStream stream = new FileInputStream(file);
Reader reader = new InputStreamReader(stream);
SynonymMap.Builder parser = null;
parser = new WordnetSynonymParser(true, true, new StandardAnalyzer(CharArraySet.EMPTY_SET));
try {
((WordnetSynonymParser) parser).parse(reader);
} catch (ParseException e) {
e.printStackTrace();
}
return parser.build();
}
}
此方法的问题是我得到 java.lang.OutOfMemoryError,我假设这是因为同义词太多或其他原因?执行此操作的正确方法是什么,我在网上看到的所有地方都建议使用 WordNet,但我似乎找不到使用 Hibernate Search Annotations 的示例。感谢任何帮助,谢谢!
其实SynonymFilterFactory
支持wordnet格式。您只是在注释配置中缺少 "format" 参数;默认情况下,工厂使用 Solr 格式。
将您的注释更改为:
@TokenFilterDef(
factory = SynonymFilterFactory.class,
params = {
@Parameter(name = "ignoreCase", value = "true"),
@Parameter(name = "expand", value = "true"),
@Parameter(name = "synonyms", value = "synonymsfile"),
@Parameter(name = "format", value = "wordnet") // Add this
}
)
此外,请确保 "synonyms" 参数的值是类路径中文件的路径(例如 "com/acme/synonyms.pl",如果文件位于"resources" 目录的根目录)。
一般来说,当您对 Lucene filter/tokenizer 工厂的参数有疑问时,最好的办法是查看该工厂的源代码,或者查看 this page .
我一直在努力弄清楚如何将 WordNet 同义词与我正在开发的使用 Hibernate Search 5.6.1 的搜索功能结合使用。一开始,我想到了使用Hibernate Search注解:
@TokenFilterDef(factory = SynonymFilterFactory.class, params = {@Parameter(name = "ignoreCase", value = "true"),
@Parameter(name = "expand", value = "true"),@Parameter(name = "synonyms", value = "synonymsfile") })
但是,这需要一个填充了同义词的实际文件。从 WordNet 我只能得到“.pl”文件。所以我尝试手动制作一个 SynonymAnalyzer class,它将从“.pl”文件中读取:
public class SynonymAnalyzer extends Analyzer {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
final Tokenizer source = new StandardTokenizer();
TokenStream result = new StandardFilter(source);
result = new LowerCaseFilter(result);
SynonymMap wordnetSynonyms = null;
try {
wordnetSynonyms = loadSynonyms();
} catch (IOException e) {
e.printStackTrace();
}
result = new SynonymFilter(result, wordnetSynonyms, false);
result = new StopFilter(result, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
return new TokenStreamComponents(source, result);
}
private SynonymMap loadSynonyms() throws IOException {
File file = new File("synonyms\wn_s.pl");
InputStream stream = new FileInputStream(file);
Reader reader = new InputStreamReader(stream);
SynonymMap.Builder parser = null;
parser = new WordnetSynonymParser(true, true, new StandardAnalyzer(CharArraySet.EMPTY_SET));
try {
((WordnetSynonymParser) parser).parse(reader);
} catch (ParseException e) {
e.printStackTrace();
}
return parser.build();
}
}
此方法的问题是我得到 java.lang.OutOfMemoryError,我假设这是因为同义词太多或其他原因?执行此操作的正确方法是什么,我在网上看到的所有地方都建议使用 WordNet,但我似乎找不到使用 Hibernate Search Annotations 的示例。感谢任何帮助,谢谢!
其实SynonymFilterFactory
支持wordnet格式。您只是在注释配置中缺少 "format" 参数;默认情况下,工厂使用 Solr 格式。
将您的注释更改为:
@TokenFilterDef(
factory = SynonymFilterFactory.class,
params = {
@Parameter(name = "ignoreCase", value = "true"),
@Parameter(name = "expand", value = "true"),
@Parameter(name = "synonyms", value = "synonymsfile"),
@Parameter(name = "format", value = "wordnet") // Add this
}
)
此外,请确保 "synonyms" 参数的值是类路径中文件的路径(例如 "com/acme/synonyms.pl",如果文件位于"resources" 目录的根目录)。
一般来说,当您对 Lucene filter/tokenizer 工厂的参数有疑问时,最好的办法是查看该工厂的源代码,或者查看 this page .