2015-05-20 1 views
2

Я стартер в Python и Scikit-learn library. Мне сейчас нужно работать над проектом NLP, который в первую очередь должен представлять большой корпус One-Hot Encoding. Я прочитал документацию Scikit-learn о препроцессинге. Один из них, но похоже, что это не понимание моего термина.One Hot Encoding для представления предложений corpus в python

в основном, идея аналогична, как показано ниже:

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

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

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

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

Таким образом, весь мой вопрос будет:

как предложения в корпусе может быть представлены OneHotEncoder, и хранятся в разреженной матрице?

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

ответ

5

Для использования 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.]] 
+0

THX! очень полезно! – Aaron7Sun

+4

Как вы справляетесь с ситуацией, когда docs = ["A B", "B B C"], например, работая с разными твитами, они не всегда имеют одинаковую длину и содержат разные слова. – bmc