Как получить пакет слов из текстовых данных?

Я работаю над проблемой прогнозирования, используя большой текстовый набор данных. Я реализую Модель мешков слов.

Какой должен быть лучший способ получить сумку слов? Прямо сейчас у меня tf-idf различных слов, и количество слов слишком велико, чтобы использовать его для дальнейших назначений. Если я использую критерии tf-idf, каков должен быть порог tf-idf для получения мешка слов? Или я должен использовать некоторые другие алгоритмы. Я использую python.

Ответ 1

Использование collections.Counter class

>>> import collections, re
>>> texts = ['John likes to watch movies. Mary likes too.',
   'John also likes to watch football games.']
>>> bagsofwords = [ collections.Counter(re.findall(r'\w+', txt))
            for txt in texts]
>>> bagsofwords[0]
Counter({'likes': 2, 'watch': 1, 'Mary': 1, 'movies': 1, 'John': 1, 'to': 1, 'too': 1})
>>> bagsofwords[1]
Counter({'watch': 1, 'games': 1, 'to': 1, 'likes': 1, 'also': 1, 'John': 1, 'football': 1})
>>> sumbags = sum(bagsofwords, collections.Counter())
>>> sumbags
Counter({'likes': 3, 'watch': 2, 'John': 2, 'to': 2, 'games': 1, 'football': 1, 'Mary': 1, 'movies': 1, 'also': 1, 'too': 1})
>>> 

Ответ 2

Сумка слов может быть определена как матрица, где каждая строка представляет собой документ и столбцы, представляющие отдельный токен. Кроме того, последовательный порядок текста не поддерживается. Построение "Сумки слов" включает в себя 3 шага

  • tokenizing
  • счета
  • нормализующее

Ограничения, которые следует учитывать:  1. Невозможно записать фразы или многословные выражения  2. Чувствительность к орфографическим ошибкам, возможность обойти это с использованием корректора заклинаний или символьного представления,

например.

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
data_corpus = ["John likes to watch movies. Mary likes movies too.", 
"John also likes to watch football games."]
X = vectorizer.fit_transform(data_corpus) 
print(X.toarray())
print(vectorizer.get_feature_names())

Ответ 3

Вы должны проверить scikits-learn, в котором есть куча этой функции, испеченной внутри. Там даже некоторый пример кода на их веб-сайте.

Другим вариантом является nltk, который обладает множеством отличных функций обработки языка. Я не использовал его так сильно, но, похоже, у него должны быть некоторые возможности для того, чтобы делать то, что вы делаете.

Ответ 4

Модель суммирования слов - хороший метод для текстового представления, который должен применяться в различных задачах машинного обучения. Но на первом этапе вам нужно очистить данные от ненужных данных, например, пунктуации, html-тегов, стоп-слов,... Для этих задач вы можете легко использовать библиотеки типа Beautiful Soup (для удаления HTML-разметки) или NLTK (для удаления стоп-слов) в Python.  После очистки ваших данных вам необходимо создать векторные функции (числовое представление данных для машинного обучения), где роль Bag-Of-Words играет роль. scikit-learn имеет модуль (модуль feature_extraction), который может помочь вам создать функции суммирования слов.

Вы можете найти все, что вам нужно подробно, в этом tutorial также это, может быть очень полезно. Я нашел их очень полезными.

Ответ 5

Как уже упоминалось ранее, использование nltk было бы вашим лучшим вариантом, если вы хотите что-то стабильное и масштабируемое. Он очень настраиваемый.

Тем не менее, у него есть недостаток критической кривой обучения, если вы хотите изменить настройки по умолчанию.

Однажды я столкнулся с ситуацией, когда я хотел иметь сумку слов. Проблема заключалась в том, что речь шла о статьях о технологиях с экзотическими именами, полными -, _ и т.д. Такие, как vue-router или _.js и т.д.

Конфигурация по умолчанию nltk word_tokenize состоит в том, чтобы разделить vue-router на два отдельных слова vue и router. Я даже не говорю о _.js.

Итак, для чего это стоит, я закончил писать эту маленькую рутину, чтобы получить все слова, обозначенные в list, на основе моих собственных критериев пунктуации.

import re

punctuation_pattern = ' |\.$|\. |, |\/|\(|\)|\'|\"|\!|\?|\+'
text = "This article is talking about vue-router. And also _.js."
ltext = text.lower()
wtext = [w for w in re.split(punctuation_pattern, ltext) if w]

print(wtext)
# ['this', 'article', 'is', 'talking', 'about', 'vue-router', 'and', 'also', '_.js']

Эта процедура может быть легко объединена с ответом Patty3118 о collections.Counter, который может привести вас к тому, чтобы узнать, какое количество раз _.js было упомянуто в статье, например.

Ответ 6

Из книги "Машиноведение python":

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
count = CountVectorizer()
docs = np.array(['blablablatext'])
bag = count.fit_transform(docs)