首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PythonTokenStream的PyLucene自定义TokenStream

使用PythonTokenStream的PyLucene自定义TokenStream
EN

Stack Overflow用户
提问于 2011-11-14 04:36:54
回答 1查看 551关注 0票数 1

我正在尝试从Python序列构建一个TokenStream。只是为了好玩,我希望能够将我自己的令牌直接传递给

代码语言:javascript
复制
pylucene.Field("MyField", MyTokenStream)

我试着把"MyTokenStream“写成...

代码语言:javascript
复制
terms = ['pant', 'on', 'ground', 'look', 'like', 'fool']
stream = pylucene.PythonTokenStream()
for t in terms:
  stream.addAttribute(pylucene.TermAttribute(t))

但不幸的是,"TermAttribute“的包装器并不存在,也不存在lucene中的任何其他Attribute类,因此在调用它们时,我会得到一个NotImplemented错误。

这不会引发异常--但我不确定它是否设置了条件。

代码语言:javascript
复制
PythonTokenStream(terms)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-29 01:51:16

Python*类旨在通过子类化来自定义行为。在使用TokenStream的情况下,需要覆盖incrementToken方法。

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8114545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档