Применение LSA к матрице срочных документов, когда количество документов очень мало - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть матрица терм-документа (X) формы (6, 25931). Первые 5 документов - мои исходные документы, а последний документ - мой целевой документ. Столбец представляет количество различных слов в наборе слов. Я хочу получить косинусное сходство последнего документа с каждым другим документом.

Но поскольку SVD производит S размером (min(6, 25931),), если я использовал S для уменьшения моего X, я получаю матрицу 6 * 6. Но в этом случае я чувствую, что потеряю слишком много информации, поскольку уменьшаю вектор с размером (25931,) до (6,).

И когда вы думаете об этом, обычно количество документов всегда будет меньше, чем словарные слова. В этом случае использование SVD для уменьшения размерности всегда будет давать векторы размером (no documents,).

Согласно всему, что я прочитал, когда SVD используется таким образом в матрице терминологического документа, это называется LSA.

  1. Правильно ли я внедряю LSA?
  2. Если это правильно, то есть ли другой способ уменьшить размерность и получить более плотные векторы, где размер сжатого вектора больше (6,)?

PS: Я также попытался использовать fit_transform из sklearn.decomposition.TruncatedSVD, который ожидает, что вектор будет иметь форму (n_samples, n_components), поэтому форма моей матрицы терм-документа равна (6, 25931), а не (25931, 6). Я продолжал получать матрицу (6, 6), которая изначально смутила меня. Но теперь это имеет смысл после того, как я вспомнил математику за SVD.

1 Ответ

0 голосов
/ 13 апреля 2020

Если цель упражнения - найти сходство по косинусу, тогда может помочь следующий подход. Автор только пытается решить для цели и не комментировать определение Скрытый Семанти c Анализ или определение Разложение единственного значения , упомянутое спрашивающим.


Давайте сначала вызовем все необходимые библиотеки. Пожалуйста, установите их, если они не существуют в машине.

from sklearn.metrics.pairwise import cosine_similarity
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

Давайте сгенерируем пример данных для этого упражнения.

df = {'sentence': ['one two three','two three four','four five','six seven eight nine ten']}
df = pd.DataFrame(df, columns = ['sentence'])

Первый шаг - получить исчерпывающий список всех возможных функций. Так что сопоставьте весь контент в одном месте.

all_content = [' '.join(df['sentence'])]

Давайте создадим векторизатор и подгоним его сейчас. Обратите внимание, что аргументы в векторизаторе не объяснены автором, поскольку основное внимание уделяется решению проблемы.

vectorizer = TfidfVectorizer(encoding = 'latin-1',norm = 'l2', min_df = 0.03, ngram_range = (1,2), max_features = 5000)
vectorizer.fit(all_content)

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

print(vectorizer.vocabulary_)

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

s1Tokens =  vectorizer.transform(df.iloc[1,])
s2Tokens = vectorizer.transform(df.iloc[2,])

Наконец, косинус подобия можно вычислить следующим образом.

cosine_similarity(s1Tokens , s2Tokens)
...