#python #python_27 #numpy
Нужно заполнить двумерный массив. элемент с индексом (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
Ответы
Ответ 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: для реальных задач лучше воспользоваться другим решением.Ответ 2
Воспользуйтесь sklearn.feature_extraction.text.CountVectorizer и Pandas.SparseDataFrame. Для больших текстов - это будет работать на порядки быстрее (по сравнению с решением использующим вложенные циклы) и занимать на несколько порядков меньше памяти (итоговые данные представлены в виде разреженной (sparse) матрицы) Пример: import pandas as pd from sklearn.feature_extraction.text import CountVectorizer sentences = [ "'It's Raining Cats and Dogs", "Do cats like dogs or hot dogs?", "Cats prefer hot dogs!" ] cv = CountVectorizer(stop_words='english') r = pd.SparseDataFrame(cv.fit_transform(sentences), columns=cv.get_feature_names(), default_fill_value=0) Результат: In [201]: r Out[201]: cats dogs hot like prefer raining 0 1 1 0 0 0 1 1 1 2 1 1 0 0 2 1 1 1 0 1 0
Комментариев нет:
Отправить комментарий