python 中表示语料库句子的一种热编码
One Hot Encoding for representing corpus sentences in python
我是 Python 和 Scikit-learn 库的初学者。
我目前需要从事一个 NLP 项目,该项目首先需要通过 One-Hot Encoding 来表示一个大型语料库。
我已经阅读了 Scikit-learn 关于 preprocessing.OneHotEncoder 的文档,但是,这似乎不是我对术语的理解。
基本上,这个想法类似于以下内容:
- 1000000 周日;
0100000 星期一;
0010000 周二;
...
0000001 星期六;
如果语料库只有 7 个不同的词,那么我只需要一个 7 位数的向量来表示每个词。然后,一个完整的句子可以由所有向量的合取来表示,这就是一个句子矩阵。
但是,我在 Python 中尝试过,似乎不起作用...
我该如何解决这个问题?我的语料库有很多不同的词。
顺便说一句,如果向量大部分用零填充,我们可以使用 Scipy.Sparse 来减小存储空间,例如 CSR。
因此,我的整个问题将是:
语料库中的句子如何用OneHotEncoder表示,并存储在SparseMatrix中?
谢谢大家
为了使用 OneHotEncoder,您可以将文档拆分为标记,然后将每个标记映射到一个 ID(对于相同的字符串,该 ID 始终相同)。然后将 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.]]
我是 Python 和 Scikit-learn 库的初学者。 我目前需要从事一个 NLP 项目,该项目首先需要通过 One-Hot Encoding 来表示一个大型语料库。 我已经阅读了 Scikit-learn 关于 preprocessing.OneHotEncoder 的文档,但是,这似乎不是我对术语的理解。
基本上,这个想法类似于以下内容:
- 1000000 周日; 0100000 星期一; 0010000 周二; ... 0000001 星期六;
如果语料库只有 7 个不同的词,那么我只需要一个 7 位数的向量来表示每个词。然后,一个完整的句子可以由所有向量的合取来表示,这就是一个句子矩阵。 但是,我在 Python 中尝试过,似乎不起作用...
我该如何解决这个问题?我的语料库有很多不同的词。
顺便说一句,如果向量大部分用零填充,我们可以使用 Scipy.Sparse 来减小存储空间,例如 CSR。
因此,我的整个问题将是:
语料库中的句子如何用OneHotEncoder表示,并存储在SparseMatrix中?
谢谢大家
为了使用 OneHotEncoder,您可以将文档拆分为标记,然后将每个标记映射到一个 ID(对于相同的字符串,该 ID 始终相同)。然后将 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.]]