【问题标题】:Fuzzy runtime search without using database\index不使用数据库\索引的模糊运行时搜索
【发布时间】:2010-07-11 18:33:28
【问题描述】:

我需要通过检查每个条目的预定义字符串的模糊匹配来过滤文本文章流(我正在搜索拼写错误的产品名称,有时它们具有不同的单词顺序和额外的非字母字符,例如“:”或“,” )。

通过将这篇文章放入 sphinx 索引并对其执行搜索,我得到了很好的结果,但不幸的是,我每秒收到数百篇文章,并且在获取每篇文章后更新索引太慢(我知道它不是为此类任务而设计的)。我需要一些库,它可以在大约 100kb 的小文本的内存索引中构建并对其执行模糊搜索,这样的东西存在吗?

【问题讨论】:

    标签: python full-text-search fuzzy-search


    【解决方案1】:

    这个问题几乎与Bayesian spam filtering 相同,并且已经为此编写的工具可以根据您的标准进行训练以识别。

    针对评论添加

    那么您现在如何将流划分为 bin 呢?如果您已经有一个分离文章的语料库,只需将其输入分类器。贝叶斯分类器是在上下文中进行模糊内容匹配的方法,可以对从垃圾邮件到核苷酸到天文光谱类别的所有内容进行分类。

    您可以使用较少随机的方法(例如 Levenshtein),但在某些时候您必须描述命中和未命中之间的区别。贝叶斯方法的美妙之处在于,特别是如果您已经拥有一个分离的语料库,您实际上并不需要明确知道您是如何分类的。

    【讨论】:

    • 谢谢,这是一个非常聪明的主意,但不幸的是,现在我无法训练过滤器,AFAIK 贝叶斯过滤不适用于长(6-7 个单词)搜索字符串。
    • FAYK 不正确。显然,您不仅没有时间训练过滤器,而且您也没有时间进行 RTFWA。
    • LOL,别误会,我不是说我懒得训练过滤器(或阅读维基百科),但是这个过滤器的数量可能很大(所以我不能为每个人准备一组经过训练的过滤器)并创建“添加过滤器 - 检查 - 训练 - 重复”循环不是我任务的最佳解决方案(最终用户更愿意得到一些错误的结果,而不是花更多时间在训练过滤器上)。至于长搜索字符串我可能是错的,这只是在我的电子邮件客户端中使用贝叶斯垃圾邮件过滤的个人经验:)
    • 我现在正在使用简单的字符串搜索和手动标记文章 :) 无论如何 - 感谢您的建议,我一定会尝试使用当前数据,因为我已经有了正确和错误的数据集(没有想法我是否有足够的数据来创建好的规则)。有什么 Python 库推荐吗?
    • nltk.org 浮现在脑海中,会带你到那里(以及其他一百个地方),但在 PyPi 上可能会找到更专注的东西:pypi.python.org/…
    【解决方案2】:

    使用 sqlite fts3 扩展怎么样?

    使用 fts3(content TEXT) 创建虚拟表 enrondata1;

    (您可以创建任意数量的列——所有列都会被索引)

    之后,您可以插入任何您喜欢的内容,并且可以在不重建索引的情况下搜索它——匹配特定列或整行。

    (http://www.sqlite.org/fts3.html)

    【讨论】:

    • 谢谢建议,用 sqlite 玩了一会儿,使用带有 porter tokenizer 的 fts3 给出了非常好的结果,但它不适用于搜索字符串类似于“玩具总动员 3 的东西”并且文本包含“玩具总动员 3 some_other_word" :(
    猜你喜欢
    • 1970-01-01
    • 2011-10-06
    • 2014-06-11
    • 2016-11-20
    • 1970-01-01
    • 2011-01-12
    • 2020-05-06
    • 2016-01-18
    • 2021-06-11
    相关资源
    最近更新 更多