I sh для получения text vectorization
входного текста переменной длины на основе его KMeans Clustering
меток и encode
его, чтобы впоследствии использовать его для цели text-classification
.
Вопросы
- Как эффективно векторизовать его, имея в виду, что в тестовых примерах появятся новые слова?
- После того, как они представлены в KMeans Cluster Представлении, как кодировать ( возможно, OneHotEncoder), чтобы использовать его для подгонки к моделям.
- Не могли бы вы помочь мне выбрать, какой из подходов с горячим кодированием, которые я пробовал, хорошо работал бы с моделями классификации текста.
Например: 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]
Подход пока:
Я использовал данные поезда Генсима от Word2Vec
до vectorize
с выходным измерением 300
. Затем передал word2vec
баллов каждого уникального слова в модель KMeans Clustering
склеарна, выбрав кластер 5
, который дает мне вывод label
для каждого слова.
Для нового слова в тестовых данных, я поставил флажок, если это слово не доступно в словаре word2vec's
, вместо того, чтобы назначать случайную оценку и передавать ее подходящему KMeans
, чтобы получить случайную метку, я непосредственно назначил ему метка кластера (я думаю, что содержит такие слова).
Теперь для 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 вопросах, которые я задал, и какой подход, по вашему мнению, подойдет лучше ??
Заранее спасибо!