标签: fuzzy-search

用Python中的Whoosh搜索模糊字符串

我在MongoDB中建立了一个庞大的银行数据库.我可以轻松地获取此信息并在其中创建索引.例如,我希望能够匹配银行名称'Eagle Bank&Trust Co of Missouri'和'Eagle Bank and Trust Company of Missouri'.以下代码适用于简单模糊这样,但无法实现上述匹配:

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
Run Code Online (Sandbox Code Playgroud)

给我:

<Top 0 Results for And([FuzzyTerm('name', u'eagle', boost=1.000000, minsimilarity=0.500000, …
Run Code Online (Sandbox Code Playgroud)

python information-retrieval fuzzy-search whoosh

11
推荐指数
1
解决办法
3963
查看次数

Lucene模糊搜索短语(FuzzyQuery + SpanQuery)

我正在寻找一种编码lucene模糊查询的方法,该查询搜索与精确短语相关的所有文档.如果我搜索"mosa employee appreciata",将返回包含"大多数员工欣赏"的文档作为结果.

我试着用:

FuzzyQeury = new FuzzyQuery(new Term("contents","mosa employee appreicata"))
Run Code Online (Sandbox Code Playgroud)

不幸的是,它凭经验不起作用.FuzzyQuery采用编辑器距离,理论上,"mosa员工欣赏"应与"大多数员工欣赏"相匹配,提供适当的距离.这看起来有点奇怪.

有线索吗?谢谢.

lucene fuzzy-search

11
推荐指数
2
解决办法
8869
查看次数

SQL模糊匹配

希望我不要重复这个问题.我在这里做了一些搜索和google,然后发布在这里.

我正在运行带有SQL Server 2008R2并启用了全文的电子商店.

我的要求,

  1. 有一个产品表,其中包含该产品适用的产品名称,OEM代码,型号.所有都是正文.
  2. 我创建了一个名为TextSearch的新列.它具有此产品适用的产品名称,OEM代码和型号的连接值.这些值以逗号分隔.
  3. 当客户输入关键字时,我们会在TextSearch列上运行搜索以匹配产品.请参阅以下匹配逻辑.

我正在使用混合全文和普通的搜索.这提供了更相关的结果.返回执行临时表和区别的所有查询.

匹配逻辑,

  1. 运行以下SQL以使用全文获取相关产品.但@Keywords将被预处理.说'CLC 2200'将更改为'CLC*AND 2200*'

    SELECT Id FROM dbo.Product WHERE CONTAINS(TextSearch,@ Keywords)

  2. 另一个查询将使用普通的运行方式运行.所以'CLC 2200'将被预处理为'TextSearch like%clc%AND TextSearch like%2200%'.这仅仅是因为全文搜索不会在关键字之前搜索模式.例如,它不会返回'pclc 2200'.

    SELECT Id FROM dbo.Product WHERE TextSearch喜欢'%clc%'和TextSearch喜欢'%2200%'

  3. 如果步骤1和2未返回任何记录,则将执行以下搜索.价值135由我调整为返回更多相关记录.

    SELECT p.id FROM dbo.Product AS p INNER JOIN FREETEXTTABLE(product,TextSearch,@ Keywords)AS r ON p.Id = r.[KEY] WHERE r.RANK> 135

以上所有组合在合理的速度下工作正常,并返回关键字的相关产品.

但是,当我找不到任何产品时,我正在寻求进一步改进.

假如客户寻找'CLC 2200npk'并且该产品不在那里,我需要在'CLC 2200'附近展示.

到目前为止,我尝试使用Soundex()函数.购买TextSearch列中每个单词的计算soundex值,并与关键字的soudex值进行比较.但是这会返回太多记录并且也会减慢.

例如,'CLC 2200npk'将返回'CLC 1100'等产品.但这不是一个好结果.因为它不接近CLC 2200npk

还有另外一个好这里.但这使用CLR功能.但我无法在服务器上安装CLR功能.

所以我的逻辑需要,

如果'CLC 2200npk'未找到,如果'CLC 2200'未找到则显示'CLC 2200'附近,接下来显示'CLC 1100'

问题

  1. 是否有可能像建议的那样匹配?
  2. 如果我需要进行拼写纠正和搜索,那会是什么好方法?我们所有的产品清单都是英文的.
  3. 是否有任何UDF或SP来匹配我的建议之类的文本?

谢谢.

sql-server full-text-search fuzzy-search sql-server-2008

11
推荐指数
1
解决办法
4万
查看次数

Lucene查询:bla~*(匹配以模糊的东西开头的单词),怎么样?

在Lucene查询语法中,我想在有效查询中组合*和〜,类似于:bla~*//无效查询

含义:请匹配以"bla"开头的单词或类似"bla"的单词.

更新:我现在所做的,适用于小输入,使用以下(SOLR模式的片段):

<fieldtype name="text_ngrams" class="solr.TextField">
  <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
  </analyzer>
  <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
Run Code Online (Sandbox Code Playgroud)

如果您不使用SOLR,则执行以下操作.

Indextime:通过创建包含my(短)输入的所有前缀的字段来索引数据.

搜索时间:仅使用〜运算符,因为前缀明确存在于索引中.

lucene fuzzy-search wildcard

10
推荐指数
2
解决办法
1万
查看次数

Oracle中的模糊文本搜索

我有一个大型Oracle数据库表,其中包含整个国家/地区的街道名称,其中包含600000多行.在我的应用程序中,我将地址字符串作为输入,并想检查此地址字符串的特定子字符串是否与表中的一个或多个街道名称匹配,以便我可以将该地址子字符串标记为街道的名称.

显然,这应该是一个模糊的文本匹配问题,我查询的子字符串与DB表中的街道名称完全匹配的可能性很小.所以应该有某种模糊文本匹配方法.我正在尝试阅读http://docs.oracle.com/cd/B28359_01/text.111/b28303/query.htm中的Oracle文档,其中解释了CONTAINS和CATSEARCH搜索运算符.但这些似乎用于更复杂的任务,例如在文档中搜索给定字符串的匹配项.我只是想为表的一列做这件事.

在这种情况下,您对我的建议是什么,Oracle是否支持这种模糊文本匹配查询?

sql oracle fuzzy-search

10
推荐指数
2
解决办法
1万
查看次数

在数据框列上应用模糊匹配,并将结果保存在新列中

我有两个数据帧,每个数据帧都有不同的行数.下面是每个数据集的几行

df1 =
     Company                                   City         State  ZIP
     FREDDIE LEES AMERICAN GOURMET SAUCE       St. Louis    MO     63101
     CITYARCHRIVER 2015 FOUNDATION             St. Louis    MO     63102
     GLAXOSMITHKLINE CONSUMER HEALTHCARE       St. Louis    MO     63102
     LACKEY SHEET METAL                        St. Louis    MO     63102
Run Code Online (Sandbox Code Playgroud)

df2 = 
     FDA Company                    FDA City    FDA State   FDA ZIP
     LACKEY SHEET METAL             St. Louis   MO          63102
     PRIMUS STERILIZER COMPANY LLC  Great Bend  KS          67530
     HELGET GAS PRODUCTS INC        Omaha       NE          68127
     ORTHOQUEST LLC                 La Vista    NE          68128
Run Code Online (Sandbox Code Playgroud)

我和他们并肩使用combined_data = pandas.concat([df1, …

python fuzzy-search pandas fuzzywuzzy

10
推荐指数
1
解决办法
6101
查看次数

fzf.vim 动态更改工作目录

当我:Files在 fzf.vim 中使用时,它会搜索当前目录和子目录中的文件。当前工作目录是固定的。在下面的屏幕截图中,它是浅蓝色的。有没有办法动态更改运行 FZF 的工作目录?例如,如果我只是删除“Documents”路径,那么 FZF 从 ~ 而不是 ~/Documents 开始。

这种功能在 Emacs helm 包中是可能的,它允许通过 helm-execute-persistent-action 来实现。

在此处输入图片说明

vim fuzzy-search fzf vim-fzf

10
推荐指数
1
解决办法
3862
查看次数

有没有办法让emacs做任何"模糊"搜索?

我不确定模糊是否是说出这个的正确方法,所以请允许我解释一下我想做什么.

通常情况下,我正在寻找我知道的文件,这些文件位于我本地SVN工作副本的特定目录中,我知道它们所在的目录,但不想考虑精确路径或者可能在不同的分支中有几个副本.例如,假设我想要一个文件"eligibility.py",我知道它位于"trunk"目录下和某个名为"interface"的目录下.

如果我可以在任何for-for-files提示符下键入类似的内容,那将是理想的:

trunk interface eligibility.py
Run Code Online (Sandbox Code Playgroud)

有什么方法可以做类似的事吗?

emacs search fuzzy-search

9
推荐指数
2
解决办法
2123
查看次数

JavaScript模糊搜索

我正在研究这个过滤的东西,我有大约50-100个列表项.每个项目都有这样的标记:

<li>
  <input type="checkbox" name="services[]" value="service_id" />
  <span class="name">Restaurant in NY</span>
  <span class="filters"><!-- hidden area -->
    <span class="city">@city: new york</span>
    <span class="region">@reg: ny</span>
    <span class="date">@start: 02/05/2012</span>
    <span class="price">@price: 100</span>
  </span>
</li>
Run Code Online (Sandbox Code Playgroud)

我创建了这样的标记因为我最初使用了List.js

所以,可能你已经猜到了,我想要的是做这样的搜索:@region: LA @price: 124等等.问题是我还想显示多个项目,以便选择超过......一个:)

我认为这需要模糊搜索,但问题是我找不到任何功能.

任何想法或起点?

//编辑:因为我有相当少量的项目,我想要一个客户端解决方案.

javascript fuzzy-search

9
推荐指数
4
解决办法
1万
查看次数

如何在一个句子中模糊匹配单词到一个完整单词(并且只有完整单词)?

常见的拼写错误的英文单词是两个或三个印刷错误(的取代的组合,内小号,插入,还是信缺失d从他们正确的形式).即单词对中的错误absence - absense可以概括为具有1s,0i0d.

可以使用to-replace-re regex python模块进行模糊匹配以查找单词及其拼写错误.

下表总结了从一些句子中对一个感兴趣的词进行模糊分段的尝试:

在此输入图像描述

  • Regex1 wordsentence允许最多2个错误时找到最佳匹配
  • Regex2找到最佳word匹配,sentence允许最多2个错误,同时尝试仅操作(我认为)整个单词
  • Regex3找到最佳word匹配,sentence允许最多2个错误,同时仅操作(我认为)整个单词.我错了.
  • Regex4找到最佳word匹配,sentence允许最多2个错误,而我(我认为)寻找匹配结束为单词边界

我如何编写一个正则表达式,如果可能的话,在这些单词 - 句子对上消除假阳性和假阴性模糊匹配?

一种可能的解决方案是仅将句子中的单词(由空格包围的字符串或行的开头/结尾)与感兴趣的单词(主要单词)进行比较.如果主要单词和句子中的单词之间存在模糊匹配(e <= 2),则从句子中返回该完整单词(并且仅返回该单词).

将以下数据帧复制到剪贴板:

            word                  sentence
0      cub cadet              cub cadet 42
1        plastex              vinyl panels
2            spt  heat and air conditioner
3     closetmaid                closetmaid
4          ryobi           batteries kyobi
5          ryobi …
Run Code Online (Sandbox Code Playgroud)

python regex fuzzy-search

9
推荐指数
1
解决办法
722
查看次数