Я пытаюсь запустить подобие gensim WMD быстрее. Как правило, это то, что есть в документации: Пример корпуса:
my_corpus = ["Human machine interface for lab abc computer applications",
>>> "A survey of user opinion of computer system response time",
>>> "The EPS user interface management system",
>>> "System and human system engineering testing of EPS",
>>> "Relation of user perceived response time to error measurement",
>>> "The generation of random binary unordered trees",
>>> "The intersection graph of paths in trees",
>>> "Graph minors IV Widths of trees and well quasi ordering",
>>> "Graph minors A survey"]
my_query = 'Human and artificial intelligence software programs'
my_tokenized_query =['human','artificial','intelligence','software','programs']
model = a trained word2Vec model on about 100,000 documents similar to my_corpus.
model = Word2Vec.load(word2vec_model)
from gensim import Word2Vec
from gensim.similarities import WmdSimilarity
def init_instance(my_corpus,model,num_best):
instance = WmdSimilarity(my_corpus, model,num_best = 1)
return instance
instance[my_tokenized_query]
наиболее подходящий документ — "Human machine interface for lab abc computer applications"
, и это здорово.
Однако функция instance
выше занимает очень много времени. Поэтому я подумал о том, чтобы разбить корпус на N
частей, а затем выполнить WMD
для каждой с num_best = 1
, тогда в конце часть с максимальной оценкой будет наиболее похожей.
from multiprocessing import Process, Queue ,Manager
def main( my_query,global_jobs,process_tmp):
process_query = gensim.utils.simple_preprocess(my_query)
def worker(num,process_query,return_dict):
instance=init_instance\
(my_corpus[num*chunk+1:num*chunk+chunk], model,1)
x = instance[process_query][0][0]
y = instance[process_query][0][1]
return_dict[x] = y
manager = Manager()
return_dict = manager.dict()
for num in range(num_workers):
process_tmp = Process(target=worker, args=(num,process_query,return_dict))
global_jobs.append(process_tmp)
process_tmp.start()
for proc in global_jobs:
proc.join()
return_dict = dict(return_dict)
ind = max(return_dict.iteritems(), key=operator.itemgetter(1))[0]
print corpus[ind]
>>> "Graph minors A survey"
Проблема, с которой я столкнулся, заключается в том, что, несмотря на то, что он что-то выводит, он не дает мне хороший похожий запрос из моего корпуса, даже если он получает максимальное сходство всех частей.
Я делаю что-то неправильно?
my_query, my_corpus, model, my_tokenized_query
. - person stovfl   schedule 19.05.2017