Классификация текста + Мешок слов + Python: Мешок слов не показывает индекс документа - PullRequest
0 голосов
/ 25 сентября 2018

Я написал следующий код для создания пакета слов:

count_vect = CountVectorizer()
final_counts = count_vect.fit_transform(data['description'].values.astype('U'))
vocab = count_vect.get_feature_names()
print(type(final_counts)) #final_counts is a sparse matrix
print("--------------------------------------------------------------")
print(final_counts.shape)
print("--------------------------------------------------------------")
print(final_counts.toarray())
print("--------------------------------------------------------------")
print(final_counts[769].shape)
print("--------------------------------------------------------------")
print(final_counts[769])
print("--------------------------------------------------------------")
print(final_counts[769].toarray())
print("--------------------------------------------------------------")
print(len(vocab))
print("--------------------------------------------------------------")

Я получаю следующий вывод:

<class 'scipy.sparse.csr.csr_matrix'>
--------------------------------------------------------------
(770, 10252)
--------------------------------------------------------------
[[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]
--------------------------------------------------------------
(1, 10252)
--------------------------------------------------------------
  (0, 4819) 1
  (0, 2758) 1
  (0, 3854) 2
  (0, 3987) 1
  (0, 1188) 1
  (0, 3233) 1
  (0, 981)  1
  (0, 10065)    1
  (0, 9811) 1
  (0, 8932) 1
  (0, 9599) 1
  (0, 10150)    1
  (0, 7716) 1
  (0, 10045)    1
  (0, 5783) 1
  (0, 5500) 1
  (0, 5455) 1
  (0, 3234) 1
  (0, 7107) 1
  (0, 6504) 1
  (0, 3235) 1
  (0, 1625) 1
  (0, 3591) 1
  (0, 6525) 1
  (0, 365)  1
  : :
  (0, 5527) 1
  (0, 9972) 1
  (0, 4526) 3
  (0, 3592) 4
  (0, 10214)    1
  (0, 895)  1
  (0, 10062)    2
  (0, 10210)    1
  (0, 1246) 1
  (0, 9224) 2
  (0, 4924) 1
  (0, 6336) 2
  (0, 9180) 8
  (0, 6366) 2
  (0, 414)  12
  (0, 1307) 1
  (0, 9309) 1
  (0, 9177) 1
  (0, 3166) 1
  (0, 396)  1
  (0, 9303) 7
  (0, 320)  5
  (0, 4782) 2
  (0, 10088)    3
  (0, 4481) 3
--------------------------------------------------------------
[[0 0 0 ... 0 0 0]]
--------------------------------------------------------------
10252
--------------------------------------------------------------

Понятно, что существует 770 документов и 10 252 уникальных словав корпусе.Я путаюсь, почему эта строка print(final_counts[769]) в моем коде печатается так:

(0, 4819) 1
  (0, 2758) 1
  (0, 3854) 2
  (0, 3987) 1
  (0, 1188) 1
  (0, 3233) 1
  (0, 981)  1
  (0, 10065)    1
  (0, 9811) 1
  (0, 8932) 1
  (0, 9599) 1
  (0, 10150)    1
  (0, 7716) 1
  (0, 10045)    1
  (0, 5783) 1
  (0, 5500) 1
  (0, 5455) 1
  (0, 3234) 1
  (0, 7107) 1
  (0, 6504) 1
  (0, 3235) 1
  (0, 1625) 1
  (0, 3591) 1
  (0, 6525) 1
  (0, 365)  1
  : :
  (0, 5527) 1
  (0, 9972) 1
  (0, 4526) 3
  (0, 3592) 4
  (0, 10214)    1
  (0, 895)  1
  (0, 10062)    2
  (0, 10210)    1
  (0, 1246) 1
  (0, 9224) 2
  (0, 4924) 1
  (0, 6336) 2
  (0, 9180) 8
  (0, 6366) 2
  (0, 414)  12
  (0, 1307) 1
  (0, 9309) 1
  (0, 9177) 1
  (0, 3166) 1
  (0, 396)  1
  (0, 9303) 7
  (0, 320)  5
  (0, 4782) 2
  (0, 10088)    3
  (0, 4481) 3

Первый индекс - это индекс документа.Я печатаю вектор 769-го документа (начиная с 0).Таким образом, первый индекс должен был быть 769 вместо 0, например, (769, 4819) 1.Почему не так?

1 Ответ

0 голосов
/ 25 сентября 2018

Как объяснено здесь это происходит из-за разреженной матрицы.

Если у вас есть 100 документов с 964 объектами в векторизаторе

vectorizer = CountVectorizer()
transformed = vectorizer.fit_transform(documents)
>>> transformed
<100x964 sparse matrix of type '<class 'numpy.int64'>'
    with 3831 stored elements in Compressed Sparse Row format>

Если вывыведите всю матрицу, в которой вы получите координаты ненулевых элементов в каждом документе, это ваш

<(индекс документа, индекс слова в корпусе) этого слова в этом документе>

>>> print(transformed)
  (0, 30)   1
  (0, 534)  1
  (0, 28)   1
  (0, 232)  2
  (0, 298)  1
  (0, 800)  1
  (0, 126)  1
  : :
  (98, 467) 8
  (98, 461) 63
  (98, 382) 88
  (98, 634) 4
  (98, 15)  1
  (98, 450) 1139
  (99, 441) 1940

и, например, print(transformed[(99, 441)]) - это 1940

, когда вы звоните print(transformed[0]), вы получаете следующее:

  (0, 30)   1
  (0, 534)  1
  (0, 28)   1
  (0, 232)  2
  (0, 298)  1
  (0, 800)  1
  : :
  (0, 683)  12
  (0, 15)   1
  (0, 386)  1
  (0, 255)  1
  (0, 397)  1
  (0, 450)  10
  (0, 682)  2782

, поскольку transformed[0] само по себе является разреженнымматрица с одной строкой и 32 ненулевыми элементами, напечатанными выше

>>> transformed[0] 
<1x964 sparse matrix of type '<class 'numpy.int64'>'
with 32 stored elements in Compressed Sparse Row format>

, и вы можете получить к ней доступ с помощью этих кортежей, например, transformed[0][(0, 682)] возвращает 2782.

(Обратите внимание, что transformed[0].toarray().shape - это (1, 964) не (964,))

...