我在 IR 工作。
任何人都可以指导我,我该如何实现语言模型Whoosh
。
我已经应用了TD-IDF和BM25。我是红外新手。
例如,最简单形式的语言模型只是丢弃所有条件上下文,并独立估计每个术语。这样的模型称为一元语言模型:
P_{uni}(t_1t_2t_3t_4) = P(t_1)P(t_2)P(t_3)P(t_4)
有许多更复杂的语言模型,例如二元语言模型,它以前一项为条件,
P_{bi}(t_1t_2t_3t_4) = P(t_1)P(t_2\vert t_1)P(t_3\vert t_2)P(t_4\vert t_3)
看一眼Whoosh的评分模块 https://github.com/whoosh-community/whoosh/blob/master/src/whoosh/scoring.py并使用 BM25F(第 276 至 332 行)作为构建您自己的加权和评分模型的参考。您需要创建一个加权模型和一个评分器。假设你想调用你的模型Unigram
,主要步骤是:
-
实施你自己的Unigram
加权模型类并继承自scoring.WeightingModel
:
class Unigram(WeightingModel)
实现基类所需的方法,主要是scorer()
,它返回对您的引用Scorer
类(下一个)。当你创建你的类时会调用这个类searcher
并定义搜索者将使用的加权模型。
-
实施一个UnigramScorer
类并继承自scoring.WeightLengthScorer
:
class UnigramScorer(WeightLengthScorer)
实施__init__
and _score
方法。__init__
获取字段名称和值,并在调用时为查询中的每个术语调用一次searcher.search()
.
_score
为结果中的每个匹配文档调用。这需要一个weight
and length
并返回给定字段的分数。
-
当您在搜索时创建搜索器时,请使用weighting
范围:
ix.searcher(weighting = Unigram)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)