Как классифицировать очень большое количество текста в Python 3? - PullRequest
2 голосов
/ 30 апреля 2019

Я должен классифицировать очень большие объемы текста по более чем 10000 категориям.Мне понадобится консультация специалиста, потому что я еще студент.

Мои данные - описания и названия коммерческих продуктов, отсортированных по категориям.Например, клавиатура с заголовком «большая и хорошая клавиатура» находится в категории «офис> компьютер> клавиатура».

На данный момент я использую «from sklearn.feature_extraction.text import TfidfVectorizer» для представления моих текстовых данных.Но матрица слишком большая в памяти.Есть ли у вас какие-либо советы для представления большого количества данных?

Я думал об использовании word-2-vec для представления данных, за которыми следует нейронная сеть для классификации.

Но мне нужен ваш совет, чтобы встать на правильный путь !!

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Я нашел решение обучить классификатор, не сохраняя все данные в памяти.

Представьте, что у вас есть 2 набора данных для классификатора поезда 1.

#Data 1
X1_text = ["When I wake up in the morning I always eat apples",
     "What do you eat in the morning"]
y1 = [1,1] #target 1
#Data 2
X2_text = ["Usually I only drink coffee",
     "How awful, I really cannot stand coffee"]
y2 = [2,2] #target 2

Мы используем Hashing для векторизации данных

from sklearn.feature_extraction.text import HashingVectorizer
vectorizer = HashingVectorizer(decode_error='ignore', n_features=2 ** 18)
X1 = vectorizer.transform(X1_text)
X2 = vectorizer.transform(X2_text)

Мы будем использовать part_fit для обучения SGDClassifier в 2 этапа. https://scikit -learn.org / стабильный / модули / полученные / sklearn.linear_model.SGDClassifier.html

from sklearn.linear_model.stochastic_gradient import SGDClassifier
clf = SGDClassifier()

Первый шаг, используя part_fit для X1 / y1. Классы параметров должны содержать все возможные классы для прогнозирования. Здесь 1 и 2. примечание: если у вас есть, например, переменные классы со всеми целевыми объектами, вы можете использовать классы = np.unique (классы). См. Документацию.

clf.partial_fit(X1, y1, classes = [1,2])

Второй шаг, переобучите классификатора другим данным. Не используйте атрибутированные классы.

clf.partial_fit(X2, y2)
0 голосов
/ 01 мая 2019

Я вижу два варианта для вас, если вы хотите уменьшить размер векторизации Tfidf.

Предположим, у вас есть следующие данные:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD

X = ["When I wake up in the morning I always eat apples",
"What do you eat in the morning",
"Usually I only drink coffee",
"How awful, I really cannot stand coffee"]

При применении преобразования Tfidf вы будетеполучить матрицу формы (4,21):

vectorizer = TfidfVectorizer()
vectorized_X = vectorizer.fit_transform(X)
vectorized_X.shape
>>> (4,21)

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

Вариант 1

Вы можете использовать уменьшение размерности.Наиболее естественным после выполнения Tfidf является использование усеченного SVD.Это выполняет линейное уменьшение размерности вашей векторизации tfidf.Приятно то, что вы можете указать количество новых компонентов, которые вы хотите сохранить:

svd = TruncatedSVD(n_components=2)
reduced_X = svd.fit_transform(vectorized_X)
reduced_X.shape
>>> (4,2)

Опция 2

Tfidf позволяет указать, сколькослова, которые вы хотите сохранить в векторизации.Затем он возвращает векторизацию, выполненную только для верхних слов с точки зрения частоты слова.

vectorizer_reduction = TfidfVectorizer(max_features = 5)
vectorized_reduced_X = vectorizer_reduction.fit_transform(X)
vectorized_reduced_X.shape
>>> (4,5)

Если бы у меня был выбор между двумя, я бы выбрал Вариант 1 , потому что он сначала учитывает всю информацию, а затем суммирует ее, тогда как Вариант 2 просто отбрасывает информацию с самого начала.Но я также ожидал бы, что Вариант 1 займет больше времени ... так что, возможно, оптимальным решением может быть сочетание двух (сначала применить ограничительный Tfidf, а затем SVD)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...