#python #lucene #pylucene
#python #lucene #pylucene
Вопрос:
Я пытаюсь создать токенстрим из последовательности 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:
Классы 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 есть пример этого.