Кластеризация текстовых документов с использованием h2o4gpu K-Means в Python
Я заинтересован в использовании h2o4gpu для кластеризации текстовых документов. Для справки, я следовал этому руководству, но изменил код, чтобы отразить h2o4gpu.
from sklearn.feature_extraction.text import TfidfVectorizer
import h2o4gpu
documents = ["Human machine interface for lab abc computer applications",
"A survey of user opinion of computer system response time",
"The EPS user interface management system",
"System and human system engineering testing of EPS",
"Relation of user perceived response time to error measurement",
"The generation of random binary unordered trees",
"The intersection graph of paths in trees",
"Graph minors IV Widths of trees and well quasi ordering",
"Graph minors A survey"]
vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(documents)
true_k = 2
model = h2o4gpu.KMeans(n_gpus=1, n_clusters=true_k, init='k-means++',
max_iter=100, n_init=1)
model.fit(X)
Однако при запуске приведенного выше примера кода я получаю следующие ошибки:
Traceback (most recent call last):
File "dev.py", line 20, in <module>
model.fit(X)
File "/home/greg/anaconda3/lib/python3.6/site-packages/h2o4gpu/solvers/kmeans.py", line 810, in fit
res = self.model.fit(X, y)
File "/home/greg/anaconda3/lib/python3.6/site-packages/h2o4gpu/solvers/kmeans.py", line 303, in fit
X_np, _, _, _, _, _ = _get_data(X, ismatrix=True)
File "/home/greg/anaconda3/lib/python3.6/site-packages/h2o4gpu/solvers/utils.py", line 119, in _get_data
data, ismatrix=ismatrix, dtype=dtype, order=order)
File "/home/greg/anaconda3/lib/python3.6/site-packages/h2o4gpu/solvers/utils.py", line 79, in _to_np
outdata = outdata.astype(dtype, copy=False, order=nporder)
ValueError: setting an array element with a sequence.
Я искал h2o4gpu.feature_extraction.text.TfidfVectorizer
, но не нашел его в h2o4gpu. Тем не менее, есть ли способ исправить эту проблему?
Версии программного обеспечения
CUDA 9.0, V9.0.176
cuDNN 7.1.3
Python 3.6.4
h2o4gpu 0.2.0
Scikit-Learn 0.19.1
1 ответ
X = TfidfVectorizer(stop_words='english').fit_transform(documents)
Возвращает объект разреженной матрицы scipy.sparse.csr_matrix.
В настоящее время в H2O4GPU мы поддерживаем только плотные представления для KMeans. Это означает, что вам придется трансформировать X
либо в 2D-список ванили Python, либо в 2D-массив Numpy, заполнив недостающие элементы 0.
vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(documents)
X_dense = X.toarray()
true_k = 2
model = h2o4gpu.KMeans(n_gpus=1, n_clusters=true_k, init='k-means++',
max_iter=100, n_init=1)
model.fit(X_dense)
Должен сделать свое дело. Это не оптимальное решение для НЛП, поскольку, вероятно, потребуется гораздо больше памяти, но у нас пока нет разреженной поддержки KMeans в дорожной карте.