Нужно заполнить двумерный массив. элемент с индексом (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: для реальных задач лучше воспользоваться другим решением
Комментариев нет:
Отправить комментарий