倒排索引 inverted index
2019独角兽企业重金招聘Python工程师标准>>>
1、什么是倒排索引。
e>>>(⊙o⊙)… 这是我见过最垃圾的翻译了,完全让人误解他的意思。
这个名称很容易让人理解为从A-Z的排序颠倒成Z-A,其实根本不是这么回事。
英文 原版为 inverted index 个人感觉翻译成 反向索引 比较合适。
倒排索引是区别于正排索引(forward index)来说的。
解释:
文档是有许多的单词组成的,其中每个单词也可以在同一个文档中重复出现很多次,当然,同一个单词也可以出现在不同的文档中。
正排索引(forward index):从文档角度看其中的单词,表示每个文档(用文档ID标识)都含有哪些单词,以及每个单词出现了多少次(词频)及其出现位置(相对于文档首部的偏移量)。
倒排索引(inverted index,或inverted files):从单词角度看文档,标识每个单词分别在那些文档中出现(文档ID),以及在各自的文档中每个单词分别出现了多少次(词频)及其出现位置(相对于该文档首部的偏移量)。
简单记为:
正排索引:文档 ---> 单词 常规的索引是文档到关键词的映射
倒排索引:单词 ---> 文档 倒排索引是关键词到文档的映射
应用场景:
倒排索引有着广泛的应用场景,比如搜索引擎、大规模数据库索引、文档检索、多媒体检索/信息检索领域等等。总之,倒排索引在检索领域是很重要的一种索引机制。
2、inverted index 的java实现
假设有3篇文章,file1, file2, file3,文件内容如下:
那么建立的倒排索引就是这个样子:
下面是对于倒排索引的一个简单的实现。该程序对于输入的一段文字,查找出该词所出现的行号以及出现的次数。
import java.io.*;
import java.util.HashMap;
import java.util.Map; public class InvertedIndex { private Map<String, Map<Integer, Integer>> index; private Map<Integer, Integer> subIndex; public void createIndex(String filePath) { index = new HashMap<String, Map<Integer, Integer>>(); try { File file = new File(filePath); InputStream is = new FileInputStream(file); BufferedReader read = new BufferedReader(new InputStreamReader(is)); String temp = null; int line = 1; while ((temp = read.readLine()) != null) { String[] words = temp.split(" "); for (String word : words) { if (!index.containsKey(word)) { subIndex = new HashMap<Integer, Integer>(); subIndex.put(line, 1); index.put(word, subIndex); } else { subIndex = index.get(word); if (subIndex.containsKey(line)) { int count = subIndex.get(line); subIndex.put(line, count+1); } else { subIndex.put(line, 1); } } } line++; } read.close(); is.close(); } catch (IOException e) { System.out.println("error in read file"); } } public void find(String str) { String[] words = str.split(" "); for (String word : words) { StringBuilder sb = new StringBuilder(); if (index.containsKey(word)) { sb.append("word: " + word + " in "); Map<Integer, Integer> temp = index.get(word); for (Map.Entry<Integer, Integer> e : temp.entrySet()) { sb.append("line " + e.getKey() + " [" + e.getValue() + "] , "); } } else { sb.append("word: " + word + " not found"); } System.out.println(sb); } } public static void main(String[] args) { InvertedIndex index = new InvertedIndex(); index.createIndex("news.txt"); index.find("I love Shanghai today"); }
}
其中,输入文件news.txt内容为:
I am eriol
I live in Shanghai and I love Shanghai
I also love travelling
life in Shanghai
is beautiful
输出结果为:
word: I in line 1 [1] , line 2 [2] , line 3 [1] ,
word: love in line 2 [1] , line 3 [1] ,
word: Shanghai in line 2 [2] , line 4 [1] ,
word: today not found
参考来自! 倒排索引简单实现
知乎:倒排索引为什么叫倒排索引?
另外的资源学习(本文并未涉及)
倒排索引的java实现
MapReduce实现倒排索引(类似协同过滤)
hadoop倒排索引
转载于:https://my.oschina.net/zjllovecode/blog/1554246
倒排索引 inverted index相关推荐
- MapReduce功能实现十---倒排索引(Inverted Index)
MapReduce功能实现系列: MapReduce功能实现一-Hbase和Hdfs之间数据相互转换 MapReduce功能实现二-排序 MapReduce功能实现 ...
- 正排索引(forward index)与倒排索引(inverted index)
一.正排索引(前向索引) 正排索引也称为"前向索引".它是创建倒排索引的基础,具有以下字段. (1)LocalId字段(表中简称"Lid"):表示一个文档的局部 ...
- python 倒排索引(Inverted Index)
倒排索引是一种检索方式,比如存入数据库的数据是存一篇文章进去,然而检索时我们经常需要通过关键词检索,所以提前做好倒排索引即可方便检索,而省略掉全表扫描的问题了,这是一种用空间换时间的方法. 使用字典构 ...
- ElasticSearch 学习笔记(一):倒排索引(Inverted index)
分析一个术语,要先从名称入手 倒排索引,英文原名Inverted index,大概因为 Invert 有颠倒的意思,就被翻译成了倒排.但是倒排这个名称很容易让人理解为从A-Z颠倒成Z-A.个人觉得翻译 ...
- 斯坦福NLP笔记72 —— The Inverted Index
2019独角兽企业重金招聘Python工程师标准>>> Inverted Index是信息抽取里最常用的数据结构,来看看他长啥样: Brutus指向数字X则代表X号文档中包含了Bru ...
- 【es】Elasticsearch:inverted index,doc_values及source
文章目录 1.概述 2.Inverted index 3.Source 4.Doc_values 1.概述 转载:https://www.cnblogs.com/sanduzxcvbnm/p/1208 ...
- 反向索引(Inverted Index)
转自:http://zhangyu8374.iteye.com/blog/86307 反向索引是一种索引结构,它存储了单词与单词自身在一个或多个文档中所在位置之间的映射.反向索引通常利用关联数组实现. ...
- inverted index
Index是啥? 书后面的index实际上是inverted index,是用来查找的. 是一个词,出现在document的什么地方,page number.f(Word) returns a set ...
- Lucene Inverted index(倒排索引)原来快速入门
Lucene是一个高性能的JAVA全文检索工具包,它使用的是倒排文件索引结构.该结构及相应的生成算法如下: 设有两篇文章1和2: 文章1的内容为:Tom lives in Guangzhou, I l ...
最新文章
- 17DOM之操作元素
- 通过Spring配置文件中bean中的property赋值
- 行业观察(一)| 从渠道为王到数据为王——浅谈服装零售企业的数字化转型...
- 虚拟服务器系统一般用那种,虚拟主机 选什么系统
- 怎么中文读_这些中文名字如果用日语念出来会怎样?!
- 如何为libs目录下的jar包关联源代码
- 网络编程之 TCP / UDP 及其流程比较
- 分解质因数-洛谷P3200 [HNOI2009]有趣的数列
- Delphi与各数据库数据类型比较
- 怎么配置服务器php环境,配置PHP服务器环境步骤详解
- c语言 哪些运算符左右需要空格,C语言运算符优先级口诀?
- 无意中发现的MSDN软件下载网站
- java自己写的网络爬虫
- Rabbitmq消息发布确认机制
- 跟着源码看lcn分布式事务
- 电脑可以连接手机热点,却无法连路由器无线wifi
- 增加收入的 6 种方式
- 有余记账(h5记账类项目)
- 为何Adobe国际认证证书被那么多人吐槽,看完你就明白了
- 交通元宇宙的技术与应用(附下载)