Python和tfidf算法,让它更快?

D T*_*D T 5 python dictionary tf-idf

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

1)创建2个词典:

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

现在,有一个用户请求获得文档d的tfidf结果.我所做的是:

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

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

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

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

还有其他方法可以让步骤2.2更快吗?词典迭代速度慢吗?

hym*_*oth 5

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

您的瓶颈是术语文档频率(DF)的"即时"计算.这是一个动态的聪明主意,所以每次更新语料库(文档集合)时,都要对文档中的每个术语进行一些处理和更新DF(当然,要以持久的方式保存结果) ,又名数据库等.).

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

{ "term1" : { "DF" : x, "some_doc_id" : tf , "some_other_doc_id" : tf, etc  } ,
  "term2" : ...
  etc..
}
Run Code Online (Sandbox Code Playgroud)

每次"喂"你的语料库时都会正确更新.

当然,保留你的语料库基数...

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