使用PythonTokenStream的PyLucene Custom TokenStream

时间:2011-11-13 20:36:54

标签: python lucene pylucene

我正在尝试从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)

1 个答案:

答案 0 :(得分:2)

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项目有example个。