限制时间范围时Lucene中的TFIDF计算

限制时间范围时Lucene中的TFIDF计算,lucene,tf-idf,Lucene,Tf Idf,我在不同的时间有很多文件。 现在我需要计算一段时间内文档的tfidf。 下面是我将要做的,例如: 我一年有一百万个文本文档,我将在一个月内把这些文档作为语料库。 我想计算每个月的tfidf,即计算一个月内的术语频率,并乘以剩余月份的逆文档频率 数据(文本、时间等)是使用lucene索引的,我只是想知道lucene是否有助于计算这种情况 我知道Lucene可以帮助我获得术语频率和文档频率,但是否有API限制计算的时间范围 非常感谢。我已经找到了一个使用Lucene.Net 3.0.3和有效负载的解

我在不同的时间有很多文件。 现在我需要计算一段时间内文档的tfidf。 下面是我将要做的,例如:

我一年有一百万个文本文档,我将在一个月内把这些文档作为语料库。 我想计算每个月的tfidf,即计算一个月内的术语频率,并乘以剩余月份的逆文档频率

数据(文本、时间等)是使用lucene索引的,我只是想知道lucene是否有助于计算这种情况 我知道Lucene可以帮助我获得术语频率和文档频率,但是否有API限制计算的时间范围


非常感谢。

我已经找到了一个使用Lucene.Net 3.0.3和有效负载的解决方案。我不确定这是否是使用java版本实现这一点的最佳方法,java版本目前比.net端口领先一步

它的工作原理是将一个有效负载、一个自定义字节数组分配给应该进行自定义评分的术语,以及一个覆盖ScorePayload的自定义相似性来解析字节数组以进行自定义筛选。(这需要一个调用此方法的查询,如PayloadTermQuery)

此精心设计的示例代码将根据(id%3)为术语打分。(三的倍数得分为零)。您可以将其与PositiveScoresOnlyCollector结合使用,以忽略得分为零的匹配项

using System;
using System.IO;
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Tokenattributes;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Search.Payloads;
using Lucene.Net.Store;

public static class Program {
    public static void Main() {
        var directory = new RAMDirectory();

        // Initialization; create 50 documents with payload
        var writer = new IndexWriter(directory, new KeywordAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);
        for (var i = 0; i < 50; ++i) {
            AddDocument(writer, i, "lorem ipsum etc blah blah");
        }
        writer.Commit();

        var searcher = new IndexSearcher(directory, readOnly: true);
        searcher.Similarity = new ShazaamPayloadSimilarity();

        // The term we'll be looking for. This should match all documents.
        var term = new Term("Data", "lorem");
        var query = new PayloadTermQuery(term, new MaxPayloadFunction());
        var topDocs = searcher.Search(query, 40);

        // This is a bad example of a FieldCache usage.
        var iValues = FieldCache_Fields.DEFAULT.GetStrings(searcher.IndexReader, "Id");
        foreach (var scoreDoc in topDocs.ScoreDocs) {
            Console.WriteLine("Score: {0:0.0000}  i={1}", scoreDoc.Score, iValues[scoreDoc.Doc]);
        }

        Console.ReadLine();
    }

    public static void AddDocument(IndexWriter writer, Int32 id, String data) {
        var payload = BitConverter.GetBytes(id);
        var analyzer = new ShazaamPayloadAnalyzer(payload);
        var textReader = new StringReader(data);

        var document = new Document();
        document.Add(new Field("Id", id.ToString(), Field.Store.NO, Field.Index.NOT_ANALYZED));
        document.Add(new Field("Data", analyzer.TokenStream(null, textReader)));

        writer.AddDocument(document);
    }
}

public class ShazaamPayloadAnalyzer : Analyzer {
    private readonly Byte[] _value;

    public ShazaamPayloadAnalyzer(Byte[] value) {
        _value = value;
    }

    public override TokenStream TokenStream(String fieldName, TextReader reader) {
        TokenStream result = new WhitespaceTokenizer(reader);
        result = new ShazaamPayloadFilter(result, _value);
        return result;
    }
}

public class ShazaamPayloadFilter : TokenFilter {
    private readonly byte[] _payload;
    private readonly IPayloadAttribute _payloadAttr;

    public ShazaamPayloadFilter(TokenStream input, Byte[] payload)
        : base(input) {
        _payload = payload;
        _payloadAttr = AddAttribute<IPayloadAttribute>();
    }

    public override Boolean IncrementToken() {
        if (input.IncrementToken()) {
            _payloadAttr.Payload = new Payload(_payload);
            return true;
        }

        return false;
    }
}

public class ShazaamPayloadSimilarity : DefaultSimilarity {
    public override Single ScorePayload(Int32 docId, String fieldName, Int32 start, Int32 end, Byte[] payload, Int32 offset, Int32 length) {
        var originalValue = BitConverter.ToInt32(payload, startIndex: 0);

        // Advanced logic ahead!
        return (originalValue % 3);
    }
}
使用系统;
使用System.IO;
使用Lucene.Net.Analysis;
使用Lucene.Net.Analysis.Tokenattributes;
使用Lucene.Net.Documents;
使用Lucene.Net.Index;
使用Lucene.Net.Search;
使用Lucene.Net.Search.Payloads;
使用Lucene.Net.Store;
公共静态类程序{
公共静态void Main(){
var directory=new RAMDirectory();
//初始化;使用有效负载创建50个文档
var writer=new IndexWriter(目录,new KeywordAnalyzer(),true,IndexWriter.MaxFieldLength.UNLIMITED);
对于(变量i=0;i<50;++i){
AddDocument(作者,i,“lorem ipsum等废话”);
}
writer.Commit();
var searcher=newindexsearcher(目录,只读:true);
searcher.Similarity=新的ShazaamPayloadSimilarity();
//我们要查找的术语。这应该与所有文档匹配。
var术语=新术语(“数据”、“知识产权”);
var query=new PayloadTermQuery(term,new MaxPayloadFunction());
var topDocs=searcher.Search(查询,40);
//这是一个使用FieldCache的糟糕示例。
var iValues=fieldcacheu Fields.DEFAULT.GetStrings(searcher.IndexReader,“Id”);
foreach(topDocs.ScoreDocs中的var scoreDoc){
WriteLine(“Score:{0:0.0000}i={1}”,scoreDoc.Score,iValues[scoreDoc.Doc]);
}
Console.ReadLine();
}
公共静态void AddDocument(IndexWriter编写器,Int32 id,字符串数据){
var payload=BitConverter.GetBytes(id);
var分析仪=新的ShazaamPayloadAnalyzer(有效载荷);
var textReader=新的StringReader(数据);
var document=新文档();
添加(新字段(“Id”,Id.ToString(),Field.Store.NO,Field.Index.NOT_analysis));
添加(新字段(“数据”,analyzer.TokenStream(null,textReader));
编写者。添加文档(文档);
}
}
公共类ShazaamPayloadAnalyzer:Analyzer{
专用只读字节[]_值;
公共ShazaamPayloadAnalyzer(字节[]值){
_价值=价值;
}
公共覆盖令牌流令牌流(字符串字段名,文本阅读器){
TokenStream结果=新的WhitespaceTokenizer(读取器);
结果=新的ShazaamPayloadFilter(结果,_值);
返回结果;
}
}
公共类ShazaamPayloadFilter:TokenFilter{
专用只读字节[]_有效载荷;
私有只读IPayloadAttribute\u payloadAttr;
公共ShazaamPayloadFilter(令牌流输入,字节[]有效负载)
:基本(输入){
_有效载荷=有效载荷;
_payloadAttr=AddAttribute();
}
公共重写布尔增量令牌(){
if(input.IncrementToken()){
_payloadAttr.Payload=新的有效载荷(_有效载荷);
返回true;
}
返回false;
}
}
公共类ShazaamPayloadSimilarity:DefaultSimilarity{
公共覆盖单ScorePayload(Int32 docId、字符串字段名、Int32开始、Int32结束、字节[]有效负载、Int32偏移量、Int32长度){
var originalValue=BitConverter.ToInt32(有效负载,起始索引:0);
//先进的逻辑!
返回值(原始值%3);
}
}

我使用Lucene.Net 3.0.3和有效负载找到了解决方案。我不确定这是否是使用java版本实现这一点的最佳方法,java版本目前比.net端口领先一步

它的工作原理是将一个有效负载、一个自定义字节数组分配给应该进行自定义评分的术语,以及一个覆盖ScorePayload的自定义相似性来解析字节数组以进行自定义筛选。(这需要一个调用此方法的查询,如PayloadTermQuery)

此精心设计的示例代码将根据(id%3)为术语打分。(三的倍数得分为零)。您可以将其与PositiveScoresOnlyCollector结合使用,以忽略得分为零的匹配项

using System;
using System.IO;
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Tokenattributes;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Search.Payloads;
using Lucene.Net.Store;

public static class Program {
    public static void Main() {
        var directory = new RAMDirectory();

        // Initialization; create 50 documents with payload
        var writer = new IndexWriter(directory, new KeywordAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);
        for (var i = 0; i < 50; ++i) {
            AddDocument(writer, i, "lorem ipsum etc blah blah");
        }
        writer.Commit();

        var searcher = new IndexSearcher(directory, readOnly: true);
        searcher.Similarity = new ShazaamPayloadSimilarity();

        // The term we'll be looking for. This should match all documents.
        var term = new Term("Data", "lorem");
        var query = new PayloadTermQuery(term, new MaxPayloadFunction());
        var topDocs = searcher.Search(query, 40);

        // This is a bad example of a FieldCache usage.
        var iValues = FieldCache_Fields.DEFAULT.GetStrings(searcher.IndexReader, "Id");
        foreach (var scoreDoc in topDocs.ScoreDocs) {
            Console.WriteLine("Score: {0:0.0000}  i={1}", scoreDoc.Score, iValues[scoreDoc.Doc]);
        }

        Console.ReadLine();
    }

    public static void AddDocument(IndexWriter writer, Int32 id, String data) {
        var payload = BitConverter.GetBytes(id);
        var analyzer = new ShazaamPayloadAnalyzer(payload);
        var textReader = new StringReader(data);

        var document = new Document();
        document.Add(new Field("Id", id.ToString(), Field.Store.NO, Field.Index.NOT_ANALYZED));
        document.Add(new Field("Data", analyzer.TokenStream(null, textReader)));

        writer.AddDocument(document);
    }
}

public class ShazaamPayloadAnalyzer : Analyzer {
    private readonly Byte[] _value;

    public ShazaamPayloadAnalyzer(Byte[] value) {
        _value = value;
    }

    public override TokenStream TokenStream(String fieldName, TextReader reader) {
        TokenStream result = new WhitespaceTokenizer(reader);
        result = new ShazaamPayloadFilter(result, _value);
        return result;
    }
}

public class ShazaamPayloadFilter : TokenFilter {
    private readonly byte[] _payload;
    private readonly IPayloadAttribute _payloadAttr;

    public ShazaamPayloadFilter(TokenStream input, Byte[] payload)
        : base(input) {
        _payload = payload;
        _payloadAttr = AddAttribute<IPayloadAttribute>();
    }

    public override Boolean IncrementToken() {
        if (input.IncrementToken()) {
            _payloadAttr.Payload = new Payload(_payload);
            return true;
        }

        return false;
    }
}

public class ShazaamPayloadSimilarity : DefaultSimilarity {
    public override Single ScorePayload(Int32 docId, String fieldName, Int32 start, Int32 end, Byte[] payload, Int32 offset, Int32 length) {
        var originalValue = BitConverter.ToInt32(payload, startIndex: 0);

        // Advanced logic ahead!
        return (originalValue % 3);
    }
}
使用系统;
使用System.IO;
使用Lucene.Net.Analysis;
使用Lucene.Net.Analysis.Tokenattributes;
使用Lucene.Net.Documents;
使用Lucene.Net.Index;
使用Lucene.Net.Search;
使用Lucene.Net.Search.Payloads;
使用Lucene.Net.Store;
公共静态类程序{
公共静态void Main(){
var directory=new RAMDirectory();
//初始化;使用有效负载创建50个文档
var writer=new IndexWriter(目录,new KeywordAnalyzer(),true,IndexWriter.MaxFieldLength.UNLIMITED);
对于(变量i=0;i<50;++i){