TF * IDF для поисковых запросов

Хорошо, я слежу за этими двумя сообщениями на TF * IDF, но немного запутался: http://css.dzone.com/articles/machine-learning-text-feature.

По сути, я хочу создать поисковый запрос, содержащий поиск по нескольким документам. Я хотел бы использовать инструментарий scikit-learn, а также библиотеку NLTK для Python.

Проблема в том, что я не вижу, откуда берутся два вектора TF * IDF. Мне нужен один поисковый запрос и несколько документов для поиска. Я решил, что вычисляю оценки TF * IDF каждого документа по каждому запросу и нахожу косинусное сходство между ними, а затем ранжирую их, сортируя оценки в порядке убывания. Однако код, похоже, не дает правильных векторов.

Всякий раз, когда я сокращаю запрос до одного поиска, он возвращает огромный список нулей, что действительно странно.

Вот код:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from nltk.corpus import stopwords

train_set = ("The sky is blue.", "The sun is bright.") #Documents
test_set = ("The sun in the sky is bright.") #Query
stopWords = stopwords.words('english')

vectorizer = CountVectorizer(stop_words = stopWords)
transformer = TfidfTransformer()

trainVectorizerArray = vectorizer.fit_transform(train_set).toarray()
testVectorizerArray = vectorizer.transform(test_set).toarray()
print 'Fit Vectorizer to train set', trainVectorizerArray
print 'Transform Vectorizer to test set', testVectorizerArray

transformer.fit(trainVectorizerArray)
print transformer.transform(trainVectorizerArray).toarray()

transformer.fit(testVectorizerArray)

tfidf = transformer.transform(testVectorizerArray)
print tfidf.todense()

person tabchas    schedule 11.08.2012    source источник
comment
Мне было интересно, вычислили ли вы косинус, используя окончательную матрицу, которую вы получаете из print tfidf.todense (), если да, то как вы это делаете?   -  person add-semi-colons    schedule 25.08.2012
comment
Эй, секундочка ... Скоро выложу пример.   -  person tabchas    schedule 25.08.2012
comment
Спасибо, это было бы здорово. Вы бы разместили здесь ссылку ..? Это даже лучше.   -  person add-semi-colons    schedule 25.08.2012
comment
На моей странице GitHub здесь: github.com/tabchas - код находится в разделе Disco-Search-Query. Я пытаюсь реализовать поисковый запрос для Википедии, но сейчас есть файл simpletfidf.py, который должен быть тем, что вы ищете.   -  person tabchas    schedule 25.08.2012
comment
Спасибо, я обязательно посмотрю на него, потому что на самом деле я создаю документы на основе некоторого поиска в Google, поэтому у меня все еще есть несколько вопросов. Но вот что я сделал на основе вашего первоначального кода: я отдал должное вашему первому ответу со ссылкой stackoverflow.com/questions/12118720/   -  person add-semi-colons    schedule 25.08.2012
comment
Ой, круто ... может быть, мы сможем сотрудничать в подобном проекте! Может, поговорим по скайпу? Имя пользователя: robomanager   -  person tabchas    schedule 25.08.2012
comment
да, определенно, я работал с данными Википедии раньше, так определенно. Я собираюсь посмотреть, дадут ли ваша реализация и моя одинаковый ответ.   -  person add-semi-colons    schedule 25.08.2012
comment
давайте продолжим обсуждение в чате   -  person tabchas    schedule 25.08.2012


Ответы (1)


Вы определяете train_set и test_set как кортежи, но я думаю, что они должны быть списками:

train_set = ["The sky is blue.", "The sun is bright."] #Documents
test_set = ["The sun in the sky is bright."] #Query

Используя это, код, кажется, работает нормально.

person Sicco    schedule 11.08.2012
comment
Потрясающие. Спасибо за совет. По какой-либо причине, почему это не работает с кортежами? - person tabchas; 12.08.2012
comment
Он закодирован так, чтобы на вход входили списки :). Эти списки внутренне преобразуются в массивы NumPy (вы также можете напрямую передать массив NumPy). - person Sicco; 12.08.2012