Как реализовать кластеризацию KMeans с Word2Ve c для модели классификации текста? - PullRequest
0 голосов
/ 26 апреля 2020

I sh для получения text vectorization входного текста переменной длины на основе его KMeans Clustering меток и encode его, чтобы впоследствии использовать его для цели text-classification.

Вопросы

  1. Как эффективно векторизовать его, имея в виду, что в тестовых примерах появятся новые слова?
  2. После того, как они представлены в KMeans Cluster Представлении, как кодировать ( возможно, OneHotEncoder), чтобы использовать его для подгонки к моделям.
  3. Не могли бы вы помочь мне выбрать, какой из подходов с горячим кодированием, которые я пробовал, хорошо работал бы с моделями классификации текста.

Например: I wi sh для достижения этого в первом запросе ...

             Lines                         KMeans Cluster Representation
0   This is a good company ABC Co. Ltd  | [c1, c1, c1, c2, c2, c3, c3, c3]
1   DEF LLC lacks manpower              | [c3, c3, c4, c4]
2   Total Amount is $200                | [c4, c2, c1, c5]
3   GHI JKL LLC                         | [c3, c3, c3]
4   ABC                                 | [c3]

Подход пока:

  1. Я использовал данные поезда Генсима от Word2Vec до vectorize с выходным измерением 300. Затем передал word2vec баллов каждого уникального слова в модель KMeans Clustering склеарна, выбрав кластер 5, который дает мне вывод label для каждого слова.

  2. Для нового слова в тестовых данных, я поставил флажок, если это слово не доступно в словаре word2vec's, вместо того, чтобы назначать случайную оценку и передавать ее подходящему KMeans, чтобы получить случайную метку, я непосредственно назначил ему метка кластера (я думаю, что содержит такие слова).

  3. Теперь для Query 2 у меня есть два возможных способа ...

    A. Я решил сначала кодировать метки всех меток кластера с отображением (0,1, ... 5), а затем дополнить все последовательности -1 до выбранной max_length. Результирующие данные затем снова отображаются с 0: [1,0,0,0,0] в отображении стиля One-Hot-Encoder.

    B. Используйте MultiLabelBinarizer от sklearn для горячего кодирования его более чистым способом.

Предположим, это мой фрейм данных ..

from keras.preprocessing.sequence import pad_sequences

df = pd.DataFrame({"Lines": ["this is a good company ABC Co. Ltd", 
                             "DEF Ltd lacks manpower", 
                             "Total Amount is $200", 
                             "GHI JKL LLC", 
                             "ABC"],
                   "Cluster_Rep": [["c1", "c1", "c1", "c2", "c2", "c3", "c3", "c3"], 
                                   ["c3", "c3", "c4", "c4"],
                                   ["c4", "c2", "c1", "c5"],
                                   ["c3", "c3", "c3"], 
                                   ["c3"]]})

Вот 3.А. что выглядит как

Я сопоставил метки кластеров, которые я получил от word2ve c -> Kmeans с 0,1, .. 4 и затем дополнил ..

mapping_1 = {'c1':0, "c2":1, "c3":2, "c4":3, "c5":4}
mapped = [[mapping_1[b] for b in i] for i in df.Cluster_Rep.tolist()]
padded = pad_sequences(mapped, padding='post', value=-1)
print(padded)
[out]: 
         [[ 0  0  0  1  1  2  2  2]
          [ 2  2  3  3 -1 -1 -1 -1]
          [ 3  1  4 -1 -1 -1 -1 -1]
          [ 2  2  2 -1 -1 -1 -1 -1]
          [ 2 -1 -1 -1 -1 -1 -1 -1]]

Тогда я переназначил его, используя список в стиле OneHotEncoder ....

mapping_2 = {0: [1,0,0,0,0], 
             1: [0,1,0,0,0], 
             2: [0,0,1,0,0], 
             3: [0,0,0,0,1], 
             4: [0,0,0,0,1], 
            -1: [0,0,0,0,0]}

re_mapped = [[mapping_2 [b] for b in i] for i in padded]
print(re_mapped)
[out]:
    [[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0],
      [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]],
     [[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 1], [0, 0, 0, 0, 1], [0, 0, 0, 0, 0],
      [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]], ..... likewise

Вот что 3.B. выглядит так:

from sklearn.preprocessaing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
mapped = pd.DataFrame(mlb.fit_transform(df['Cluster_Rep']),columns=mlb.classes_, index=df.index)
print(mapped)
[out]:
       c1  c2 c3 c4  c5
     0  1   1   1   0   0
     1  0   0   1   1   0
     2  0   1   0   1   1
     3  0   0   1   0   0
     4  0   0   1   0   0

Я знаю, что это длинный пост, но, пожалуйста, поделитесь со мной этим и дайте мне знать о ваших ценных предложениях / примерах или дополнительных возможностях.

Моя конечная цель - представить эти строки текста для классификации. Эти строки часто имеют имена, места, местоположения и т. Д. c, что затрудняет мне рассмотрение более простых вариантов, таких как модель BoW и т. Д. c.

Сообщите мне о 3 вопросах, которые я задал, и какой подход, по вашему мнению, подойдет лучше ??

Заранее спасибо!

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