我在IR工作。
任何人都可以指导我,我怎样才能在嗖嗖声中实现语言模式。我已经申请了TD-IDF和BM25。我是IR新手。
例如,最简单的语言模型只会抛弃所有条件上下文,并独立估计每个术语。这种模型称为unigram语言模型:
P_{uni}(t_1t_2t_3t_4) = P(t_1)P(t_2)P(t_3)P(t_4)
有许多更复杂的语言模型,例如bigram语言模型,它们在前一个术语中是有条件的,
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's scoring module并使用BM25F(第276至332行)作为建立自己的加权和得分模型的参考。您需要创建加权模型和记分器。假设你要打电话给你的模型Unigram
,主要步骤是:
Unigram
加权模型类并继承自scoring.WeightingModel
:
class Unigram(WeightingModel)
实现基类所需的方法,主要的是scorer()
,它返回对Scorer
类的引用(下一个)。创建searcher
时会调用此类,并定义搜索器将使用的加权模型。UnigramScorer
类并继承自scoring.WeightLengthScorer
:
class UnigramScorer(WeightLengthScorer)
实现__init__
和_score
方法。 __init__
获取字段名称和值,并在调用searcher.search()
时为查询中的每个术语调用一次。在结果中为每个匹配的文档调用_score
。它需要一个weight
和length
并返回给定字段的分数。weighting
参数指定自定义语言模型:
ix.searcher(weighting = Unigram)