Применение LSA к матрице документов терминов, когда количество документов очень мало

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

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

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

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

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

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


person Parth Tamane    schedule 12.04.2020    source источник
comment
Было бы очень полезно, если бы вы предоставили некоторые образцы данных и код для создания матрицы документа терминов. Тогда можно было бы воспроизвести ваш подход и помочь вам лучше.   -  person SidharthMacherla    schedule 13.04.2020


Ответы (1)


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


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

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)
person SidharthMacherla    schedule 12.04.2020