2011-08-27 91 views
4

我在使用Python的Web应用程序中实现tf-idf算法,但运行速度非常慢。我基本上做的是:Python和tfidf算法,让它更快?

1)创建2点字典:

  • 第一部字典:关键(文档ID),值的所有找到的单词(包括重复(名单)在DOC)
  • 二字典;键(文档ID),值(设置包含文档的唯一字)

现在,有一个用户获得文档d的tfidf结果的请愿书。我要做的就是:

2)循环在第二字典文件d唯一字,并为每个独特的单词w得到:

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

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

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

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

+0

你应该对它进行配置以确保在哪里花费时间。然后将这部分代码作为一个小型自包含工作示例发布。 –

+1

我们不是心灵的;除非您发布了代码,否则我们无法告诉您代码有什么问题。 –

+0

@ Tom谢谢,我已经知道哪个是最耗时的部分 –

回答

5

那么,你不得不重新思考和重新设计,不知为何,你把你的数据,或者换句话说,实现您的“倒排索引”的“正统”版本的方式。

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

你唯一需要的结构是一个嵌套的字典一样,

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

正确更新每次你“喂”你的文集的时间。

和当然,保持地方你语料库基数...

由于我工作的一种爱好和部分,我实现一个python - Redis的支持小型搜索引擎。你也可以得到一些其他的想法。看看here

+0

感谢您的回复!那个结构看起来不错,会试试看! –

+0

它工作!我建立了一个服务器,用于填写您告诉我的字典结构的初始处理,然后回复客户请求。我几乎可以实时获得结果!谢谢!!! –

3

这是一个学术活动还是你在做生产?如果您正在实施生产,为什么不使用已有的产品(即http://code.google.com/p/tfidf/)?另一方面,如果你将其作为学术练习来做,我仍然可以在现有的实现中采取不同的行为,以查看他们做了什么不同(如果有的话)。

我也建议使用cProfile来查看您的代码,看看费用在哪里。

+0

感谢您的回复,我想这可以被视为一个学术项目。我已经发现最耗时的部分是df计算。 –