python建立索引_利用Xapian建立索引(Python版)

在信息检索(IR)中,我们企图要获取的项称之为“document”,每一个document是被一个terms集合所描述的。 “document”和“term”这两个词汇是IR中的术语,它们是来自“图书馆管理学”的。通常一个document认为是一块文本,. Usually a document is thought of as a piece of text, most likely in a machine readable form, 而一个term则是一个词语或短语以用作描述document的,在document中大多数会存在着多个term,例如某个document是跟口腔卫生相关的,那么可能会存在着以下的terms:“tooth”、“teeth”、“toothbrush”、“decay”、 “cavity”、“plaque”或“diet”等等。

如果在一个IR系统中,存在一个名为D的document,此document被一个名为t的term所描述,那么t被认为索引了D,可以用以下式子表示:t->D。在实际应用的一个IR系统中通常是多个documents,如D1, D2, D3 …组成的集合,且有多个term,如t1, t2, t3 …组成的集合,从而有以下关系:ti -> Dj。

如果某个特定的term索引了某个特定的document,那么称之为posting,说白了posting就是带position信息的term,在相关度检索中可能有一定的用途的。

给定一个名为D的document,存在着一个terms列表索引着它,我们称之为D的term list。

给定一个名为t的term,它索引着一个documents列表,这称之为t的posting list(使用“Document list”可能会在叫法上更一致,但听起来过于空泛)。

在一个存在于计算机的IR系统中,terms是存储于索引文件中的。term可以用作有效地查找它的posting list,在posting list里,每一个document带有一个很短的标识符,就是document id。简单来说,一个posting list可以被认为是一个由document ids组成的集合,而term list则是一个字符串组成的集合。在某些IR系统的内部是使用数字来表示term的,因此在这些系统中,term list则是数字组成的集合,而Xapian则不是这样,它使用原汁原味的term,而使用前缀来压缩存储空间。

Terms不一定是要是document中出现的词语,通常它们会被转换为小写,而且往往它们被词干提取算法处理过,因此通过一个值为“connect”的term可能会检索出一系列的词语,例如“connect”、“connects”、“connection”或“connected”等,而一个词语也可能产生多个的terms,例如你会将提取出的词干和未提取的词语都索引起来。当然,这可能只适用于英语、法语或拉丁语等欧美系列的语言,而中文的分词则有很大的区别,总的来说,欧美语系的语言分词与中文分词有以下的区别:

l         拿英语来说,通常情况下英语的每一个词语之间是用空格来隔开的,而中文则不然,甚至可以极端到整篇文章都不出现空格或标点符号。

l         像上面提到的,“connect”、“connects”、“connection”或“connected”分别的意思“动词性质的连接”、“动词性质的第三人称的连接”、“名称性质的连接”或“连接的过去式”,但在中文里,用“连接”就可以表示全部了,几乎不需要词干提取。这意味着英语的各种词性大部分是有章可循的,而中文的词性则是天马行空的。

l         第二点只是中文分词非常困难的一个缩影,要完全正确地标识出某个句子的语意是很困难的,例如“中华人民共和国成立了”这个句子,可以分出“中华”、“华人”、“人民”、“共和国”、“成立”等词语,不过其中“华人”跟这个句子其实关系不大。咋一眼看上去很简单,但机器那有这么容易懂这其中的奥妙呢?

Values

Values是附加在document上一种元数据,每一个document可以有多个values,这些values通过不同的数字来标识。Values被设计成在匹配过程中快速地访问,它们可以用作排序、排队多余重复的document和范围检索等用途。虽然values并没有长度限制,但最好让它们尽可能短,如果你仅仅是想存储某个字段以便作为结果显示,那么建议您最好将它们保存在document的data中。

Document data

每一个Document只有一个data,可以是任意类型格式的数据,当然在存储的时候请先转换为字符串。这听上去可能有点古怪,实情是这样的:如果要存储的数据是文本格式,则可以直接存储;如果要存储的数据是各种的对象,请先序列化成二进制流再保存,而在读取的时候反序列化读取。

posting:

posting是带position的term.

# -*- coding: gb18030 -*-

import xapian

testdatas = [u'abc test python1',u'abcd testing python2']

def buildtest():

database = xapian.WritableDatabase('indexes/', xapian.DB_CREATE_OR_OPEN)

#建立索引库,类似file的'w'的操作,不存在新建

stemmer = xapian.Stem("english")

#分词语言设置,不支持中文,后面介绍如何中文分词,这里没有用到如何英文分词,否认则可以使用stemmer.stem_word来分词

for data in testdatas:

doc = xapian.Document()

#新建document

doc.set_data(data)

#data赋值

for term in data.split():

doc.add_term(term)

#以每个词为term赋值

database.add_document(doc)

#索引库添加document

if __name__ == '__main__':

buildtest()

执行后,当前目录下生成索引库。

[ec2-user@ip-10-167-6-221 indexes]$ ll

总用量 52

-rw-rw-r-- 1 ec2-user ec2-user    0  7月 28 16:06 flintlock

-rw-rw-r-- 1 ec2-user ec2-user   28  7月 28 16:06 iamchert

-rw-rw-r-- 1 ec2-user ec2-user   13  7月 28 16:06 postlist.baseA

-rw-rw-r-- 1 ec2-user ec2-user   14  7月 28 16:06 postlist.baseB

-rw-rw-r-- 1 ec2-user ec2-user 8192  7月 28 16:06 postlist.DB

-rw-rw-r-- 1 ec2-user ec2-user   13  7月 28 16:06 record.baseA

-rw-rw-r-- 1 ec2-user ec2-user   14  7月 28 16:06 record.baseB

-rw-rw-r-- 1 ec2-user ec2-user 8192  7月 28 16:06 record.DB

-rw-rw-r-- 1 ec2-user ec2-user   13  7月 28 16:06 termlist.baseA

-rw-rw-r-- 1 ec2-user ec2-user   14  7月 28 16:06 termlist.baseB

-rw-rw-r-- 1 ec2-user ec2-user 8192  7月 28 16:06 termlist.DB

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
Python Xapian(简称xapian)是一个用于全文搜索和信息检索的开源工具库。它提供了Python语言的接口,使得我们可以方便地在Python环境中使用xapian的功能。 xapian是一种基于倒排索引的搜索引擎。它的主要特点是快速、可扩展,以及支持多种语言。我们可以利用xapian来创建和维护一个倒排索引库,然后在这个库上进行全文搜索和信息检索。 使用xapian,我们可以将一个文本集合中的文档添加到索引库中。这个索引库可以包含多个字段,每个字段可以是不同的文本类型(例如标题、正文、作者等)。然后,我们可以使用查询语句在这个索引库中进行搜索。xapian支持多种查询类型,例如布尔查询、短语查询、通配符查询等。 除了基本的全文搜索,xapian还提供了一些高级功能。例如,我们可以使用xapian来计算查询和文档之间的相关性得分,从而对搜索结果进行排序。xapian还支持结果分页、结果高亮显示等功能,使得搜索结果更易于阅读和理解。 使用Python Xapian,我们可以在Python程序中轻松地集成全文搜索和信息检索功能。它可以应用于各种场景,例如网站搜索引擎、文档管理系统、邮件分类等。通过合理使用xapian的功能,我们可以帮助用户快速准确地找到他们所需的信息,提高用户体验和效率。 总之,Python Xapian是一个功能强大、易于使用的全文搜索和信息检索工具库。它提供了丰富的功能和灵活的接口,可以满足不同应用的需求。无论是初学者还是专业开发人员,都可以利用xapian来构建高效的搜索和检索系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值