python中表示语料库句子的一种热编码方法

python中表示语料库句子的一种热编码方法,python,machine-learning,nlp,scikit-learn,one-hot-encoding,Python,Machine Learning,Nlp,Scikit Learn,One Hot Encoding,我是Python和Scikit学习库的初学者。 我目前需要做一个NLP项目,首先需要通过一个热编码来表示一个大型语料库。 我已经阅读了Scikit learn关于预处理的文档。然而,这似乎不是我对术语的理解 基本上,想法类似于以下内容: 100万星期日; 周一0:00; 0010000星期二; ... 0000001星期六 如果语料库只有7个不同的单词,那么我只需要一个7位数的向量来表示每个单词。然后,一个完整的句子可以用所有向量的连接来表示,这是一个句子矩阵。 但是,我尝试了Python,

我是Python和Scikit学习库的初学者。 我目前需要做一个NLP项目,首先需要通过一个热编码来表示一个大型语料库。 我已经阅读了Scikit learn关于预处理的文档。然而,这似乎不是我对术语的理解

基本上,想法类似于以下内容:

  • 100万星期日; 周一0:00; 0010000星期二; ... 0000001星期六
如果语料库只有7个不同的单词,那么我只需要一个7位数的向量来表示每个单词。然后,一个完整的句子可以用所有向量的连接来表示,这是一个句子矩阵。 但是,我尝试了Python,它似乎不起作用

我怎样才能解决这个问题?我的语料库中有大量不同的单词

顺便说一句,如果向量大部分是用零实现的,那么我们可以使用Scipy.Sparse使存储变小,例如CSR

因此,我的全部问题是:

语料库中的句子如何用OneHotEncoder表示并存储在SparseMatrix中


谢谢大家。

为了使用OneHotEncoder,您可以将文档拆分为令牌,然后将每个令牌映射到一个id(对于相同的字符串,该id始终相同)。然后将OneHotEncoder应用于该列表。默认情况下,结果是稀疏矩阵

两个简单文档的示例代码
ab
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()
打印(每个文档以串联形式打印一个热向量):


谢谢!非常有帮助!当文档=[“A B”,“B B C”]处理不同的推文时,您如何处理这种情况,例如,它们并不总是具有相同的长度和包含不同的单词。一种常见的方法是设置最大长度,并用填充字符填充较短的文本,并切掉较长的文本
[[ 1.  0.  0.  1.]
 [ 0.  1.  0.  1.]]