如何访问Lucene POS属性(日语Kuromoji分析器)

时间:2017-03-16 01:30:58

标签: lucene

我正在尝试对日文文本进行标记,并将词性属性提取为explained on the kuromoji website

Kuromoji / Lucene带有一个PartOfSpeechAttributeImpl属性实现,它应该提供POS数据,但是我无法提取它 - 我在pos.getPartOfSpeech()行上得到一个NullPointerException。 CharTermAttribute打印。我错过了什么,做错了什么?

    String content = "こんばんは 今日寒かったですね 今日、頂いたお菓子があまりにも美味しくて 上り羊羹 御利益ありそうな、ネーミング ぷるんぷるんの、上品な水羊羹です! そして、スイーツもう一品! 先日アップしたお友達の干し芋。";

    Analyzer analyzer = new JapaneseAnalyzer();
    TokenStream stream = analyzer.tokenStream("TEXT", content);

    Iterator<AttributeImpl> it = stream.getAttributeImplsIterator();
    while (it.hasNext()) {
        AttributeImpl attr = it.next();
        System.out.println(attr.getClass());
    }
    CharTermAttribute term = stream.addAttribute(CharTermAttribute.class);
    PartOfSpeechAttributeImpl pos = stream.getAttribute(PartOfSpeechAttributeImpl.class);

    stream.reset();
    while (stream.incrementToken()) {
        System.out.println("[" + term.toString() + "]: ");
        System.out.println(pos.getPartOfSpeech());
    }

第一个while循环实际上显示PartOfSpeechAttribute已添加到令牌流中。这是print stmt输出:

   class org.apache.lucene.analysis.tokenattributes.PackedTokenAttributeImpl
   class org.apache.lucene.analysis.ja.tokenattributes.BaseFormAttributeImpl
   class org.apache.lucene.analysis.ja.tokenattributes.PartOfSpeechAttributeImpl
   class org.apache.lucene.analysis.ja.tokenattributes.ReadingAttributeImpl
   class org.apache.lucene.analysis.ja.tokenattributes.InflectionAttributeImpl
   class org.apache.lucene.analysis.tokenattributes.KeywordAttributeImpl

我还遵循其他Stackoverflow帖子的建议,为partOfSpeechAttributeImpl添加addAttribute()而不是getAttribute()。但是这给了我一个IllegalArgumentException(虽然这个ArributeImpl实现了Lucene属性):

   java.lang.IllegalArgumentException: addAttribute() only accepts an interface that extends Attribute, but 
   org.apache.lucene.analysis.ja.tokenattributes.PartOfSpeechAttributeImpl does not fulfil this contract.
      at   org.apache.lucene.util.AttributeSource.addAttribute(AttributeSource.java:210)
      at ...

仅供参考:目前我们使用的是Lucene 6.0.0。索引和搜索在日语中工作正常,因为默认情况下在Lucene发行版中包含Kuromoji包(您只需要选择JapaneseAnalyzer)。此标记化过程在索引或搜索之外发生,因此不依赖于特定字段;它用于不同的目的。

谢谢!

1 个答案:

答案 0 :(得分:0)

PartOfSpeechAttributeImpl不正确。它应该是PartOfSpeechAttribute

    PartOfSpeechAttribute pattr = stream.addAttribute(PartOfSpeechAttribute.class);
    try {
        stream.reset();
        while (stream.incrementToken()) {
            cattr.toString();
            String pos[] = pattr.getPartOfSpeech().split("-");
            Token token = new Token(stream.getAttribute(CharTermAttribute.class).toString(), pos);
            result.add(token);
        }
        stream.close();
    } catch (IOException e) {
        return result;
    } finally {
        analyzer.close();
    }
    return result;