【问题标题】:How to use Wordnet Synonyms with Hibernate Search?如何在 Hibernate Search 中使用 Wordnet 同义词?
【发布时间】:2018-03-22 17:55:13
【问题描述】:

我一直试图弄清楚如何将 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”文件。所以我尝试手动创建一个从“.pl”文件中读取的 SynonymAnalyzer 类:

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 的示例。任何帮助表示赞赏,谢谢!

【问题讨论】:

    标签: java hibernate solr lucene hibernate-search


    【解决方案1】:

    wordnet格式其实是SynonymFilterFactory支持的。您只是在注释配置中缺少“格式”参数;默认情况下,工厂使用 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”,或者如果文件位于“资源”目录的根目录)。

    一般来说,当您对 Lucene 过滤器/标记器工厂的参数有疑问时,最好的办法是查看该工厂的源代码,或者查看 this page

    【讨论】:

    • 谢谢!正是我需要的。
    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多