2011-07-15 47 views
10

Tôi đã xây dựng một cơ sở dữ liệu lớn của các ngân hàng trong MongoDB. Tôi có thể dễ dàng lấy thông tin này và tạo các chỉ mục với nó trong whoosh. Ví dụ: tôi muốn có thể khớp tên ngân hàng 'Eagle Bank & Trust Co Missouri' và 'Eagle Bank and Trust Company of Missouri'. Các mã sau đây làm việc với đơn giản mờ như vậy, nhưng không thể đạt được một trận đấu trên trên:Chuỗi mờ Tìm kiếm bằng Whoosh bằng Python

from whoosh.index import create_in 
from whoosh.fields import * 

schema = Schema(name=TEXT(stored=True)) 
ix = create_in("indexdir", schema) 
writer = ix.writer() 

test_items = [u"Eagle Bank and Trust Company of Missouri"] 

writer.add_document(name=item) 
writer.commit() 

from whoosh.qparser import QueryParser 
from whoosh.query import FuzzyTerm 

with ix.searcher() as s: 
    qp = QueryParser("name", schema=ix.schema, termclass=FuzzyTerm) 
    q = qp.parse(u"Eagle Bank & Trust Co of Missouri") 
    results = s.search(q) 
    print results 

mang lại cho tôi:

<Top 0 Results for And([FuzzyTerm('name', u'eagle', boost=1.000000, minsimilarity=0.500000, prefixlength=1), FuzzyTerm('name', u'bank', boost=1.000000, minsimilarity=0.500000, prefixlength=1), FuzzyTerm('name', u'trust', boost=1.000000, minsimilarity=0.500000, prefixlength=1), FuzzyTerm('name', u'co', boost=1.000000, minsimilarity=0.500000, prefixlength=1), FuzzyTerm('name', u'missouri', boost=1.000000, minsimilarity=0.500000, prefixlength=1)]) runtime=0.00166392326355> 

Có thể đạt được những gì tôi muốn với bất ngờ tới thăm? Nếu tôi không có giải pháp dựa trên python nào khác?

Trả lời

7

Bạn có thể trận đấu Co với Company sử dụng Fuzzy Search in bất ngờ tới thăm nhưng Bạn không nên làm vì sự khác biệt giữa CoCompany là lớn. Co tương tự như CompanyBe tương tự như Beastny đến Company, Bạn có thể tưởng tượng mức độ ảnh hưởng của kết quả tìm kiếm và mức độ xấu.

Tuy nhiên, nếu bạn muốn kết hợp Compan hoặc compani hoặc Companee-Company bạn có thể làm điều đó bằng cách sử dụng một lớp cá nhân của FuzzyTerm với mặc định maxdist bằng 2 trở lên:

maxdist - Tối đa chỉnh sửa khoảng cách từ văn bản đã cho.

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) 

Sau đó:

qp = QueryParser("name", schema=ix.schema, termclass=MyFuzzyTerm) 

Bạn có thể phù hợp với CoCompany bằng cách thiết lập maxdist-5 nhưng điều này như tôi đã nói cho kết quả tìm kiếm xấu. Tôi khuyên bạn nên giữ maxdist từ 1 đến 3.

Nếu bạn đang tìm kiếm phù hợp với một biến thể ngôn ngữ, bạn nên sử dụng whoosh.query.Variations.

Lưu ý: phiên bản cũ hơn Whoosh có minsimilarity thay vì maxdist.

3

Để tham khảo trong tương lai, và phải có một cách tốt hơn để làm điều này bằng cách nào đó, nhưng đây là của tôi bắn.

# -*- coding: utf-8 -*- 
import whoosh 
from whoosh.index import create_in 
from whoosh.fields import * 
from whoosh.query import * 
from whoosh.qparser import QueryParser 

schema = Schema(name=TEXT(stored=True)) 
idx = create_in("C:\\idx_name\\", schema, "idx_name") 

writer = idx.writer() 

writer.add_document(name=u"This is craaazy shit") 
writer.add_document(name=u"This is craaazy beer") 
writer.add_document(name=u"Raphaël rocks") 
writer.add_document(name=u"Rockies are mountains") 

writer.commit() 

s = idx.searcher() 
print "Fields: ", list(s.lexicon("name")) 
qp = QueryParser("name", schema=schema, termclass=FuzzyTerm) 

for i in range(1,40): 
    res = s.search(FuzzyTerm("name", "just rocks", maxdist=i, prefixlength=0)) 
    if len(res) > 0: 
     for r in res: 
      print "Potential match (%s): [ %s ]" % (i, r["name"]) 
     break 
    else: 
     print "Pass: %s" % i 

s.close() 
-2

Bạn có thể sử dụng chức năng này dưới đây để tìm kiếm lông tơ một tập hợp các lời chống lại một cụm từ:

def FuzzySearch(text, phrase): 
    """Check if word in phrase is contained in text""" 
    phrases = phrase.split(" ") 

    for x in range(len(phrases)): 
     if phrases[x] in text: 
      print("Match! Found " + phrases[x] + " in text") 
     else: 
      continue 
Các vấn đề liên quan