Whoosh是一个用于索引文本并进行搜索的类和函数库。它允许您为您的内容开发自定义搜索引擎。在USPTO 布尔专利检索比赛中,也是使用 Whoosh 构建的专利搜索数据库模拟器。
https://www.kaggle.com/code/sohier/basic-whoosh-search-demo
什么是Whoosh?
Whoosh是由Matt Chaput创建的快速而灵活的纯Python搜索引擎库。最初,它是为Houdini 3D动画软件包的在线文档创建的一个简单而快速的搜索服务器。Side Effects Software慷慨地允许Matt将代码开源,以便其他需要非常灵活或纯Python搜索引擎(或两者兼而有之)的人可以使用。
以下是关于Whoosh的一些重要信息:
Whoosh非常快速,但仅使用纯Python编写,因此可以在任何支持Python的地方运行,无需编译器。 默认情况下,Whoosh使用Okapi BM25F排名函数,但像大多数功能一样,排名函数可以轻松自定义。 与许多其他搜索库相比,Whoosh创建的索引相对较小。 Whoosh中的所有索引文本必须是Unicode格式。 Whoosh允许您将任意的Python对象与索引文档一起存储。
Whoosh是一个快速、纯Python的搜索引擎库。它的主要设计动机是基于纯Python。您可以在任何可以使用Python的地方使用Whoosh,无需编译器或Java。
快速入门
>>> from whoosh.index import create_in
>>> from whoosh.fields import *
>>> schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT)
>>> ix = create_in("indexdir", schema)
>>> writer = ix.writer()
>>> writer.add_document(title=u"第一篇文档", path=u"/a",
... content=u"这是我们添加的第一篇文档!")
>>> writer.add_document(title=u"第二篇文档", path=u"/b",
... content=u"第二篇更加有趣!")
>>> writer.commit()
>>> from whoosh.qparser import QueryParser
>>> with ix.searcher() as searcher:
... query = QueryParser("content", ix.schema).parse("第一篇")
... results = searcher.search(query)
... results[0]
...
{"title": u"第一篇文档", "path": u"/a"}
Index
和Schema
对象
要开始使用Whoosh,您需要一个索引对象。第一次创建索引时,必须定义索引的模式(schema)。模式列出了索引中的字段。字段是索引中每个文档的信息,例如标题或文本内容。字段可以被索引(表示可以进行搜索)和/或存储(表示与结果一起返回被索引的值;这对于诸如标题之类的字段非常有用)。
这个模式有两个字段,"title"和"content":
from whoosh.fields import Schema, TEXT
schema = Schema(title=TEXT, content=TEXT)
只需在创建索引时创建模式一次。模式会被序列化并与索引一起存储。
创建Schema
对象时,您可以使用关键字参数将字段名称映射到字段类型。字段列表及其类型定义了您要索引和可搜索的内容。Whoosh提供了一些非常有用的预定义字段类型,并且您可以轻松创建自己的字段类型。
whoosh.fields.ID这种类型将字段的整个值作为单个单元索引(可选择存储)。对于文件路径、URL、日期、类别等字段非常有用。
whoosh.fields.STORED这个字段与文档一起存储,但不被索引。这种字段类型既不被索引也不可搜索。对于您希望在搜索结果中向用户显示的文档信息非常有用。
whoosh.fields.KEYWORD这种类型适用于以空格或逗号分隔的关键字。此类型被索引和可搜索(可选择存储)。为了节省空间,它不支持短语搜索。
whoosh.fields.TEXT这种类型适用于正文文本。它索引(可选择存储)文本并存储术语位置以允许短语搜索。
whoosh.fields.NUMERIC这种类型适用于数字。您可以存储整数或浮点数。
whoosh.fields.BOOLEAN这种类型适用于布尔(真/假)值。
whoosh.fields.DATETIME这种类型适用于
datetime
对象。有关更多信息,请参阅索引和解析日期/时间。whoosh.fields.NGRAM
和whoosh.fields.NGRAMWORDS这些类型将字段文本或单个术语分解为N-gram。有关更多信息,请参阅索引和搜索N-gram。
术语表
分析(Analysis)
将字段的文本分解为要进行索引的单个术语的过程。这包括将文本分词为术语,然后选择性地过滤分词后的术语(例如,转换为小写并删除停用词)。Whoosh包含了几种不同的分析器。
语料库(Corpus)
您正在进行索引的文档集合。
文档(Documents)
您希望进行搜索的单个内容片段。术语“文档”可能暗示了文件,但实际上数据源可以是任何内容-内容管理系统中的文章,博客系统中的博文,大型文件的片段,从SQL查询中返回的行,邮箱文件中的单个电子邮件等等。当您从Whoosh获取搜索结果时,结果是一组文档,而“文档”在您的搜索引擎中可以表示任何含义。
字段(Fields)
每个文档包含一组字段。典型的字段可能是“标题”、“内容”、“URL”、“关键词”、“状态”、“日期”等等。字段可以被索引(以便可以进行搜索)和/或与文档一起存储。存储字段使其在搜索结果中可用。例如,通常要存储“标题”字段,以便搜索结果可以显示它。
正向索引(Forward index)
列出每个文档以及出现在该文档中的单词的表格。Whoosh允许您存储一种称为术语向量(term vectors)的正向索引。
索引(Indexing)
检查语料库中的文档并将其添加到反向索引(reverse index)中的过程。
倒排表(Postings)
反向索引(reverse index)列出语料库中的每个单词,对于每个单词,列出出现该单词的文档列表,以及一些可选信息(例如单词在该文档中出现的次数)。列表中的这些项,包含文档编号和任何额外信息,称为倒排项(postings)。在Whoosh中,对于每个字段,可以自定义存储在倒排项中的信息。
反向索引(Reverse index)
基本上是一个列出语料库中每个单词的表格,对于每个单词,列出出现该单词的文档。它可以更复杂(索引还可以列出单词在每个文档中出现的次数,出现的位置等等),但基本上就是这样工作的。
架构(Schema)
在开始索引之前,Whoosh要求您指定索引的字段。架构将字段名称与字段的元数据相关联,例如倒排项的格式以及字段的内容是否存储在索引中。
术语向量(Term vector)
特定文档中特定字段的正向索引。您可以在架构中指定给定字段应存储术语向量。
# 学习大模型 & 讨论Kaggle #

每天大模型、算法竞赛、干货资讯





