如何使用python通过余弦相似性有效地检索顶级K-like文档?
我正在处理十万(100,000)份文件(平均文件长度约为500个术语).对于每个文档,我想通过余弦相似性得到前k(例如k = 5)个相似文档.那么如何通过
Python有效地做到这一点.
这是我做的: >为每个文档,进行文本分割,删除停用词,计算术语频率(tf) 我在i5-2.5GHz运行我的代码,12小时过去但它仍然有效.所以我想知道如何优化我的代码或过程. 这是我的想法: >对于每个文档,进行特征选择,只保留其tf>的术语. 1 那么,你有什么好主意吗? 非常感谢. 我知道有一个similar question,但那不是我想要的. UPDATE1 感谢@orange,经过剖析,我发现第2步是瓶颈!以下是示例代码: def construct_dt_matrix(): dt_matrix = pd.DataFrame(columns=['docid']) docid = 0 for f in files: # text segmentation for f # remove stop words # word count store in cleaned_dict = {'word': tf} dt_matrix.loc[docid] = [0] * dt_matrix.shape[1] # add one row,init all 0 dt_matrix.set_value(docid,'docid',docid) for key,value in cleaned_dict.items(): if key not in dt_matrix.columns.values: dt_matrix[key] = 0 # add one column,init all 0 dt_matrix.set_value(docid,key,value) # bottleneck docid += 1 因此,瓶颈是向pandas添加新的行和列.任何的想法? 解决方法
如果您一次分配数据数组,Pandas DataFrames(以及底层numpy)的速度非常快. set_value需要调用矩阵中的每个单元格!
您可以执行dt_matrix = pd.DataFrame(cleaning_dict),并且您有一个带有一个函数调用的DataFrame(忽略Pandas内部调用). 尝试改为: dt_matrix = pd.DataFrame() for docid,f in enumerate(files): dt_matrix_file = pd.DataFrame(cleaned_dict) dt_matrix_file['docid'] = docid dt_matrix = dt_matrix.append(dt_matrix_file) 这应该快几个数量级. 如果您需要NaN单元格为零,则可以执行dt_matrix.fillna(0)(同样,一次调用而不是潜在的n * m). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |