Страницы

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

среда, 25 декабря 2019 г.

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

#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

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

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