PyLucene自定义TokenStream使用PythonTokenStream

1 投票
1 回答
592 浏览
提问于 2025-04-17 06:14

我正在尝试从一个Python序列构建一个TokenStream。为了好玩,我想直接传递我自己的Tokens到

pylucene.Field("MyField", MyTokenStream)

我试着通过...

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

但不幸的是,"TermAttribute"没有现成的包装器,其他的Attribute类在lucene中也是如此,所以当我调用它们时会出现一个NotImplemented错误。

这并不会引发异常,但我不确定它是否真的在设置这些术语。

PythonTokenStream(terms)

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项目里有一个例子可以看看。

撰写回答