我正在尝试对日文文本进行标记,并将词性属性提取为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)。此标记化过程在索引或搜索之外发生,因此不依赖于特定字段;它用于不同的目的。
谢谢!
答案 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;