5

我正在使用 Python 在 Web 应用程序中实现tf-idf算法,但是它运行得非常慢。我基本上做的是:

1)创建2个字典:

  • 第一个字典:键(文档ID),值(文档中所有找到的单词(包括重复)的列表)
  • 第二本词典;键(文档 ID),值(包含文档唯一单词的集合)

现在,有一个用户请求获取文档 d 的 tfidf 结果。我要做的是:

2) 遍历文档 d 的第二个字典的唯一词,并且对于每个唯一词 w 得到:

2.1) tf 分数(w 在 d 中出现多少次:循环遍历文档的第一个字典的单词列表)

2.2)df分数(有多少文档包含w:循环所有文档的单词集(第二个字典)并检查是否包含w)。我正在使用集合,因为与列表相比,检查集合是否包含单词似乎更快。

步骤 2.2 非常慢。例如,有 1000 个文档,对于具有 2313 个唯一词的文档,输出结果大约需要 5 分钟。

有没有其他方法可以使步骤 2.2 更快?字典的迭代速度很慢吗?

4

2 回答 2

5

好吧,您必须以某种方式重新思考和重新设计您保存数据的方式,或者换句话说,实现“倒排索引”的“正统”版本。

您的瓶颈是术语的文档频率 (DF) 的“即时”计算。将其设为动态将是一个聪明的主意,因此每次更新语料库(文档集合)时,都要进行一些处理并更新文档中每个术语的 DF(当然,以持久的方式保存结果,又名数据库等。)。

您需要的唯一结构是这样的嵌套字典

{ "term1" : { "DF" : x, "some_doc_id" : tf , "some_other_doc_id" : tf, etc  } ,
  "term2" : ...
  etc..
}

每次您“喂”您的语料库时都会正确更新。

当然,把你的语料库基数放在某个地方......

作为爱好和工作的一部分,我正在实现一个 python - redis 支持的小型搜索引擎。你也可能会得到一些其他的想法。看看这里

于 2011-08-27T17:03:08.417 回答
3

这是学术上的努力还是你是为了生产而做的?如果您正在实施生产,为什么不使用已经可用的东西(即http://code.google.com/p/tfidf/)?另一方面,如果您将其作为一项学术练习,我可能仍然会看看现有的实现,看看他们在做什么不同(如果有的话)。

我还建议使用cProfile来分析您的代码以查看费用在哪里。

于 2011-08-27T16:42:37.673 回答