【问题标题】:Is it possible to modify term frequencies / term vectors directly?是否可以直接修改词频/词向量?
【发布时间】:2014-02-23 15:47:23
【问题描述】:

我想使用 Lucene.NET 来存储和查询术语向量。但是,我不希望从文档中创建术语向量。相反,我希望能够直接编写和更新术语向量,而不需要术语/标记的位置或偏移量。

解决方法是从术语向量生成文本,即从术语向量生成文本

foo: 3; bar: 1

生成文本

foo, foo, foo, bar

并让 Lucene 索引该文本。如果我想将 bar 的词频更新为2,我可以获取存储的文本(或者从旧词向量生成它,如果我不存储它),将其更改为

foo, foo, foo, bar, bar

并更新索引中的相应文档。

对于这样一个简单的任务来说,这是相当昂贵的。显然,这不是用例,Lucene 是为使用而构建的。不过,我希望能够使用 Lucene 的强大功能进行查询等。

有没有办法直接为文档编写术语向量,或者您有什么其他好的想法吗?

【问题讨论】:

  • 您好,我也有同样的问题。您找到解决方案了吗?
  • @eroy4u:不是真的,看看下面我的回答...
  • Elasticsearch 的同样问题——我认为这个功能真的很有用。

标签: vector lucene lucene.net


【解决方案1】:

正如我在问题中所说,Lucene 不适合直接存储和操作术语向量。至少在更新术语向量的过程方面,最初的方法或多或少是要走的路:

  1. 检索代表相关术语向量的文档
  2. 更新文档的相应字段
  3. 重新索引文档(Delete, then Add 等于 Update 在 Lucene 中)

我还没有找到一种方法来更新向量中的单个词频而不重新索引整个文档。

问题中描述的方法的一个改进是将术语向量编码为术语频率对:

代替

foo foo foo bar

字段内容可以写成

富:3;酒吧:1;

然后您可以编写一个自定义的TokenFilter,它会逐个读取这些标记,然后返回术语n 次。这不会提高性能,但会简化术语向量的处理。如果您不熟悉自定义令牌过滤器和分析器,那么使用这种方法可能不值得,我会坚持使用我在问题中已经建议的幼稚版本。

【讨论】:

    猜你喜欢
    • 2019-12-09
    • 1970-01-01
    • 2012-01-08
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多