问题标签 [inverted-index]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
83 浏览

c# - 通过匹配一组公共标签从大型池中选择一组值(具有多个标签)

我正在开发一款游戏,需要一种有效的方法来使用标签集合从大集合中选择记录子集。

有一个 3k+ 的声音集合,每个声音都带有许多简单的标签。集合在启动时加载一次,并且在运行时不会更改,但是,它可能会随着每个新构建而更改。

在运行时,我需要对游戏中发生的某些事件做出反应。这意味着我需要使用一组描述该事件的标签来检索最适合该事件对游戏世界的影响的声音。过滤标签可能有包含标签和排除标签。

这不是什么大问题,可以使用相对简单的 Linq 来解决。但我担心的是这段代码会在游戏循环中运行。单个帧中可能会发生任意数量的事件,因此最快的声音搜索/获取时间对于避免在游戏中的“事件繁重”时刻出现严重的帧丢失至关重要。

我不希望在每一帧都这样做,但很可能在一帧期间会发生多个事件。

现在这里是声音集合的样子:

所以,在游戏过程中,我的角色摔倒了,我确定摔倒不会致命,角色会落在地板上。

我编写了一个如下所示的标签集:

使用这样的过滤器,我希望获取以下声音:

我还没有开始实施选择算法,因为我还在考虑如何解决这个问题。到目前为止,我正在考虑做这样的事情:

  • 迭代声音的原始集合并构建一个 Dictionary<int, AudioClip>键是标签哈希的地方;
  • 当我需要一个与一组标签匹配的声音时,我会从字典中查找所有具有我想要的标签哈希的 KVP;
  • 完成后,我将得到一组可以合并然后分组的列表;
  • 计数最高的组是与过滤器最匹配的 AudioClip;
  • 排除不是问题,因为从不从字典中选择不必要的标签;

基本上我想知道这种方法一开始是否有好处,如果不是,什么是解决这个问题的更好方法。任何建议或朝着正确方向的推动将不胜感激。

PS:理论上/伪代码解决方案就可以了,不要找任何人为我做这项工作。只需要一些指导:D

编辑 1:

我发现了一些关于这个主题的有趣文章,似乎解决这个问题的最好方法是使用InvertedIndex. 但是,仍然存在获取速度的问题,因为这InvertedIndex需要对结果集进行联合操作。这可能会导致问题和严重丢帧。

根据我的一位同事的建议,我将首先尝试实现一些不同的东西。如果这确实有效,我会InvertedIndex尝试这种方法。

所以,这个想法是创建一个Dictionary(在启动时),它将包含对我收藏中声音的引用。对于给定声音可以具有的每个标签组合,每个声音都将由一个排序的标签哈希键作为键。

对于带有这些标签的声音:

我最终会得到一本字典,其中包含以下内容:

优点:检索完美匹配的声音是瞬时的。

缺点:严重的启动开销和相对较大的查找字典。

谢谢, - 亚历克斯

0 投票
1 回答
1372 浏览

php - 倒排索引数据的mysql查询

我在网站上有数千个页面,我将其解析并存储为倒排索引即

文档

  • 乖巧(PK,FK)
  • 网址
  • 字符数
  • 字数

Charactercount 和 wordcount 帮助我从短文档中确定我以后可能会使用的长文档。

单词

  • wordid (PK,FK)
  • 单词
  • doc_freq
  • inverse_doc_freq

对于 inverse_doc_freq 计算,我使用虚构的高数 (100000000) 来防止重新计算总文档。

位置

  • 词义
  • 温顺的
  • word_freq
  • 重量

(wordid & docid 结合唯一)

权重是在简单的基础上计算的分数,例如标题中的单词 + url 中的单词 + 单词频率等。

我在为搜索词构建 sql 查询时遇到问题。对于 3 字搜索,我正在做

  1. 将查询分解为每个单词
  2. 检查每个单词的 inverse_doc_freq 并移除低 idf 单词(移除停用词)
  3. 词干剩余的单词(假设还剩下 3 个单词)
  4. 查询每个单词

在第 4 阶段,我被卡住了!我的 SQL 查询就像

SELECT d.docid,url,inverse_doc_freq,word_freq,weight from document d,word w,loc l WHERE d.docid=l.docid AND w.wordid=l.wordid AND (word='word1' OR word='word2' OR word='word3') ORDER BY weight DESC

但返回的文件不正确。相信我可能必须搜索三次才能找到每个单词的文档,然后尝试找到常见的文档,但是如何?是否可以只使用 1 个 MySQL 查询?是否可以使用TF-IDF以及如何使用?

0 投票
2 回答
1466 浏览

python - 如何让基本的倒排索引程序更 Pythonic

我有如下的倒排索引代码。但是我对它不太满意,想知道如何使它更紧凑和pythonic

0 投票
2 回答
566 浏览

c# - C# 泛型集合中的倒排索引

(对不起,如果标题是一个完整的红鲱鱼顺便说一句)

背景:

我正在使用 Twitter Streaming API 和 ASP.NET SignalR 实时开发世界上所有推文的地图。我正在使用 Tweetinvi C# Twitter 库使用 SignalR 将推文异步推送到浏览器。一切都按预期工作 - 请参阅http://dev.wherelionsroam.co.uk了解它。

开发的下一步涉及使用斯坦福自然语言解析库 ( http://nlp.stanford.edu/software/corenlp.shtml ) 解析每条推文的文本数据,特别是命名实体识别器(也称为 CRFClassifier),因此我可以从每条推文中提取有意义的元数据(即提到的人物、地点和组织)。期望的结果是我将能够确定很多人正在谈论的人员、地点和组织(类似于“趋势”的概念),并使用 SignalR 将它们广播给所有客户。我知道 Twitter API 有这些GET trends方法,但这不会很有趣吗?!

以下是我的应用程序中的主要类:

主要课程:

TweetModel.cs(保存有关推文的所有信息,作为从 Streaming API 向其广播的信息):

抽象 NamedEntity 类:

Person 类,一个覆盖抽象 NamedEntity 类的类的示例:

TweetParser 类:

命名实体识别器的解释:

NER 识别库的工作方式是它对句子中的单词进行分类,其中包含诸如“Luis Suarez”的“PERSON”或“New York”的“PLACE”之类的标签。此信息存储在 NamedEntity 类的子类中,具体取决于 NER 库赋予单词的标签类型(选择PERSON, LOCATION, ORGANISATION

问题:

我的问题是,考虑到可能有多个版本的术语“Luis Suarez”出现(即 Luis Suarez、Luis Suárez),它们都将在各自不同的 NamedEntity 实例中定义(在实例内部List<NamedEntity>,在在TweetModel实例内部),将所有推文中“Luis Suarez”一词的匹配实例分组在一起,同时仍然保留TweetModel>List<NamedEntity>父子关系的最佳方法是什么。我被告知这实际上是一个倒排索引,但我不确定这个人有多了解情况!

结构可视化:

在此处输入图像描述

如果这个问题不清楚,我真的很抱歉;我真的无法用比这更简洁的方式表达它!到目前为止的完整 src,请参阅https://github.com/adaam2/FinalUniProject

0 投票
1 回答
1121 浏览

python - 信息检索、倒排索引问题

嗨,我正在尝试编写一个小程序来索引 xml 集合中的一些文档。我使用 tf-idf 方法。现在,当我的程序读取查询时,它会为每个文档中的每个单词返回一个元组列表('tf-idf'、'docid')。

这是一个例子:

在这种情况下,文档 2 里面只有一个单词。

现在我的问题是:我知道我必须在这些文档和查询之间做点积,但我该怎么做呢?如何将查询转换为权重向量?

谢谢你。

0 投票
4 回答
5696 浏览

database - 存储倒排索引

我知道倒排索引是索引单词的好方法,但我很困惑的是搜索引擎实际上是如何存储它们的?例如,如果一个单词“google”以不同的频率出现在文档 - 2、4、6、8 中,应该将它们存储在哪里?具有一对多关系的数据库表可以用来存储它们吗?

0 投票
1 回答
108 浏览

python - Python字典给出奇怪的结果

我试图从 json 响应结果生成类似倒排索引的结构。

[{“节点”:[{“节点”:[{“节点”:[{“id”:“w”}],“id”:“q”}],“id”:“e”},{ "id":"r"},{"id":"t"}],"id":"y"}, {"id":"u"}]

这是示例 json 数据,我正在尝试跟踪每个“id”对象的索引。例如,在给定的示例中,“id”等于“u”的对象具有索引 [1],而“id”等于“q”的对象具有索引 [0[0[0]]]。

此处的结果索引表示形式为数组形式,因此分别为 [1] 和 [0,0,0]。

我已经为这一切编写了这段代码。

当我运行此代码时,它会在跟踪时为每个节点打印正确的结果,但在执行结束时,索引类变量(dict object)留下了奇怪的值,我无法弄清楚,为什么?

这是执行的结果,我使用了上面给出的 json数据

树 = 树(数据)

它打印出这个:

是 [0]

e [0, 0]

q [0, 0, 0]

w [0, 0, 0, 0]

r [0, 1]

t [0, 2]

你 [1]

{'e':[0],'q':[0],'r':[0],'u':[1],'t':[0],'w':[0],' y':[0]}

所以你可以在这里看到它为每个'id'打印正确的结果索引数组,但最后类变量索引只是显示,不知道是什么。

PS:其实我不相信问这种个人问题,但我整天都在与这个作斗争。我也问过我的朋友,经过一段时间的争吵,他也说我觉得一切都很好。

所以我正在等待答案和从中吸取教训:)

提前致谢。

0 投票
1 回答
589 浏览

elasticsearch - 如何在给定查询中搜索索引短语

给定来自用户的自由格式查询,我试图确定它是否包含位置短语。

示例:给定自由格式查询“旧金山加利福尼亚州的纽约风格披萨”,并给出包含诸如“丹佛公司”、“迈阿密佛罗里达州”、“纽约市纽约市”、“旧金山加利福尼亚州”等位置短语的文档索引, "paris france" 等,匹配的将是包含位置短语 "san francisco ca" 的文档。

包含位置短语的索引还包含允许的排列,在单独的文档中。在上面的例子中,我可能有“san francisco ca”、“san francisco california”,可能还有“sf ca”、“bay area ca”等其他文档,它们都是索引中的单独文档。前面将丢弃大小写和标点符号,因此查询“纽约风格的 PIZZA, in san francisco, ca”将变为“new york style Pizza in san francisco ca”。

我还应该提到,如果有更好或需要的方法来索引位置以使其适用于给定类型的查询,例如在不同的字段中包含“城市”、“州”和“国家”,我可以这样做也是如此,我非常愿意接受建议。

到目前为止我已经尝试过:

  1. 普通的旧匹配查询。似乎效果最好,但忽略了排序...“san francisco ca”是匹配的,而“ca francisco san”不应该匹配。也忽略了位置。
  2. 短语匹配。根本不起作用,因为由于输入查询中的额外术语(“纽约风格的披萨店”),我没有得到任何匹配项。
  3. 多字段匹配,cross_fields 选项。与匹配查询相同的问题;忽略排序和位置。这是尝试使用“城市”和“州”等是不同字段的索引版本。
  4. 渗透。根本无法上班。调用 GET .../_percolate 检索索引中的所有文档。此外,构建 .percolator 类型非常缓慢,最终使我的实例崩溃(JVM 内存 99%),而使用批量 api 这样做。我的数据库中有大约 100 万个位置,我认为对于 percolator 来说太多了,它在大约 120K 位置始终崩溃。根据我的阅读,我认为这不是渗滤器的合适用例,但不确定。

我没有尝试过的,以及为什么:

  1. 带状疱疹。给定位置的术语数量是可变的(即“dallas texas”与“san francisco california”与“new york city new york”),并且带状疱疹似乎适用于特定数量的术语。
  2. 请求参数。我不想要求用户将短语放在双引号内。我也不想要查询语言(OR、AND 等)。此外,忽略位置。

我已经花了 3-4 天的时间来解决这个问题,并且非常感谢一些温和的指导。示例查询/索引/映射会很棒,但即使只是让我知道我应该使用哪种类型的查询(以及索引和映射)也会非常有帮助,所以我至少可以“找到正确的树”!

我愿意将其他工具与 ES 结合使用,只要它们是开源的、免费提供的并且得到相当好的支持和使用。位置数据库包含约 1M 条记录。

奖励:我假设位置短语(如果有)将接近查询的结尾。某种方式来感知这一点或相应地提升结果会很棒。请注意,我不想将此作为绝对要求;如果用户提交查询“我想要 san francisco ca 披萨店有纽约风格的披萨”,那么给定前面描述的索引的唯一有效的位置短语是“san francisco ca”,这应该是匹配的。

奖励 2X:我有每个位置的人口信息。对于更高的人口,稍微提高结果的某种方法也会很棒(我已经尝试了 function_score 与 field_value_factor 函数和 ln1p 修饰符,它似乎工作得很好,但不确定如果我最终使用 percolator 会如何工作)。

奖金 3X!:容纳轻微的拼写错误,例如“san francsco”会很棒。

我正在使用 ElasticSearch 1.3.2。

谢谢你!!

编辑:为了清楚起见,我正在寻找一个短语搜索,当索引短语比查询短时,正如这里很好描述的那样,但不幸的是没有完全解决:

Solr:索引短语短于查询时的短语搜索

0 投票
1 回答
558 浏览

solr - Lucene的倒排索引是否存储在内存中?

我正在做一个使用 Solr 进行数据检索的项目。据我所知,Solr 在内部使用 Lucene。Lucene 创建了一个倒排索引。并且该索引存储在文件系统中的多个文件中,如文档中所述 - http://lucene.apache.org/core/3_0_3/fileformats.html#Inverted%20Indexing

我很想知道搜索时这是如何工作的。倒排索引是否会被加载并保存在内存中,这样它就不需要进入文件系统。如果没有,有没有办法可以将其保存在内存中,以便我的搜索速度更快。

0 投票
0 回答
147 浏览

elasticsearch - Elasticsearch - 理论上的术语聚合

想象一个特定字段上的随机术语聚合:

我的问题是:ES 如何聚合术语?

如果倒排 & fielddate 索引看起来像这样:ES:倒排索引和 fielddata 索引以及每个文档而不是每个字段存储唯一术语的事实,ES 如何聚合每个字段的术语?聚合它们的幕后发生了什么?

有人可以给我/我们一些启示吗?预先感谢