2015-06-02 3 views
1

В настоящее время я пытаюсь реализовать LSA с Sklearn, чтобы найти синонимы в нескольких документах. Вот мой код:Python LSA с Sklearn

#import the essential tools for lsa 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.feature_extraction.text import TfidfTransformer 
from sklearn.decomposition import TruncatedSVD 
from sklearn.metrics.pairwise import cosine_similarity 
#other imports 
from os import listdir 

#load data 
datafolder = 'data/' 
filenames = [] 
for file in listdir(datafolder): 
    if file.endswith(".txt"): 
     filenames.append(datafolder+file) 

#Document-Term Matrix 
cv = CountVectorizer(input='filename',strip_accents='ascii') 
dtMatrix = cv.fit_transform(filenames).toarray() 
print dtMatrix.shape 
featurenames = cv.get_feature_names() 
print featurenames 

#Tf-idf Transformation 
tfidf = TfidfTransformer() 
tfidfMatrix = tfidf.fit_transform(dtMatrix).toarray() 
print tfidfMatrix.shape 

#SVD 
#n_components is recommended to be 100 by Sklearn Documentation for LSA 
#http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html 
svd = TruncatedSVD(n_components = 100) 
svdMatrix = svd.fit_transform(tfidfMatrix) 

print svdMatrix 

#Cosine-Similarity 
#cosine = cosine_similarity(svdMatrix[1], svdMatrix) 

Теперь вот моя проблема: формы Term-ДОКУМЕНТ Матрицы и тс-IDF матрицы одинаковы, что (27,3099). 27 документов и 3099 слов. После разложения единственного значения форма матрицы равна (27,27). Я знаю, что вы можете рассчитать косинус-подобие из 2-х строк, чтобы получить сходство, но я не думаю, что могу получить сходство двух слов в моих документах, сделав это с помощью SVD-матрицы.

Может ли кто-нибудь объяснить мне, что представляет собой SVD-матрица и в каком случае я могу использовать это, чтобы найти синонимы в моих документах?

Заранее спасибо.

ответ

1

SVD - это инструмент уменьшения размерности, что означает, что он уменьшает порядок (количество) ваших функций до более representative.

Из исходного кода на GitHub:

def fit_transform(self, X, y=None): 
    """Fit LSI model to X and perform dimensionality reduction on X. 
    Parameters 
    ---------- 
    X : {array-like, sparse matrix}, shape (n_samples, n_features) 
     Training data. 
    Returns 
    ------- 
    X_new : array, shape (n_samples, n_components) 
     Reduced version of X. This will always be a dense array. 
    """ 

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

Here также дает простой пример LSA через SVD.

+0

поэтому он удаляет/уменьшает количество слов, которые не имеют высокой корреляции? в этом примере я не вижу уменьшения размеров, но в моем примере это делает это – Schweigerama

+0

Можно сказать, что это уменьшает количество «функций» или «градусов», которые могут высоко представлять ваши данные обучения. Эти приведенные функции не могут быть представлены никакими конкретными словами, и поэтому модель является «скрытой». –

+0

Хорошо, спасибо за вашу помощь. Я понял. – Schweigerama

Смежные вопросы