lucene - Lucene,内存中字符串的相关性/评分
问题描述
我正在构建一个机器人来监控我感兴趣的主题的 HN。
我想分析一个内存中的字符串,并确定它是否包含一些我感兴趣的关键字。
我希望它考虑到 Lucene 在执行标准查询时所做的事情(词干、停用词、标准化标点符号等)。
我可能可以建立一个内存索引,并使用普通方法查询它,但是有没有办法可以使用 Lucene 的内部结构来避免建立不必要的索引?
如果我能得到一个相关性值(0.0-1.0),而不仅仅是一个真/假值,那么奖励积分。
伪代码:
public static decimal IsRelevant(string keywords, string input)
{
// Does the "input" variable look like it contains "keywords"?
}
IsRelevant("books", "I just bought a book, and I like it."); // matching!
IsRelevant("book", "I just bought many books!"); // matching!
解决方案
I created a solution using an in-memory search index. It's not ideal, but it does the task.
public static float RelevanceScore(string keyword, string input)
{
var directory = new RAMDirectory();
var analyzer = new EnglishAnalyzer(LuceneVersion.LUCENE_48);
using (var writer = new IndexWriter(directory, new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer)))
{
var doc = new Document();
doc.Add(new Field("input", input, Field.Store.YES, Field.Index.ANALYZED));
writer.AddDocument(doc);
writer.Commit();
}
using (var reader = IndexReader.Open(directory))
{
var searcher = new IndexSearcher(reader);
var parser = new QueryParser(LuceneVersion.LUCENE_48, "input", analyzer);
var query = parser.Parse(keyword);
var result = searcher.Search(query, null, 10);
if (result.ScoreDocs.Length == 0)
{
return 0;
}
var doc = result.ScoreDocs.Single();
return doc.Score;
}
}
推荐阅读
- cassandra - Cassandra cqlsh 无法导入 cqlshhandling
- c++ - “PMPI_Waital 中的致命错误:计数无效,错误堆栈”与 MPI_Alltoall
- git - 本地分支与远程分支同步
- java - 从字符串转换为 XML
- javascript - 如何使用 javascript 在 regExp 中使用动态变量?
- react-native - 在 My React Native Project 中,metro bundler 启动 android 完成,但 Metro bundler 从不启动 ios
- powershell - 批处理 For 循环执行命令,路径中有多个空格
- php - Index.php 在一个请求中调用了两次
- javascript - 使用解构不是在 forEach 循环中分配。如果我写 object.property,它正在分配
- r - R中的状态集群颜色