我正在使用Python在Web应用程序中实现tf-idf算法,但是它运行非常慢。我基本上要做的是:
1)创建2个字典:
现在,有用户请愿以获得文档d的tfidf结果。我要做的是:
2)为文档d遍历第二个词典的唯一词,对于每个唯一词w,得到:
2.1)tf得分(w在d中出现多少次:在文档的第一个词典的单词列表中循环)
2.2)df得分(有多少文档包含w:遍历所有文档的单词集(第二个字典),并检查是否包含w)。我使用的是集合,因为与列表相比,检查集合中是否包含单词似乎更快。
步骤2.2非常慢。例如,具有1000个文档,并且对于具有2313个唯一单词的文档,输出结果大约需要5分钟。
还有其他方法可以使步骤2.2更快吗?字典的迭代速度是否很慢?
最佳答案
嗯,您必须以某种方式重新考虑和重新设计保存数据的方式,或者换句话说,实现“反向索引”的“正统”版本。
您的瓶颈在于对这些术语的文档频率(DF)进行“即时”计算。使其具有动态性将是一个聪明的主意,因此,每次更新语料库(文档集合)时,都要对文档中每个术语的处理和更新DF(当然,还要以持久的方式保存结果) ,又名数据库等。)。
您唯一需要的结构是像这样的嵌套字典
{ "term1" : { "DF" : x, "some_doc_id" : tf , "some_other_doc_id" : tf, etc } ,
"term2" : ...
etc..
}
每次“喂食”您的语料库时都会正确更新。
当然,请将您的语料库基数保持在某处...
作为业余爱好和工作的一部分,我正在实现一个由python-Redis支持的小型搜索引擎。您可能还会得到其他一些想法。看看here。
关于Python和tfidf算法,使其更快吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7215850/