Понимание того, почему два вектора TF-IDF похожи - PullRequest
0 голосов
/ 27 октября 2018

Мне нужны отзывы о подходе к пониманию результатов векторов TF-IDF и, возможно, альтернативных подходах.

Прямо сейчас у меня есть два корпуса текста. Цель состоит в том, чтобы найти, какие документы в каждом корпусе наиболее похожи.

Когда я нахожу совпадение, которое интересует, я хочу знать почему, поэтому я реализовал простую функцию под названием why_match(), но я хотел бы помочь узнать, является ли это правильным подходом.

Работает так:

def why_match(doc_vector_a, doc_vector_b, sklearn_tfidfvectorizer):
    distance = abs(doc_vector_a - doc_vector_b)
    nearest_words = np.array((distance != 0) & (distance < 0.0015))
    vocab = np.array(vectorizer.get_feature_names())
    keywords = vocab[nearest_words]
    return keywords

Идея должна заключаться в том, чтобы возвращать все ключевые слова, которые ближе, чем некоторый порог (0,0015), а не 0 (скорее всего, потому что слово отсутствует ни в одном документе).

Это правильный способ «объяснить» близость в TF-IDF? Мои результаты достойные, но, кажется, они придают большое значение очень общим словам, что, к сожалению, очень полезно для моей задачи.

1 Ответ

0 голосов
/ 30 января 2019

Это, безусловно, один из способов объяснить векторное сходство.Ваш подход вычисляет манхэттенское расстояние (или L1-расстояние) между двумя векторами TF-IDF.Так же, как евклидово расстояние (или расстояние L2), манхэттенское расстояние чрезмерно зависит от «больших» значений в одном из векторов.Поэтому более общий подход состоит в том, чтобы измерить угол между двумя векторами, используя косинусное сходство.

Минимальный пример использования косинусного подобия будет следующим:

from scipy.spatial.distance import cosine

sim = 1 - cosine(doc_vector_a, doc_vector_b)

1 - cosine(...) необходим, потому что функция scipy возвращает расстояние , а не сходство .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...