Страницы

Поиск по вопросам

пятница, 1 марта 2019 г.

Заполнение двумерного массива / Векторизация текста

Нужно заполнить двумерный массив. элемент с индексом (i, j) в этой матрице должен быть равен количеству вхождений j-го слова в i-е предложение. (предложения считываются из файла, разбиты на списки и все слова, встречающиеся в предложениях добавлены в словарь d, где ключ - это слово, а порядковый индекс значение).
входные данные 22 предложения, приведенных к спискам вида ['in', 'comparison', 'to', 'dogs', 'cats', 'have', 'not', 'undergone', 'major', 'changes', 'during', 'the', 'domestication', 'process'] в итоге должна получиться матрица 22х253 (22 - как предложений, 253 как всего уникальных слов, используемых в предложениях). Слова собраны в словарь вида [слово: индекс]. Если слово из словаря встречается в 1 предложении 2 раза, а его индекс по словарю 1, на месте элемента m[1, 1] должна стоять 2 и т.д.
Создала пустую матрицу и запустила перебор, но она все равно остается нулевой, не пойму где ошибка
m = np.zeros((number_line, len(new_line))) i = 0 for line in f.readlines(): for x in line: a = line.count(x) j = d[x] m[i, j] = a i += 1


Ответ

По просьбе автора вопроса привожу пример решения с циклами.
import numpy as np from nltk.tokenize import sent_tokenize, RegexpTokenizer from collections import Counter
text = """Displays osx displays. osx selection. Nothing! """ sentences = sent_tokenize(text) tok = RegexpTokenizer('(?u)\\b\\w\\w+\\b') vocab = {'displays':0, 'osx':1, 'selection':2}
res = np.zeros((len(sentences), len(vocab))) for i,s in enumerate(sentences): for w,cnt in Counter(w.lower() for w in tok.tokenize(s)).items(): if w in vocab.keys(): res[i, vocab[w]] = cnt
Результат:
In [254]: res Out[254]: array([[ 2., 1., 0.], [ 0., 1., 1.], [ 0., 0., 0.]])
In [255]: vocab Out[255]: {'displays': 0, 'osx': 1, 'selection': 2}
NOTE: для реальных задач лучше воспользоваться другим решением

Комментариев нет:

Отправить комментарий