TF*IDF за заявки за търсене

Добре, следя тези две публикации в TF*IDF, но съм малко объркан: http://css.dzone.com/articles/machine-learning-text-feature

По принцип искам да създам заявка за търсене, която съдържа търсения в множество документи. Бих искал да използвам инструментариума scikit-learn, както и библиотеката NLTK за Python

Проблемът е, че не виждам откъде идват двата TF*IDF вектора. Имам нужда от една заявка за търсене и множество документи за търсене. Реших, че изчислявам TF*IDF резултатите на всеки документ спрямо всяка заявка и намирам косинусното сходство между тях и след това ги класирам, като сортирам резултатите в низходящ ред. Обаче кодът изглежда не предлага правилните вектори.

Всеки път, когато намаля заявката само до едно търсене, тя връща огромен списък от 0, което е наистина странно.

Ето кода:

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. Опитвам се да внедря заявка за търсене за Wikipedia, но в момента има файл simpletfidf.py, който трябва да е това, което търсите.   -  person tabchas    schedule 25.08.2012
comment
Благодаря, определено ще го разгледам, защото всъщност създавам документи въз основа на някакво търсене в Google, така че все още имам няколко въпроса. Но ето какво направих въз основа на вашия първоначален код: дадох кредит на първия ви отговор с връзка stackoverflow.com/questions/12118720/   -  person add-semi-colons    schedule 25.08.2012
comment
О, страхотно... може би можем да си сътрудничим по подобен проект! Може би можем да чатим в Skype? Потребителско име: robomanager   -  person tabchas    schedule 25.08.2012
comment
да, определено имам, работил съм с данни от wikipedia преди, така че определено. Ще видя дали вашето изпълнение и моето дават същия отговор.   -  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