NLP基础1-词向量之序号化,One-Hot,BOW/TF,TF-IDF
NLP基础2-词向量之Word2Vec
NLP基础3-词向量之Word2Vec的Gensim实现
文章目录
前言
在分词之后,需要将文本数据转换成数值型数据。常用方式如下:
- 序号化、哑编码 (One-Hot)、
- 词袋法 (BOW/TF)、TF-IDF
- 主题模型 (LSA、LDA等)
- Word2Vec (重要)
- Char2Vec、Doc2Vec、FastText、cw2vec
一、序号化
1. 基本介绍
根据单词字典来序号化文本中的每个单词 (token):
- 字典:key:token,value:序号 (0,vocab_size)
- 序号的编号是从零到词汇表大小
- 其中包含特殊字符,比如说:
- <PAD>-表示填充字符,在每个批次中文本长度大小不一致,我们需要对他们进行填充补齐
- <UNK>-表示未知字符,也就是说该字符不存在单词词典中
- <NUM>-表示数字
- <PUN>-表示标点符号
- <SYMBOL>表示特殊字符
2. 举例说明
假设现在有已经经过分词后的三个文本:
[[“我”, “是”, “小明”],
[“我”, “来自”, “湖南”, “长沙”],
[“我”, “喜欢”, “辣椒”]]
根据单词词典:
dict = {“<\PAD>”: 0, “<\UNK>”: 1, “我”: 2, “湖南”: 3, “长沙”: 4, “是”: 5, “来自”: 6, “喜欢”: 7, “辣椒”: 8 , …}
那么对应三个文本序号化后就是
[[2, 5, 1, 0],
[2, 6, 3, 4 ],
[2, 7, 8, 0]]
其中:<\PAD>表示填充字符, <\UNK>未知字符
3. 代码实现
# 1. 得到分词后的文本
text = [["我", "是", "小明"],
["我", "来自", "湖南", "长沙"],
["我", "喜欢", "辣椒"]]
print("="*100)
print("text:")
print(text)
# 2. 构建词典
tokens = set()
for sentence in text:
for token in sentence:
tokens.add(token)
tokens = list(tokens) # {} → [] set转换为list
tokens.insert(0, "<PAD>") # 在第一个位置插入<PAD>
tokens.insert(1, "<UNK>") # 在第二个位置插入<UNK>
print("="*100)
print("tokens:")
print(tokens)
dict = {
token: i for i, token in enumerate(tokens)} # 构建字典
# dict = {token: i for i, token in zip(tokens, range(len(tokens)))}
print(