PyLucene Custom TokenStream с использованием PythonTokenStream - PullRequest
1 голос
/ 14 ноября 2011

Я пытаюсь построить TokenStream из последовательности Python. Просто для удовольствия я хочу иметь возможность передавать свои токены напрямую

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» не существует, или, к тому же, любые другие Attribute классы в lucene, поэтому я получаю сообщение NotImplemented при их вызове.

Это не вызывает исключений, но я не уверен, что он даже устанавливает условия.

PythonTokenStream(terms)

1 Ответ

2 голосов
/ 28 ноября 2011

Классы 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 содержит пример этого.

...