Nano Hash - криптовалюты, майнинг, программирование

Как интерпретировать выходные данные разреженной матрицы sklearn?

Я пытаюсь создать матрицу совпадения биграммных слов, указывающую, сколько раз одно слово следует за другим в корпусе.

В качестве теста я написал следующее (которое я собрал из других вопросов SE):

from sklearn.feature_extraction.text import CountVectorizer

test_sent = ['hello', 'i', 'am', 'hello', 'i', 'dont', 'want', 'to', 'i', 'dont']
bigram_vec = CountVectorizer(ngram_range=(1,2)) 
X = bigram_vec.fit_transform(test_sent)
Xc = (X.T * X)
print Xc

Это должно дать правильный результат. Матрица Xc выводится так:

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

Я понятия не имею, как это интерпретировать. Я попытался сделать его плотным, чтобы помочь с моей интерпретацией, используя Xc.todense(), который получил это:

[[1 0 0 0 0]
 [0 2 0 0 0]
 [0 0 2 0 0]
 [0 0 0 1 0]
 [0 0 0 0 1]]

Ни один из них не дает правильную матрицу совпадения слов, показывающую, сколько раз строка следует за столбцом.

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

Дополнение к вопросу

Вот еще один возможный результат с другим примером использования ngram_range=(2,2):

from sklearn.feature_extraction.text import CountVectorizer

test_sent = ['hello biggest awesome biggest biggest awesome today lively splendid awesome today']

bigram_vec = CountVectorizer(ngram_range=(2,2)) 

X = bigram_vec.fit_transform(test_sent)
print bigram_vec.get_feature_names()

Xc = (X.T * X)

print Xc
print ' '
print Xc.todense()

(4, 0)  1
(2, 0)  2
(0, 0)  1
(3, 0)  1
(1, 0)  2
(7, 0)  1
(5, 0)  1
(6, 0)  1
(4, 1)  2
(2, 1)  4
(0, 1)  2
(3, 1)  2
(1, 1)  4
(7, 1)  2
(5, 1)  2
(6, 1)  2
(4, 2)  2
(2, 2)  4
(0, 2)  2
(3, 2)  2
(1, 2)  4
(7, 2)  2
(5, 2)  2
(6, 2)  2
(4, 3)  1
:   :
(6, 4)  1
(4, 5)  1
(2, 5)  2
(0, 5)  1
(3, 5)  1
(1, 5)  2
(7, 5)  1
(5, 5)  1
(6, 5)  1
(4, 6)  1
(2, 6)  2
(0, 6)  1
(3, 6)  1
(1, 6)  2
(7, 6)  1
(5, 6)  1
(6, 6)  1
(4, 7)  1
(2, 7)  2
(0, 7)  1
(3, 7)  1
(1, 7)  2
(7, 7)  1
(5, 7)  1
(6, 7)  1

[[1 2 2 1 1 1 1 1]
 [2 4 4 2 2 2 2 2]
 [2 4 4 2 2 2 2 2]
 [1 2 2 1 1 1 1 1]
 [1 2 2 1 1 1 1 1]
 [1 2 2 1 1 1 1 1]
 [1 2 2 1 1 1 1 1]
 [1 2 2 1 1 1 1 1]]

Этот, кажется, токенизируется биграммами, так как вызов bigram_vec.get_feature_names() дает

[u'awesome biggest', u'awesome today', u'biggest awesome', u'biggest biggest', u'hello biggest', u'lively splendid', u'splendid awesome', u'today lively']

Некоторая помощь в интерпретации этого была бы здоровой. Это симметричная матрица, поэтому я думаю, что это может быть просто количество вхождений?


  • Да, ты прав. Он показывает количество вхождений каждой биграммы. 04.03.2018

Ответы:


1

Сначала вам нужно проверить имена функций, которые использует CountVectorizer.

Сделай это:

bigram_vec.get_feature_names()
# Out:  [u'am', u'dont', u'hello', u'to', u'want']

Вы видите, что слово "i" отсутствует. Это потому, что токенизатор по умолчанию использует шаблон:

token_pattern : строка

Regular expression denoting what constitutes a “token”, only used if 
analyzer == 'word'. The default regexp select tokens of 2 or more
alphanumeric characters (punctuation is completely ignored and always
treated as a token separator).

И фактический вывод X следует интерпретировать как:

            [u'am', u'dont', u'hello', u'to', u'want']
'hello'    [[ 0        0        1        0       0]
'i'         [ 0        0        0        0       0]
'am'        [ 1        0        0        0       0]
'hello'     [ 0        0        1        0       0]
'i'         [ 0        0        0        0       0]
'dont'      [ 0        1        0        0       0]
'want'      [ 0        0        0        0       1]
'to'        [ 0        0        0        1       0]
'i'         [ 0        0        0        0       0]
'dont'      [ 0        1        0        0       0]]

Теперь, когда вы делаете X.T * X, это должно интерпретироваться как:

           u'am'  u'dont'  u'hello'  u'to'  u'want'
u'am'      [[1      0         0        0       0]
u'dont'     [0      2         0        0       0]
u'hello'    [0      0         2        0       0]
u'to'       [0      0         0        1       0]
u'want'     [0      0         0        0       1]]

Если вы ожидаете чего-то другого, вам следует добавить детали в вопрос.

01.03.2018
  • Итак, похоже, что X.T*X — это формат, который я ищу. Но он просто говорит мне, сколько раз появляется каждое слово (например, 2 в dont, dont; 1 в to,to). Так что ваш ответ действительно отвечает на мой вопрос. Вы знаете, как я могу получить его в формате, который я хочу? Где показано, сколько раз одно слово следует за другим в биграммах? 01.03.2018
  • Я также добавил еще один пример с немного другим аргументом ngram_range. 01.03.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..