1

PythonシーケンスからTokenStreamを構築しようとしています。楽しみのために、自分のトークンを直接に渡すことができるようにしたいと思います

pylucene.Field("MyField", MyTokenStream)

「MyTokenStream」を作ってみました...

terms = ['pant', 'on', 'ground', 'look', 'like', 'fool']
stream = pylucene.PythonTokenStream()
for t in terms:
  stream.addAttribute(pylucene.TermAttribute(t))

しかし、残念ながら、「TermAttribute」のラッパーは存在しません。さらに言えば、luceneの他のAttributeクラスは存在しないため、それらを呼び出すとNotImplementedエラーが発生します。

これは例外を発生させません-しかし、それが条件を設定しているのかどうかはわかりません。

PythonTokenStream(terms)
4

1 に答える 1

3

Python *クラスは、サブクラス化によって動作をカスタマイズするように設計されています。TokenStreamの場合、incrementTokenメソッドをオーバーライドする必要があります。

class MyTokenStream(lucene.PythonTokenStream):
    def __init__(self, terms):
        lucene.PythonTokenStream.__init__(self)
        self.terms = iter(terms)
        self.addAttribute(lucene.TermAttribute.class_)
    def incrementToken(self):
        for term in self.terms:
            self.getAttribute(lucene.TermAttribute.class_).setTermBuffer(term)
            return True
        return False

mts = MyTokenStream(['pant', 'on', 'ground', 'look', 'like', 'fool'])
while mts.incrementToken():
    print mts

<MyTokenStream: (pant)>
<MyTokenStream: (on)>
<MyTokenStream: (ground)>
<MyTokenStream: (look)>
<MyTokenStream: (like)>
<MyTokenStream: (fool)>

addAttributeの結果も保存できるため、getAttributeが不要になります。私のlupyneプロジェクトにはその一例があります。

于 2011-11-28T17:51:15.890 に答える