- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当查询带有查询 'text' 的字段时,找到两个带有 'text abcd' 和 'text ab' 的文档,它们都得到相同的分数。
有没有办法提高“文本 ab”的得分,因为它更短?
最佳答案
这似乎是基于对长度在 lucene 评分方面的误解。将标记 视为索引文本的原子单位而不是字符是很有用的。 lucene 在评分中考虑的长度是字段中的标记数。您指定的两个字段都恰好有两个标记。它们的长度相同,因此它们的长度范数也相等,并且不影响相对得分。
如果您有一个包含三个词的字段,您实际上会看到长度对分数的影响:
该标准乘以分数,因此最后列出的文档的分数会低一些。
如果您不认同以术语而不是字符为单位来思考内容的想法:
由于您正在考虑的长度适用于字符,因此实现这一点肯定有些违背常理。不过,您在考虑规范方面走在正确的轨道上。这绝对应该在索引时进行预处理并作为规范存储。
您需要在自定义相似性类中实现它。我假设我们喜欢 DefaultSimilarity
的其余部分,因此您可以扩展它并覆盖 LengthNorm
以简化此操作。您可以很容易地利用字段偏移量来获得:
public class MySimilarity extends DefaultSimilarity {
@Override
public float lengthNorm(FieldInvertState state) {
return state.getBoost() * ((float) (1.0 / Math.sqrt(state.getOffset())));
}
}
就是这样。给定文档和查询的测试运行显示:
所以,你可以从我添加的较长文档中看到它是有效的,那么为什么“text ab”和“text abcd”仍然具有相同的分数?
规范以超压缩形式存储在单个字节中。它们只有 3 位尾数,这使它们的精度略低于 1 位小数。因此,考虑到压缩方案,仅这两个添加字符的差异不足以产生影响。当涉及到这种提升时,常识是:“只有大的差异才重要”(参见 the DefaultSimilarity
documentation)
所以,“谁在乎在搜索时节省一些内存?小差异对我来说很重要!”,我听到你说。
好的,您需要覆盖 encodeNorm
和 decodeNorm
。由于这些在 DefaultSimilarity
中是最终的,因此您需要扩展 TFIDFSimilarity
。我只是从复制 DefaultSimilarity
的源代码开始。最后你可以使用这样的东西:
public class MySimilarity extends TFIDFSimilarity {
public MySimilarity() {}
@Override
public float coord(int overlap, int maxOverlap) {
return overlap / (float)maxOverlap;
}
@Override
public float queryNorm(float sumOfSquaredWeights) {
return (float)(1.0 / Math.sqrt(sumOfSquaredWeights));
}
//Since length norms are generally going to leave us with results less than one, multiply
//by a sufficiently large number to not lose all our precision when casting to long
private static final float NORM_ADJUSTMENT = Integer.MAX_VALUE;
@Override
public final long encodeNormValue(float f) {
return (long) (f * NORM_ADJUSTMENT);
}
@Override
public final float decodeNormValue(long norm) {
System.out.println(norm);
return ((float) norm) / NORM_ADJUSTMENT;
}
@Override
public float lengthNorm(FieldInvertState state) {
return state.getBoost() * ((float) (1.0 / Math.sqrt(state.getOffset())));
}
@Override
public float tf(float freq) {
return (float)Math.sqrt(freq);
}
@Override
public float sloppyFreq(int distance) {
return 1.0f / (distance + 1);
}
@Override
public float scorePayload(int doc, int start, int end, BytesRef payload) {
return 1;
}
@Override
public float idf(long docFreq, long numDocs) {
return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);
}
@Override
public String toString() {
return "DefaultSimilarity";
}
}
现在我得到:
关于java - Elastic Search - Boosting/Scoring - 两个不同长度的词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26256150/
虽然 find(["a", "b"], "c") 没有问题,但在尝试查找结构数组中的结构索引时出现错误: struct Score { //... } var scores: [Score]
也许我在 http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials 中遗漏了一些东西 似乎要渲染部分,我们可以使用
我正在发布 Android Facebook 游戏的分数,我返回“真实”,但我在任何地方都看不到这个故事。我错过了什么? 最佳答案 Facebook 似乎有一些逻辑,有时只发布基于分数的故事。 您可以
我有包含一些数据和特定省略列表的文档(参见 mapping 和 example data ): 我想编写一个执行以下操作的 ES 查询: 计算文档的一些“基本”分数(查询 1): { "expla
我是 iOS 开发的新手,我已经成功地集成了 facebook 登录等...但是我的问题是 Score api。我可以阅读乐谱,但我似乎无法发布它,我拥有 publish_actions 权限,并且正
如果我有 2 个标签(1 和 0),并且在我通过 softmax 激活层传递我的 logits 之后,我得到如下内容: [[0.1, 0.9], [0.3, 0.7], [0.333, 0.667]]
我正在使用 k 折交叉验证来计算加法平滑参数 alpha 的最佳值。另外,我想根据 alpha 值绘制训练准确度和验证准确度的曲线。我为此编写了代码: alphas = list(np.arange(
我使用的示例摘自《Mastering Machine Learning with scikit learn》一书。 它使用决策树来预测网页上的每个图像是否是一个广告或文章内容。然后可以使用级联样式表隐
我使用 scipy.cluster.hierarchy.linkage 作为聚类算法并将结果链接矩阵传递给 scipy.cluster.hierarchy.fcluster ,以获得扁平化的集群,用于
我有以下代码,我想用它来检查用户答案并输出分数(满分 5 分)。我使用包含答案的 plist 并检查 textField.text 。我正在努力解决的是:如何使用这种方法获得总输出分数? - (IBA
我知道还有很多其他类似的问题与该领域有关,但没有一个答案有效。就我而言,我有以下代码,我试图按分数降序对记录数组进行排序。 function score(string, pattern){ str
我希望能够保留玩家在玩我的游戏时获得的分数,以及当他们关闭游戏并重新打开游戏时分数仍然保存。我能想到的唯一方法是使用文本文件来完成此操作,就像我在 VB6 中所做的那样。但是,这意味着他们可以编辑文本
现在我已经完成了我的游戏制作,我需要添加的是应用内购买和排行榜,并且为了不搞砸我正在使用测试应用做的任何事情。我的排行榜现在正在显示,即使我在测试时(在真实设备和模拟器上)登录到游戏中心,查看排行榜时
您可以使用 1 行代码轻松提取轮廓分数,该代码对所有集群的分数进行平均,但是如何从轮廓分数的 scikit learn 实现中提取每个中间分数?我希望能够为每个集群单独提取相同的分数,而不仅仅是获得总
我正在用 JavaScript 和 HTML 制作一个在线游戏(一个非常简单的游戏,这是我的第一个游戏)。它工作正常,但有一个大问题。我希望每当单击特定图像时,都会将 10 添加到变量分数的值中。这是
我的 votes 表如下所示: id: integer vote: boolean voteable_id: integer voteable_type: string voter_id: integ
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this q
无法读取未定义的属性“分数”这是一个使用极小极大算法的井字游戏。这是我整个应用程序的笔。 https://codepen.io/MartinaMF/pen/LjNdNN $(document)
我有一个引用字典“dictA”,我需要将它(计算键和 vules 之间的相似度)与当场生成的 n 个字典进行比较。每个字典的长度相同。假设为了便于讨论,要与之比较的词典数量为 3:dictB、dict
1、计算F1-Score 对于二分类来说,假设batch size 大小为64的话,那么模型一个batch的输出应该是torch.size([64,2]),所以首先做的是得到这个二维矩阵的每一行的
我是一名优秀的程序员,十分优秀!