这是基于 python 的文件搜索引擎的基本实现,用于回答本地系统上文本文件中的查询。我们使用“tf-idf术语权重”和“余弦相似度”对匹配文档的相关性进行排名。 tf-idf 计算是预先计算的,使得搜索速度更快。为了加快搜索速度,还使用了词干分析(Porter Stemmer)。提供了使用 Python 的 Tkinter 库的基本用户界面。
python2 createIndex_tfidf.py stopwords.dat testIndex.dat titleIndex.dat
createIndex_tfidf.py 将仅运行一次来计算语料库上的 tdf-idf 值
python2 queryIndex_tfidf.py stopwords.dat testIndex.dat titleIndex.dat
此步骤总共创建了三个不同的文件:
标题索引.dat
该文件存储分配给语料库中每个文档的唯一 docId(文档 ID)。
测试索引.dat
在此创建索引文件(也称为倒排索引数据结构),其中包含所有文档中出现的所有唯一术语(停用词除外)的信息。每个文档都被赋予一个从 0 开始的唯一 ID,存储在 titleIndex 中。数据。有关术语的信息存储在索引文件中,如下所示: term|docID0:pos1,pos2;docID1:pos3,pos4,pos5;…..|tf0,tf1,tf2...|idf 这里 tf0,tf1,tf2分别表示 docID0,docID1,docID2 中术语的词频。 idf 代表逆文档频率,pos1 代表该术语在相应文档中的位置,依此类推。
线.dat
该文件存储有关该术语在各种文档中出现的行的信息。该行信息表示为: term|docID0:line1,line2;docID1:line3,line4,line5
在创建这些文件之前,会在停用词列表中检查文档的所有术语。如果某个术语出现在停用词中,则会跳过该术语,否则其信息将存储在上述文件中。此外,每个术语在添加到索引之前都会由 Porter Stemmer 进行词干提取。
在此,首先,文件lines.dat、titleIndex.dat 和testIndex.dat 中的所有信息再次使用Python 中的字典存储回来。
现在,支持的不同类型的查询是:
单字查询 (OWQ) 这是一个单术语查询,其输出是包含所询问术语的文档列表以及该术语在相应文档中出现的行号。
多词查询 (MWQ) MWQ 中的输入是单词序列,输出是包含任何查询术语以及行号的文档列表。
短语查询(PQ) PQ 中的输入同样是单词序列,匹配文档是按指定顺序包含所有查询术语的文档。
现在我们已经找到了存在查询的文档列表,现在是时候对它们进行排名了。我们这里使用的排名方案基于 tf-idf。 Tf-Idf 是一种加权方案,它根据文档中的每个术语的术语频率 (tf) 和逆文档频率 (idf) 为其分配权重。权重分数较高的术语被认为更重要。它是信息检索中最流行的加权方案之一。
术语的术语频率(tf)是特定于文档的。它基本上是文档 D 中术语 t 出现的次数。选择 tf 作为参数是非常合乎逻辑的,因为术语在文档中出现的次数越多,它就越重要。我们可以用一个大小等于文档编号的向量来表示文档。文档中唯一术语的数量,每个值表示给定文档中术语的计数。将文档表示为公共向量空间中的向量称为向量空间模型,它是信息检索的基础。但这里有一个缺点。随着文档大小的增加,tf 的权重也会随着术语频率的增加而增加。因此,包含与其他文档相同信息且复制多次的文档将被认为更重要。为了消除这个缺点,我们将向量中的每个值除以其范数,使向量成为单位向量。
我们不能仅使用术语频率来计算文档中某个术语的权重,因为 tf 认为所有术语同等重要。然而,有些术语出现的频率较低,而且比其他术语更具歧视性。如果我们纯粹使用 tf 作为排名的衡量标准,那么如果我们搜索像声波这样的主题,我们最终可能会得到很多包含光波和其他波的文档,因为术语的频率是唯一的参数。
为了减轻这种影响,我们使用逆文档频率。术语的文档频率基本上是包含该术语的文档的数量。因此,术语的逆文档频率(idf)是语料库中的文档数量除以术语的文档频率。一般来说,我们发现idf的因子相当大,如果我们使用log(idf)会得到更好的结果。由于 log 是一个递增函数,我们可以使用它而不会影响我们的结果。
我们已经定义了 tf 和 idf,现在我们可以将它们组合起来产生文档 d 中术语 t 的最终分数。我们将再次将文档表示为向量,每个条目都是文档中相应术语的 tf-idf 权重。文档 d 中术语 t 的 tf-idf 权重只是其 tf 与其 idf 的乘积。
现在我们已经根据 tf-idf 权重构建了每个文档的向量。是时候使用给定的文档向量来回答查询了。首先,我们将在与创建文档向量类似的基础上创建一个查询向量本身,即基于 tf-idf 分数(考虑查询文档本身)。现在我们已经准备好了查询向量,我们将找到包含我们的查询的所有文档。现在我们将计算查询向量和查询所在的文档向量的点积。点积越高,查询向量与文档向量越相似,这意味着文档向量和查询向量之间的角度较小。这种查找查询和文档之间相似性的技术称为余弦相似性。