深度学习模型不会接收原始文本作为输入,它只能处理数值张量。文本向量化是指将文本转换为数值张量的过程。文本向量化实现方式如下常见2种:
一、sklearn处理英文分词
import os
import joblib
# 1. 加载文本数据
data = []
labels = []
# 替换路径
file_root_path = r"C:\Users\cerebrumWeaver\Downloads\20news-19997\20_newsgroups"
for folder in os.listdir(file_root_path):
folder_path = os.path.join(file_root_path, folder)
if os.path.isdir(folder_path):
for file in os.listdir(folder_path):
file_path = os.path.join(folder_path, file)
if os.path.isfile(file_path):
with open(file_path, "r", encoding='ISO-8859-1') as f: # 编码格式通过chardet库确认一下
text = f.read()
data.append(text)
labels.append(folder)
result = dict(data=data, labels=labels)
joblib.dump(result, r'D:\project\pycharm\tensorflow210\scikit_learn\joblib_files\20Newsgroups')
二、one-hot编码(独热编码)
one-hot编码是最常用、最基本的方法。此处不作纯python代码实现one-hot编码,而直接调用Keras深度学习API库,那是因为Keras库实现了许多重要的特性,比如从文本字符串中去除标点符号、只考虑文本字符串中出现频率最高的前N个常见词语(这是一种常用的限制,避免处理非常大的输入向量空间)。注意: 推荐使用Keras库而不是自己实现
keras实现代码:
from keras.preprocessing.text import Tokenizer
samples = ['大烩菜 的 定义 应该 是 路边摊 吧 ? 我 记得 他 师父 好像 就是 路边摊 。 谁 吃 个 烩菜 还 上 三 楼 呀',
'这 应该 不 可能 , 毕竟 得 办 营业执照 , 应该 能 跟 小 火锅 一样 挺 一段时间 吧 , 坚持 不 了 两周 [ 捂脸 ] [ 捂脸 ] [ 捂脸 ] [ 捂脸 ] , 大 烩饭 便宜 才会 多 人 吃',
'半个月 就 关门 了 , 赌 一把 卫龙 辣条',
'超市 呢 不交待 了',
'农村 三人行 开始 搞 起 “ 大烩菜 ” 了 ! 大家 猜 猜 这次 能够 坚持 多久 啊 ! \n “ 三人行 ” 创业 经历 了 太多 坎坷 , 屡 败 屡 战 啊 ! \n 1 、 横店 群演 , 失败 \n2 、 美团i外卖 , 失败 \n 3 、 火锅 店 , 失败 \n4 、 学 大车 , 失败 \n5 、 开 超市 , 失败\n6 、 卖 椰子 , 跑路\n7 、 进 厂 打工 , 失败 \n 这 三人 真是 “ 屡 败 屡 战 ” 的 典范 啊 ! 但是 现在 市场 的 萧条 大 环境 下 , 真 不 看好 他们 的 这次 创业 ! \n大胆 预测 : 坚持 不 了 一年 !']
tokenizer = Tokenizer(num_words=20, filters='!!“”"#¥$%&(())*+,,-。.、/::;;《<=》>??@【[\\】]……·^——_`{|}~\t\n')
tokenizer.fit_on_texts(samples) # 分词操作
sequences = tokenizer.texts_to_sequences(samples) # sequences的打印结果为word_index字典的values值
one_hot_results = tokenizer.texts_to_matrix(samples, mode='binary') # one-hot操作,是最终输入模型的数值型张量。sequences和word_index变量只是用于验证和复原one-hot实现细节,帮助你更好的理解one-hot编码
word_index = tokenizer.word_index
word_index
word_index打印结果如下图:
从结果来看,word_index是字典类型,见名知其意,字典keys是词语,字典values是索引。samples列表变量中的5个字符串总共被切分成了110个词语并将他们按出现的频率作递减排序。其中Tokenizer类中的参数filters用于过滤掉samples列表变量中的5个字符串夹带的特殊符号,这里包含了逗号、问号、感叹号等中文符号以及换行符\n,故你在word_index字典打印结果中没有看到这些特殊符号的存在。Tokenizer类中的参数num_words决定了one_hot_results向量最后一个维度的长度为20,寓意只取word_index前20个高频词语,注意这里不包括第20个词语,故word_index只有前19个单词会在one_hot_results索引为1的位置起,在相应位置处标记1,没有为one_hot_results索引编号0指定单词