Я нашел альтернативное решение для выполнения вышеуказанной задачи в масштабе, используя gensim.вот мой рабочий код:
from gensim.corpora import Dictionary
from gensim.models import TfidfModel, LsiModel
from gensim.similarities import Similarity
from gensim.test.utils import get_tmpfile
import sys
import time, traceback
def cossim(documents, query_docs=None, task='pairwise_similarity', metric_threshold=0.85, num_best=20, **kwargs):
try:
dictionary = Dictionary(documents)
tfidf = TfidfModel(dictionary=dictionary)
corpus = [dictionary.doc2bow(doc) for doc in documents]
features_rep='bow'
if len(dictionary) > 1000 and len(dictionary) <=2000:
corpus = [tfidf[doc] for doc in corpus]
features_rep='tfidf'
elif len(dictionary) > 2000:
model = LsiModel(corpus, id2word=dictionary, num_topics=200)
corpus = [model[tfidf[doc]] for doc in corpus]
features_rep = 'lsi'
index_tmpfile = get_tmpfile("index")
index = Similarity(output_prefix=index_tmpfile, corpus=corpus, num_best=num_best, num_features=len(dictionary),
chunksize=256)
similarities = []
if task == 'pairwise_similarity':
start_time = time.time()
for sim in index:
similarities.append(sim)
elif task == 'batch_query':
start_time = time.time()
query_docs_features = [dictionary.doc2bow(doc) for doc in query_docs]
if features_rep=='tfidf':
query_docs_features = [tfidf[doc] for doc in query_docs_features]
elif features_rep=='lsi':
query_docs_features = [model[tfidf[doc]] for doc in query_docs_features]
for sim in index[query_docs_features]:
similarities.append(sim)
filtered_results = []
for ind_sim in similarities:
filtered_results.append([item[0] for item in ind_sim if item[1] >= metric_threshold])
if query_docs is not None:
matched_docs, unmatched_docs, matching_stats = stats(documents, query_docs, filtered_results)
return matched_docs, unmatched_docs
else:
return filtered_results
except Exception:
logging.error(
"Exception has occurred while performing Cosine Similarity. {}".format(traceback.format_exc()))