Рассчитать косинусное сходство релевантности документа - PullRequest
0 голосов
/ 25 сентября 2019

Я выбрал нормализованный TF-IDF, а также ключевое слово RDD и теперь хочу вычислить косинусное сходство, чтобы найти показатель релевантности для документа.

Поэтому я попытался использовать

    documentRdd = sc.textFile("documents.txt").flatMap(lambda l: re.split(r'[^\w]+',l))
    keyWords = sc.textFile("keywords.txt").flatMap(lambda l: re.split(r'[^\w]+',l))
    normalizer1 = Normalizer()
    hashingTF = HashingTF()
    tf = hashingTF.transform(documentRdd)
    tf.cache()
    idf = IDF().fit(tf)
    tfidf = idf.transform(tf)
    normalizedtfidf=normalizer1.transform(tfidf)

Теперь я хотел вычислить косинусное сходство между normalizedtfidf и keyWords.So, я попытался использовать

x = Vectors.dense(normalizedtfidf)
y = Vectors.dense(keywordTF)
print(1 - x.dot(y)/(x.norm(2)*y.norm(2)) , "is the releavance score")

Но это выдает ошибку как

TypeError: float ()должен быть строкой или числом

Это означает, что я передаю неверный формат. Любая помощь приветствуется.

Обновление

Iзатем попытался

    x = Vectors.sparse(normalizedtfidf.count(),normalizedtfidf.collect())
    y = Vectors.sparse(keywordTF.count(),keywordTF.collect())

, но получил

TypeError: Невозможно обработать тип как вектор

как ошибку.

1 Ответ

1 голос
/ 25 сентября 2019

Вы получили ошибки, потому что пытаетесь принудительно преобразовать СДР в Векторы.

Вы можете достичь того, что вам нужно, не выполняя преобразование, выполнив следующие шаги:

  1. Присоединитьсяоба ваших RDD в один RDD.Обратите внимание, что я предполагаю, что у вас нет уникального индекса в обоих СДР для присоединения.
# Adding index to both RDDs by row.
rdd1 = normalizedtfidf.zipWithIndex().map(lambda arg : (arg[1], arg[0]))
rdd2 = keywordTF.zipWithIndex().map(lambda arg : (arg[1], arg[0]))

# Join both RDDs.
rdd_joined = rdd1.join(rdd2)
map СДР с функцией вычисления косинусного расстояния.
def cosine_dist(row):
    x = row[1][0]
    y = row[1][1]
    return (1 - x.dot(y)/(x.norm(2)*y.norm(2)))

res = rdd_joined.map(cosine_dist)

Затем вы можете использовать свои результаты или запустить collect, чтобы просмотреть их.

...