Как мне элегантно реализовать (коричневые) кластерные представления текстов из dicts в качестве функций для классификатора текста? - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь реализовать версию кластеров Брауна для серии текстов обзоров (SemEval 2014). Я использую общедоступные твиттер-кластеры Owoputi et al. (2013). Они выглядят следующим образом:

0000    ijust   1446
0000    i   17071657
0000    -i  4254
000100  iyou    41
000100  #innowayshapeorform 41

, где битовая строка указывает на кластер, а есть 1000 кластеров.

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

{'0000': ['ijust', 'i', '-i'], '000100': ['iyou', #innowayshapeorform] ...}

Мне просто не хватает части того, как одним горячим кодированием текста сопоставлять ключи словаря с индексами в векторе (1d массив):

таким образом, что если слово встречается в тексте И слово встречается в кластере, значение для кластера изменяется с 0 на 1.

например one_hot_vector = [0] * 3

  • кластер 1 (индекс вектора = 0): ['Я', 'я', 'мой', 'мой']
  • кластер 2 (индекс вектора = 1): [ «люблю», «нравится», «хочу», «нужно»]
  • кластер 3 (индекс вектора = 2): [«собаки», «домашние животные», «кошки», «щенки»]

текст 1: я ненавижу кошек

текст 1 векторное представление: [1,0,1]

текст 2: собаки любят меня

текст 2 векторное представление: [1,1,1]

текст 3: I dr овец

текст 3 векторное представление: [1,0,0]

в этом примере 3 кластера - кластеры, которые у меня будут, будут иметь длину 1000 измерений.

1 Ответ

0 голосов
/ 21 июня 2020

Трудно расшифровать ваш вопрос, поэтому позвольте мне формализовать его. Что я понял до сих пор:

  • Вы хотите отобразить данную строку text в одномерный массив a.
  • У вас есть словарь d, который отображает некоторые cluster в список word s.
  • Каждая позиция ix в a соответствует некоторому key из словаря d.
  • a[ix] == 1 if text содержит любое из d[key], == 0 в противном случае.

Следующее решение кажется достаточно элегантным:

keys = sorted(d.keys())
def text2vec(text):
    words = text.lower().split()
    return [
        int(any(
            (d[key] in word) for word in words
        )) for key in keys
    ]

Пример теста:

test_text = "did ijust atealldonuts"
token = text2vec(test_text)
assert 1 == token[keys.index("ijust")]
assert 0 == token[keys.index("i")]

Если Я ошибся, пожалуйста, уточните свой вопрос, в частности, горячую часть.

Не уверен, как DictVectorizer поможет, потому что он преобразует словари, а вы хотите преобразовать фрагмент текста. (По сути, DictVectorizer восстанавливает фрейм данных из json дампа, вроде того.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...