在PyLucene中使用PythonAnalyzer将标记器与过滤器链接时出现问题

bhmjp9jg  于 2023-04-30  发布在  Lucene
关注(0)|答案(1)|浏览(314)

我是PyLucene的新手。我设法在我的Ubuntu上安装了它,并查看了如何实现自定义分析器的[示例代码][1]。我尝试通过添加一个NGramTokenFilter来修改它。但是我在打印出自定义分析器的结果时一直得到一个错误。如果我删除ngram过滤器,它会工作得很好。
基本上,我尝试做的是白色分割所有传入的文本,小写,转换为ascii代码,并做ngram。
代码如下:

class myAnalyzer(PythonAnalyzer):

def createComponents(self, fieldName):
    source = WhitespaceTokenizer()
    filter = LowerCaseFilter(source)
    filter = ASCIIFoldingFilter(filter)
    filter = NGramTokenFilter(filter,1,2)

    return self.TokenStreamComponents(source, filter)

def initReader(self, fieldName, reader):
    return reader

analyzer = myAnalyzer()
stream = analyzer.tokenStream("", StringReader("MARGIN wondêrfule"))
stream.reset()
tokens=[]
while stream.incrementToken():
    tokens.append(stream.getAttribute(CharTermAttribute.class_).toString())
print(tokens)

我不断得到的错误是:

InvalidArgsError: (<class 'org.apache.lucene.analysis.ngram.NGramTokenFilter'>, '__init__', (<ASCIIFoldingFilter: ASCIIFoldingFilter@192d74fb term=,bytes=[],startOffset=0,endOffset=0,positionIncrement=1,positionLength=1,type=word,termFrequency=1>, 2, 3))

我做错了什么?

5f0d552i

5f0d552i1#

查看JavaDoc for NGramTokenFilter,您必须使用以下内容:

NGramTokenFilter(filter, size)

对于固定的ngram大小;或者这个:

NGramTokenFilter(filter, min, max, boolean)

对于ngram大小的范围,preserveOriginal为布尔值,确定:
当它短于minGram或大于maxGram时是否保留原始项
你有的不是这两个。
(Side注意:我不确定1号的ngram是否有很大的意义,但也许这正是您所需要的。)

更新

为了完整起见,这里是我的(有些修改)独立版本的代码的问题。最相关的部分是这一行:

result = NGramTokenFilter(filter, 1, 2, True)

该程序(使用PyLucene 9.4.1和Java 11):

import sys, lucene, unittest
from org.apache.pylucene.analysis import PythonAnalyzer
from org.apache.lucene.analysis import Analyzer
from java.io import StringReader
from org.apache.lucene.analysis.core import WhitespaceTokenizer, LowerCaseFilter
from org.apache.lucene.analysis.miscellaneous import ASCIIFoldingFilter
from org.apache.lucene.analysis.ngram import NGramTokenFilter
from org.apache.lucene.analysis.tokenattributes import CharTermAttribute

class myAnalyzer(PythonAnalyzer):

    def __init__(self):
        PythonAnalyzer.__init__(self)

    def createComponents(self, fieldName):
        source = WhitespaceTokenizer()
        filter = LowerCaseFilter(source)
        filter = ASCIIFoldingFilter(filter)
        result = NGramTokenFilter(filter, 1, 2, True)

        return Analyzer.TokenStreamComponents(source, result)

    def initReader(self, fieldName, reader):
        return reader

lucene.initVM(vmargs=['-Djava.awt.headless=true'])
analyzer = myAnalyzer()
stream = analyzer.tokenStream("", StringReader("MARGIN wondêrfule"))
stream.reset()
tokens=[]
while stream.incrementToken():
    tokens.append(stream.getAttribute(CharTermAttribute.class_).toString())
print(tokens)

输出:

['m', 'ma', 'a', 'ar', 'r', 'rg', 'g', 'gi', 'i', 'in', 'n', 'margin', 'w', 'wo', 'o', 'on', 'n', 'nd', 'd', 'de', 'e','er', 'r', 'rf', 'f', 'fu', 'u', 'ul', 'l', 'le', 'e', 'wonderfule']

相关问题