Я использую пакет whoosh для полнотекстового нечеткого сопоставления.
Мой текущий код выглядит следующим образом:
from whoosh.index import create_in
from whoosh.fields import *
from whoosh.query import FuzzyTerm
class MyFuzzyTerm(FuzzyTerm):
def __init__(self, fieldname, text, boost=1.0, maxdist=2, prefixlength=1, constantscore=True):
super(MyFuzzyTerm, self).__init__(fieldname, text, boost, maxdist, prefixlength, constantscore)
if not os.path.exists("indexdir"):
os.mkdir("indexdir")
path = u"MMM2.txt"
content = open('MMM2.txt', 'r').read()
schema = Schema(name=TEXT(stored=True), content=TEXT)
ix = create_in("indexdir", schema)
writer = ix.writer()
writer.add_document(name=path, content= content)
writer.commit()
from whoosh.qparser import QueryParser, FuzzyTermPlugin, PhrasePlugin, SequencePlugin
with ix.searcher() as searcher:
parser = QueryParser(u"content", ix.schema,termclass = MyFuzzyTerm)
parser.add_plugin(FuzzyTermPlugin())
parser.remove_plugin_class(PhrasePlugin)
parser.add_plugin(SequencePlugin())
str = u"Tennessee Riverkeeper Inc"
query = parser.parse(str)
# query = parser.parse(u"\"Tennessee Riverkeeper Inc\"~")
results = searcher.search(query)
print ("nb of results =", len(results),results, type(results))
for r in results:
print (r)
В документе MMM2.txt он содержит следующий текст:"Теннесси Река Хранитель АА Inc".В идеале, я хочу, чтобы программа возвращала 0, так как я хочу ограничить расстояние между словами в моем термине в пределах 1. Тем не менее, она по-прежнему возвращает:
nb of results = 1 <Top 1 Results for And([MyFuzzyTerm('content', 'tennessee', boost=1.000000, maxdist=2, prefixlength=1), MyFuzzyTerm('content', 'riverkeeper', boost=1.000000, maxdist=2, prefixlength=1), MyFuzzyTerm('content', 'inc', boost=1.000000, maxdist=2, prefixlength=1)]) runtime=0.009658594451408662> <class 'whoosh.searching.Results'>
<Hit {'name': 'MMM2.txt'}>
Однако, если я заменю:
query = parser.parse(str)
с:
query = parser.parse(u"\"Tennessee Riverkeeper Inc\"~")
Это сработало так, как я хотел вернуть несоответствующие результаты.Я думаю, это как-то связано с "~".Но я не могу добавить его, когда заменяю строку именем переменной.Поскольку мне нужно сопоставить так много строк, я не могу набрать их одну за другой.Я могу хранить их только в переменных каждый раз в цикле.Есть ли способ решить эту проблему?
Большое спасибо за вашу помощь заранее!