提高Python Gensim搜索函数的效率

2024-04-27 02:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有文本列的数据框。我将根据另一列中的值将数据帧分为两部分。其中一部分被编入gensim相似模型。然后将另一部分输入到模型中,以找到最相似的索引文本。这涉及到两个搜索函数来枚举索引部分中的每个项。对于玩具数据,速度很快,但是对于我的真实数据,使用apply太慢了。下面是代码示例:

import pandas as pd
import gensim
import nltk
from nltk.tokenize import word_tokenize
nltk.download('punkt')

d = {'number': [1,2,3,4,5], 'text': ['do you like python', 'do you hate python','do you like apples','who is nelson mandela','i am not interested'], 'answer':['no','yes','no','no','yes']}
df = pd.DataFrame(data=d)

df_yes = df[df['answer']=='yes']

df_no = df[df['answer']=='no']
df_no = df_no.reset_index()

docs = df_no['text'].tolist()
genDocs = [[w.lower() for w in word_tokenize(text)] for text in docs]
dictionary = gensim.corpora.Dictionary(genDocs)
corpus = [dictionary.doc2bow(genDoc) for genDoc in genDocs]
tfidf = gensim.models.TfidfModel(corpus)
sims = gensim.similarities.MatrixSimilarity(tfidf[corpus], num_features=len(dictionary))

def search(row):
    query = [w.lower() for w in word_tokenize(row)]
    query_bag_of_words = dictionary.doc2bow(query)
    query_tfidf = tfidf[query_bag_of_words]
    return query_tfidf

def searchAll(row):
    max_similarity = max(sims[search(row)])
    index = [i for i, j in enumerate(sims[search(row)]) if j == max_similarity]
    return max_similarity, index

df_yes = df_yes.copy()

df_yes['max_similarity'], df_yes['index'] = zip(*df_yes['text'].apply(searchAll))

我尝试过将操作转换为dask数据帧,但没有效果,还尝试过python多处理。如何使这些功能更有效?是否可以将部分/所有函数矢量化?你知道吗


Tags: 数据notextinimportdfforindex
1条回答
网友
1楼 · 发布于 2024-04-27 02:27:13

您的代码的意图和操作非常不清楚。假设它起作用,解释最终目标,并在问题中显示更多示例数据、更多示例查询和所需结果可能会有所帮助。你知道吗

或许可以改进一下,不必一次又一次地重复某些操作。一些想法可以包括:

  • 每行只标记一次,并缓存标记化
  • 每行只doc2bow()一次,并缓存BOW表示
  • 不要在searchAll()内调用sims(search[row])两次
  • 不要迭代两次—一次找到最大值,然后再次找到索引—只迭代一次

(不过,一般来说,高效的文本关键字搜索通常使用专门的反向索引来提高效率,以避免对每个文档进行代价高昂的迭代。)

相关问题 更多 >