Одна горячая кодировка для представления предложений корпуса в Python

Я начинаю изучать Python и библиотеку Scikit-learn. В настоящее время мне нужно работать над проектом НЛП, который в первую очередь должен представлять большой корпус с помощью One-Hot Encoding. Я прочитал документацию Scikit-learn о предварительной обработке. OneHotEncoder, однако, похоже, это не понимание моего термина.

в основном идея аналогична приведенной ниже:

  • 1000000 Воскресенье; 0100000 понедельник; 0010000 вторник; ... 0000001 суббота;

если в корпусе всего 7 разных слов, то мне нужен только 7-значный вектор для представления каждого отдельного слова. а затем завершенное предложение может быть представлено конъюнкцией всех векторов, которая является матрицей предложений. Однако я пробовал на Python, похоже, не работает ...

Как я могу это решить? в моем корпусе очень много разных слов.

Кстати, также кажется, что если векторы в основном заполнены нулями, мы можем использовать Scipy.Sparse, чтобы сделать хранилище маленьким, например, CSR.

Следовательно, весь мой вопрос будет следующим:

как предложения в корпусе могут быть представлены OneHotEncoder и сохранены в SparseMatrix?

Спасибо вам, ребята.


person Aaron7Sun    schedule 20.05.2015    source источник


Ответы (1)


Чтобы использовать OneHotEncoder, вы можете разделить свои документы на токены, а затем сопоставить каждый токен с идентификатором (который всегда одинаков для одной и той же строки). Затем примените OneHotEncoder к этому списку. Результатом по умолчанию является разреженная матрица.

Пример кода для двух простых документов A B и B B:

from sklearn.preprocessing import OneHotEncoder
import itertools

# two example documents
docs = ["A B", "B B"]

# split documents to tokens
tokens_docs = [doc.split(" ") for doc in docs]

# convert list of of token-lists to one flat list of tokens
# and then create a dictionary that maps word to id of word,
# like {A: 1, B: 2} here
all_tokens = itertools.chain.from_iterable(tokens_docs)
word_to_id = {token: idx for idx, token in enumerate(set(all_tokens))}

# convert token lists to token-id lists, e.g. [[1, 2], [2, 2]] here
token_ids = [[word_to_id[token] for token in tokens_doc] for tokens_doc in tokens_docs]

# convert list of token-id lists to one-hot representation
vec = OneHotEncoder(n_values=len(word_to_id))
X = vec.fit_transform(token_ids)

print X.toarray()

Отпечатки (один горячий вектор в объединенной форме на документ):

[[ 1.  0.  0.  1.]
 [ 0.  1.  0.  1.]]
person aleju    schedule 21.05.2015
comment
СПАСИБО! очень полезно! - person Aaron7Sun; 18.03.2016
comment
Как вы справляетесь с ситуацией, когда docs = [A B, B B C], например, работая с разными твитами, они не всегда имеют одинаковую длину и содержат разные слова. - person bmc; 06.04.2017
comment
один из распространенных подходов - установить максимальную длину и заполнить более короткие тексты символом заполнения и обрезать более длинные тексты. - person fotis j; 04.05.2019