У меня есть несколько документов, и моя цель - вычислить косинусное сходство для каждой пары документов.Вес, который я хочу использовать для слов каждого документа, не является знаменитой функцией TF-IDF.Итак, на первом шаге я рассчитал вес слова для каждого документа.В указанном ниже формате, сохраненном в СДР:
(u'hats', 2, 2, '1008044170823364608,1008043547541626881', 6.0)
, он показывает (слово, TF, DF, идентификаторы документа, содержащие слово, вес), соответственно.На втором шаге я хочу создать Вектор слов для каждого документа с соответствующими весами.Итак, сначала я попробовал следующий способ создать вектор всех слов в документах и объявить его как переменную широковещания:
def tokenizeForVector(row):
res = []
words = word_tokenize(row)
for word in words:
if word not in stop_words and word not in res:
res.append((word))
return res
Vector_of_Words = selected_data.select('text').rdd\
.map(lambda x : x[0].encode("ascii", "ignore"))\
.flatMap(lambda row : tokenizeForVector(row))
Vector_of_Words_Broadcast = sc.broadcast(Vector_of_Words.collect())
Но я обнаружил, что он содержит повторяющиеся слова, и это потому, что Spark применяет описанный выше процесс к каждомуразделы данных, и это может быть одним словом, включенным в более чем один раздел.Можно ли сгенерировать вектор слов с помощью PySpark?
Примечание: я пробовал word2vec
:
Vector_of_Words = selected_data.select('text').rdd\
.map(lambda x : word_tokenize(x[0]))
print(Vector_of_Words.first())
word2vec = Word2Vec()
model = word2vec.fit(Vector_of_Words)
print model.getVectors().keys()
, но я не знаю, рассчитывает ли он только векторслова.Я предполагаю, что это создает модель и не является хорошим выбором для моего случая.