0

Я только начал погружаться в Machine Learning, в частности, в Clustering. (Я использую Python, но это не имеет значения) Моя цель состоит, начиная с коллекции твитов (100K) о мире моды, выполнять KMeans над их текстом.Из текста в K-Means Векторы ввода

До сих пор я отфильтровывал тексты, усекая стоп-слова, бесполезные термины, знаки препинания; сделал лемматизацию (используя теги Part Of Speech для достижения лучших результатов).

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

Моя первоначальная идея состояла в том, чтобы использовать верхнюю п (1K) термины, как особенности, создание Еогеасп чирикнуть вектор фиксированного размера п (1K) , имеющий ячейку установить на значение, если верхний член (этой ячейки) появляются в этом твите (возможно, вычисление значения ячейки с помощью TFIDF).

Я что-то упустил (значения 0 будут учтены)? Могу ли я использовать n-граммы каким-то образом?

Этот scikit article довольно общий, и я не понимаю все это.

(Is уменьшение размерности НУА полезно или лучше уменьшение числа функций (так векторы размерности) вручную?)

ответ

1

Этот other sklearn page содержит пример K-средства кластеризации текстов.

Но для решения некоторых из ваших конкретных вопросов:

Моя первоначальная идея состояла в том, чтобы использовать верхнюю п (1K) термины, как особенности, создавая Еогеасп чирикать вектор фиксированного размера п (1К), имеющий ячейку устанавливается в значение, если верхний член (этой ячейки) появляется в этом твите (возможно, вычисляя значение ячейки с помощью TFIDF).

Стандартный подход для достижения этой цели является использование sklearn-х CountVectorizer и играть с параметром min_df.

from sklearn.feature_extraction.text import CountVectorizer 
cv = CountVectorizer(min_df=10) 
X = cv.fit_transform(texts) 

выше кусок кода преобразует массив текстов в особенности X. Настройка min_df=10 будет игнорировать все слова с менее чем 10 случаев (в моем понимании, нет прямой способ сказать «занять первое 1000» но это эквивалентно).

Могу ли я использовать n-граммы каким-то образом?

Да, CountVectorizer может иметь дело с n-граммами. Параметр ngram_range указывает диапазон рассмотренных nграмм (начиная с «n» и заканчивая «n»). Например,

cv = CountVectorizer(min_df=10, ngram_range=(2,2)) 

будет строить функции на основе битрамов вместо отдельных слов (униграмм). Для смешивания юниграмм и биграммы

cv = CountVectorizer(min_df=10, ngram_range=(2,2)) 

Затем вы можете заменить CountVectorizer на более TfIdfVectorizer, который преобразует количество слов веса более информативные слова.

Является ли уменьшение размерности LSA полезным или лучше ли уменьшить количество функций (так что размер векторов) вручную?

Короткий ответ, это зависит от вашей цели. Пример в ссылке, упомянутой выше, сначала применяет LSA. Но также, по моему опыту, методы «темы темы», такие как LSA или NMF, можно считать кластеризацией в скрытые семантические темы. Например,

from sklearn.decomposition import NMF 
nmf = NMF(n_components=20) 
mu = nmf.fit_transform(X) 

Это преобразует функции X в проективные векторы объектов mu 20 измерений. Каждое измерение d может быть интерпретировано как оценка текста в теме d. Назначая каждому образцу размеру с максимальным счетом, это также можно интерпретировать как кластеризацию.