use*_*024 5 python algorithm tf-idf feature-selection cosine-similarity
我正在处理十万(100,000)份文件(平均文件长度约为 500 个术语)。对于每个文档,我想通过余弦相似度获得前 k 个(例如 k = 5)个相似文档。那么如何通过Python有效地做到这一点。
这是我所做的:
我在 i5-2.5GHz 上运行我的代码,12 小时过去了,但它仍然有效。所以我想知道如何优化我的代码或程序。
这是我的想法:
那么,你有什么好主意吗?
非常感谢。
我知道有一个类似的问题,但这不是我想要的。
感谢 @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
Run Code Online (Sandbox Code Playgroud)
因此,瓶颈是向 Pandas 添加新的行和列。任何的想法?
Pandas DataFrames(以及底层的 numpy)只有在一次分配数据数组时才会真正快。set_value需要调用矩阵中的每个单元格!你可以这样做dt_matrix = pd.DataFrame(cleaned_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)
Run Code Online (Sandbox Code Playgroud)
这应该快几个数量级。
如果您要求 NaN 单元格为零,您可以执行 a dt_matrix.fillna(0)(再次一次调用,而不是可能的 n * m)。
| 归档时间: |
|
| 查看次数: |
2005 次 |
| 最近记录: |