Python 倒排索引搜索引擎:原理和代码解析
这段代码是一个简单的倒排索引搜索引擎。具体功能如下:
-
导入必要的库:
sys、defaultdict、TextBlob和Word。 -
声明变量和数据结构:
- 声明了一个空字典
postings,用于存储倒排索引。 - 声明了一个列表
uselessTerm,用于存储不需要的词汇。
- 声明了一个空字典
-
定义函数
tokenize_tweet(document):对文档进行令牌化处理。- 将文档转换为小写。
- 使用
index()和rindex()方法找到文档中特定词的索引位置。 - 提取出
tweetid、username和tweet内容三部分主要信息。 - 使用
TextBlob的words.singularize()方法对文档进行词干提取和单词变单数处理。 - 使用
Word的lemmatize('v')方法对单词进行词形还原。 - 将不在
uselessTerm列表中的词添加到结果列表中,并返回结果列表。
-
定义函数
get_postings():读取文档并构建倒排索引。- 打开指定路径的文件。
- 逐行读取文件内容。
- 对每一行进行令牌化处理。
- 提取
tweetid并从列表中移除。 - 将令牌化后的词添加到集合
unique_terms中。 - 根据词在倒排索引中的情况,添加或更新倒排索引。
-
定义函数
op_and(term1, term2):实现AND操作。- 如果
term1或term2不在倒排索引中,则返回一个空列表。 - 否则,遍历
term1和term2在倒排索引中的位置。 - 如果位置相同,则添加到结果列表中,并移动两个索引的位置。
- 如果
term1的位置小于term2的位置,则移动term1的索引。 - 如果
term1的位置大于term2的位置,则移动term2的索引。 - 返回结果列表。
- 如果
-
定义函数
op_or(term1, term2):实现OR操作。- 如果
term1和term2都不在倒排索引中,则返回一个空列表。 - 如果
term2不在倒排索引中,则返回term1在倒排索引中的位置。 - 如果
term1不在倒排索引中,则返回term2在倒排索引中的位置。 - 否则,返回
term1和term2在倒排索引中的位置的并集。
- 如果
-
定义函数
op_not(term1, term2):实现NOT操作。- 如果
term1不在倒排索引中,则返回一个空列表。 - 如果
term2不在倒排索引中,则返回term1在倒排索引中的位置。 - 否则,返回
term1在倒排索引中的位置,排除term2在倒排索引中的位置。
- 如果
-
定义函数
do_rankSearch(terms):通过倒排索引实现排名搜索。- 声明一个空字典
Answer,用于存储每个tweetid的排名得分。 - 遍历查询词列表
terms。 - 如果词在倒排索引中,则遍历该词在倒排索引中的位置。
- 如果
tweetid已经在Answer中,则增加其得分;否则,将tweetid添加到Answer中并设置得分为1。 - 将
Answer按照得分降序排序,并返回结果。
- 声明一个空字典
-
定义函数
token(doc):对查询文本进行令牌化处理。- 将文本转换为小写。
- 使用
TextBlob的words.singularize()方法对文本进行词干提取和单词变单数处理。 - 使用
Word的lemmatize('v')方法对单词进行词形还原。 - 将处理后的词添加到结果列表中,并返回结果。
-
定义函数
do_search():进行查询操作。- 获取用户输入的查询词。
- 如果查询词为空,则退出程序。
- 如果查询词长度为3,则根据查询词中的逻辑操作符进行相应的操作。
- 如果查询词长度不为3,则调用
do_rankSearch()函数进行排名搜索。 - 打印查询结果。
-
定义函数
main():执行主函数。- 调用
get_postings()函数构建倒排索引。 - 循环调用
do_search()函数进行查询操作。
- 调用
-
在
if __name__ == '__main__'语句中调用main()函数,启动程序。
这段代码使用 Python 实现了一个基本的倒排索引搜索引擎,可以用于搜索文本文件中的特定信息。
原文地址: https://www.cveoy.top/t/topic/biWM 著作权归作者所有。请勿转载和采集!