2011-11-13 1 views
1

Python 시퀀스에서 TokenStream을 빌드하려고합니다. 그냥 재미를 위해 나는 ...에 의해PythonTokenStream을 사용하는 PyLucene 사용자 정의 TokenStream

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

을 "MyTokenStream"를 만들려고

pylucene.Field("MyField", MyTokenStream) 

에 직접 내 자신의 토큰을 통과 할 수 있도록하려면 그러나 불행하게도 "TermAttribute"에 대한 래퍼 아무튼 존재하지 않거나 그 문제에 대해 다른 Attribute 클래스를 사용하므로 호출시 NotImplemented 오류가 발생합니다.

이것은 예외를 발생시키지 않지만 용어를 설정하는지 확실하지 않습니다.

PythonTokenStream(terms) 

답변

2

파이썬 * 클래스는 서브 클래 싱을 통해 동작을 사용자 정의하도록 설계되었습니다. TokenStream의 경우는, incrementToken 메소드를 오버라이드 (override) 할 필요가 있습니다.

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입니다.

+0

귀하의 답변에 감사드립니다! –

관련 문제