Как объединить текстовый векторный параметр с другими параметрами перед передачей его в sklearn? - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь объединить два типа параметров перед кластеризацией.

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

Я попытался объединить 2 типа параметров в один массив и передать его в качестве входных данных для алгоритма:

db = DBSCAN(eps=1, min_samples=3, metric=get_distance).fit(array(combined_list))

Также я создал собственную метрику расстояния, которую я собираюсь использовать.

def get_distance(vec1,vec2):
    text_distance = cosine_similarity(vec1[0] ,vec2[0])
    other_distance = vec1[1]-vec2[1]

    return (text_distance+other_distance)/2

Но я получаю сообщение об ошибке при попытке передать мой входной массив. Объединенный массив был построен следующим образом:

combined_list = []
for i in range(len(hashes_list)):
    combined_list.append((hashes_list[i],text_list[i]))

combined_list = array(combined_list)

Полная трассировка ошибок:

db = DBSCAN(eps=1, min_samples=3, metric=get_distance ).fit(array(combined_list))

Traceback (most recent call last):
  File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec
    exec(exp, global_vars, local_vars)
  File "<input>", line 1, in <module>
  File "/Users/tal/src/campaign_detection/Data_Extractor/venv/lib/python3.7/site-packages/sklearn/cluster/dbscan_.py", line 319, in fit
    X = check_array(X, accept_sparse='csr')
  File "/Users/tal/src/campaign_detection/Data_Extractor/venv/lib/python3.7/site-packages/sklearn/utils/validation.py", line 527, in check_array
    array = np.asarray(array, dtype=dtype, order=order)
  File "/Users/tal/src/campaign_detection/Data_Extractor/venv/lib/python3.7/site-packages/numpy/core/numeric.py", line 538, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: setting an array element with a sequence.

Это правильный подход для объединения текстового вектора с другими параметрами?

1 Ответ

0 голосов
/ 28 марта 2019

У меня есть пара предложений для вашего подхода.

  1. Вход для DBSCAN должен быть снабжен массивом 2D, а не кортежами.Следовательно, вы должны сгладить ваши входные данные.

Из документации :

X: матрица массива или разреженной (CSR) формы (n_samples, n_features),или массив формы (n_samples, n_samples)

get_distance() должен возвращать одно значение, а не массив.Следовательно, я бы предложил вам использовать некоторую меру для нетекстовых функций.Я привел пример евклидова расстояния.

Пример:

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> corpus = [
...     'This is the first document.',
...     'This document is the second document.',
...     'And this is the third one.',
...     'Is this the first document?',
... ]
>>> vectorizer = TfidfVectorizer()
>>> text_list = vectorizer.fit_transform(corpus)


import numpy as np
hashes_list = np.array([[12,12,12],
               [12,13,11],
               [12,1,16],
               [4,8,11]])

from scipy.sparse import hstack
combined_list = hstack((hashes_list,text_list))

from sklearn.metrics.pairwise import cosine_similarity
from sklearn.metrics.pairwise import euclidean_distances

from sklearn.cluster import DBSCAN

n1 = len(vectorizer.get_feature_names())

def get_distance(vec1,vec2):
    text_distance = cosine_similarity([vec1[:n1]], [vec2[:n1]])
    other_distance = euclidean_distances([vec1[n1:]], [vec2[n1:]])
    return (text_distance+other_distance)/2

db = DBSCAN(eps=1, min_samples=3, metric=get_distance ).fit(combined_list.toarray())
...