2014-12-02 2 views
1

У меня есть задача NLP, и я использую scikit-learn. Чтение tutorials, которое я нашел, нужно прорисовать в векторном тексте и как использовать эти модели векторизации для подачи алгоритма классификации. Предположим, что у меня есть некоторый текст, и я хотел бы векторизации его следующим образом:Что означает эта разреженная матрица в scipy?

from sklearn.feature_extraction.text import CountVectorizer 

corpus =['''Computer science is the scientific and 
practical approach to computation and its applications.''' 
#this is another opinion 
'''It is the systematic study of the feasibility, structure, 
expression, and mechanization of the methodical 
procedures that underlie the acquisition, 
representation, processing, storage, communication of, 
and access to information, whether such information is encoded 
as bits in a computer memory or transcribed in genes and 
protein structures in a biological cell.''' 
     #anotherone 
'''A computer scientist specializes in the theory of 
computation and the design of computational systems'''] 

vectorizer = CountVectorizer(analyzer='word') 

X = vectorizer.fit_transform(corpus) 

print X 

Проблема заключается в том, что я не понимаю смысл выхода, я не вижу никакой связи с текстом и матрицей, которая возвращается по векторизатора:

(0, 12) 3 
    (0, 33) 1 
    (0, 20) 3 
    (0, 45) 7 
    (0, 34) 1 
    (0, 2) 6 
    (0, 28) 1 
    (0, 4) 1 
    (0, 47) 2 
    (0, 10) 2 
    (0, 22) 1 
    (0, 3) 1 
    (0, 21) 1 
    (0, 42) 1 
    (0, 40) 1 
    (0, 26) 5 
    (0, 16) 1 
    (0, 38) 1 
    (0, 15) 1 
    (0, 23) 1 
    (0, 25) 1 
    (0, 29) 1 
    (0, 44) 1 
    (0, 49) 1 
    (0, 1) 1 
    : : 
    (0, 30) 1 
    (0, 37) 1 
    (0, 9) 1 
    (0, 0) 1 
    (0, 19) 2 
    (0, 50) 1 
    (0, 41) 1 
    (0, 14) 1 
    (0, 5) 1 
    (0, 7) 1 
    (0, 18) 4 
    (0, 24) 1 
    (0, 27) 1 
    (0, 48) 1 
    (0, 17) 1 
    (0, 31) 1 
    (0, 39) 1 
    (0, 6) 1 
    (0, 8) 1 
    (0, 35) 1 
    (0, 36) 1 
    (0, 46) 1 
    (0, 13) 1 
    (0, 11) 1 
    (0, 43) 1 

Кроме того, я не понимаю, что происходит с выводом, когда я использую toarray() метод:

print X.toarray() 

что именно средство выходная и какое отношение имеет с корпусом ?:

[[1 1 6 1 1 1 1 1 1 1 2 1 3 1 1 1 1 1 4 2 3 1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 1 
    1 1 1 1 1 1 1 1 7 1 2 1 1 1]] 
+0

Возможно, вы захотите прочитать о модели Vector Space в книге Manning & Schuetze: http://nlp.stanford.edu/IR-book/pdf/06vect.pdf – mbatchkarov

ответ

5

CountVectorizer производит матрицу документов. Для простого примера, давайте рассмотрим следующий упрощенный код:

from sklearn.feature_extraction.text import CountVectorizer 

corpus =['''computer hardware''', 
'''computer data and software data'''] 

vectorizer = CountVectorizer(analyzer='word') 

X = vectorizer.fit_transform(corpus) 

print X 

print X.toarray() 

У вас есть два документа, элементы корпуса и пять членов, слова. И вы можете рассчитывать термины в документах следующим образом:

 | and computer data hardware software 
     +------------------------------------- 
doc 0 |   1    1 
doc 1 | 1  1 2     1 

И X представляет вышеуказанную матрицу в ассоциативном порядке, т.е. отображение из (строка, столбец) на частоту терминов и X.toarray() показывает X как список списка. Ниже приведен результат выполнения:

(1, 0) 1 
    (0, 1) 1 
    (1, 1) 1 
    (1, 2) 2 
    (0, 3) 1 
    (1, 4) 1 
[[0 1 0 1 0] 
[1 1 2 0 1]] 

Как отметил @dmcc, вы опустили запятой, которая делает corpus только один документ.

+0

Спасибо за отзыв. Как насчет других векторизаторов, которые scikit-learn имеет? (например, FeatureHasher, Tf-idf и т. д.), эти алгоритмы векторизации возвращают документальную матрицу или возвращаемая матрица зависит от выбранного алгоритма векторизации ?. – tumbleweed

+1

@ml_guy Да, это зависит от векторизаторов и параметров. Пожалуйста, посмотрите [страницу извлечения функций] (http://scikit-learn.org/stable/modules/feature_extraction.html). –

3

Я думаю, что недостающее звено vectorizer.get_feature_names() (docs). Этот метод позволяет отображать счетчики в матрице обратно на исходные слова:

>>> vectorizer.get_feature_names() 
[u'access', u'acquisition', u'and', u'applications', u'approach', u'as', u'biological', u'bits', u'cell', u'communication', u'computation', u'computational', u'computer', u'design', u'encoded', u'expression', u'feasibility', u'genes', u'in', u'information', u'is', u'it', u'its', u'mechanization', u'memory', u'methodical', u'of', u'or', u'practical', u'procedures', u'processing', u'protein', u'representation', u'science', u'scientific', u'scientist', u'specializes', u'storage', u'structure', u'structures', u'study', u'such', u'systematic', u'systems', u'that', u'the', u'theory', u'to', u'transcribed', u'underlie', u'whether'] 

Таким образом, первый элемент в X.toarray() означает, что корпус содержит 1 экземпляр слова access и третий элемент означает, что было 6 экземпляров слова and.

Кстати, одна точка смятения может быть недостающей запятой вокруг #anotherone - это приводит к объединению двух строк, так что corpus - это всего лишь список с одной строкой в ​​нем.

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