我在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)
答案 0 :(得分:1)
看看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)