我有一个有文本列的数据框。我将根据另一列中的值将数据帧分为两部分。其中一部分被编入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多处理。如何使这些功能更有效?是否可以将部分/所有函数矢量化?你知道吗
您的代码的意图和操作非常不清楚。假设它起作用,解释最终目标,并在问题中显示更多示例数据、更多示例查询和所需结果可能会有所帮助。你知道吗
或许可以改进一下,不必一次又一次地重复某些操作。一些想法可以包括:
doc2bow()
一次,并缓存BOW表示searchAll()
内调用sims(search[row])
两次(不过,一般来说,高效的文本关键字搜索通常使用专门的反向索引来提高效率,以避免对每个文档进行代价高昂的迭代。)
相关问题 更多 >
编程相关推荐