陶瓷企业 瓷砖地板公司网站建设,网站建设做到哪些内容,老师教学生做网站吗,江苏建设工程材料网站目录
一、项目介绍
1、项目任务
2、评论信息内容
3、待思考问题
1#xff09;目标
2#xff09;输入字词格式
3#xff09;每一次传入的词/字的个数是否就是评论的长度
4#xff09;一条评论如果超过32个词/字怎么处理#xff1f;
5#xff09;一条评论如果…目录
一、项目介绍
1、项目任务
2、评论信息内容
3、待思考问题
1目标
2输入字词格式
3每一次传入的词/字的个数是否就是评论的长度
4一条评论如果超过32个词/字怎么处理
5一条评论如果没有32个词/字怎么处理
6如果语料库中的词/字太多是否可以压缩
7被压缩的词/字如何处理
二、项目实施
1、读取文件建立词表
1代码内容
2部分内容拆分解析
3代码运行结果
4调试模式
2、评论删除、填充切分数据集
1代码内容
2运行结果
3调试模式 一、项目介绍
1、项目任务 对微博评论信息的情感分析建立模型自动识别评论信息的情绪状态。 2、评论信息内容 3、待思考问题 1目标 将每条评论内容转换为词向量。 2输入字词格式 每个词/字转换为词向量长度(维度)200使用腾讯训练好的词向量模型有4960个维度需要这个模型或者文件可私信发送。 3每一次传入的词/字的个数是否就是评论的长度 应该是固定长度如何固定长度接着看固定长度每次传入数据与图像相似例如输入评论长度为32那么传入的数据为32*200的矩阵表示这一批词的独热编码200表示维度 4一条评论如果超过32个词/字怎么处理 超出的直接删除后面的内容 5一条评论如果没有32个词/字怎么处理 缺少的内容统一使用一个数字非词/字的数字替代项目中使用PAD填充 6如果语料库中的词/字太多是否可以压缩 可以某些词/字出现的频率比较低可能训练不出特征。因此可以选择频率比较高的词来训练项目中选择4760个。 7被压缩的词/字如何处理 可以统一使用一个数字非词/字的数字替代即选择了评论固定长度的文字后这段文字内可能有频率低的字将其用一个数字替代项目内使用UNK替代 二、项目实施
1、读取文件建立词表 1代码内容 将下列代码写入命名为vocab_create.py的文件内方便见名知义及调用内部函数
from tqdm import tqdm # 导入进度条函数
import pickle as pkl # 将序列化对象保存为一个二进制字节流文件MAX_VOCAB_SIZE 4760 # 词表长度限制长度总共10000个无重复的字
UNK,PAD UNK,PAD # 未知字padding符号 今天天气真好我咁要去打球-今天天气真好我UNK要去打球PADPADPADPADPADdef build_vocab(file_path,max_size,min_freq): # 参数分别表示文件地址、词表最大长度、剔除的最小词频数函数功能:基于文本内容建立词表vocabvocab中包含语料库中的字”tokenizer lambda x: [y for y in x] # 定义了一个函数tokenizer功能为分字返回一个列表存放每一个字vocab_dic {} # 用于保存字的字典键值对键为词值为索引号with open(file_path,r,encodingUTF-8) as f: # 打开评论文件i 0for line in tqdm(f): # 逐行读取文件内容并显示循环的进度条if i 0: # 跳过文件中的第1行表头无用内容然后使用continue跳过当前当次循环i 1continuelin line[2:].strip() # 使用字符串切片获取评论内容剔除标签和逗号不用split分割因为评论内容中可能会存在逗号。if not lin: # 如果lin中没有内容则continue表示没有内容跳过这一行continuefor word in tokenizer(lin): # 遍历列表里的每一个元素tokenizer(lin)将每一行的评论中的每个字符分成单独的一个然后存入列表vocab_dic[word] vocab_dic.get(word,0)1 # 统计每个字出现的次数并以字典保存字典的get用法读取键word对应的值如果没有读取到则将其值表示为0这里的值表示出现次数因为这里每出现一次值都加1键独一无二值可以相同# 筛选词频大于1的并排序字典中每个字的值的大小降序排列,(拆分见下一条代码块)vocab_list sorted([_ for _ in vocab_dic.items() if _[1] min_freq],keylambda x:x[1],reverseTrue)[:max_size] # 先通过for循环加if条件语句筛选出字典的值大于传入参数min_freq的键值对列表然后对其排序最后取出前max_size个元素# 建立新的字典vocab_dic {word_count[0]:idx for idx,word_count in enumerate(vocab_list)} # 列表中存放每个元素是一个元组元组里存放的是键值对的信息将每个元组遍历出来给予索引0的值一个索引以此给每个字符打上索引值返回一个字典vocab_dic.update({UNK:len(vocab_dic),PAD:len(vocab_dic)1}) # 在字典中更新键值对 {UNK:4760,PAD:4761}print(vocab_dic) # 打印全新的字典# 保存字典方便直接使用pkl.dump(vocab_dic,open(simplifyweibo_4_moods.pkl,wb)) # 此时统计了所有的文字并将每一个独一无二的文字都赋予了独热编码将上述的字典保存为一个字节流文件print(fVocab size:{len(vocab_dic)}) # 将评论的内容根据你现在词表vocab_dic,转换为词向量return vocab_dic # 输入文件地址对内部文件进行处理设定最大长度返回该文件里的所有独一无二的字符及其对应的索引的字典其中包含两个填充字符及其索引一个是填充未知字一个是填充符号词库的创建
# 此处设置下列判断语句来执行的目的是为了防止外部函数调用本文件时运行下列代码
if __name__ __main__: # 当自己直接执行本文件代码会运行main,中的代码vocab build_vocab(simplifyweibo_4_moods.csv,MAX_VOCAB_SIZE,1)print(vocab)# 如果是调用本代码则不会执行main中的代码 2部分内容拆分解析
vocab_list sorted([_ for _ in vocab_dic.items() if _[1] min_freq],keylambda x:x[1],reverseTrue)[:max_size]vocab_list [] # 空列表存放元组形式的空列表
for a in vocab_dic.items(): # 遍历出来字典中的键值对用a表示if a[1] min_freq: # 判断键值对的值是否大于min_freqvocab_list.append(a)
vocab_list sorted(vocab_list,keylambda x:x[1],reverseTrue) # 使用sorted函数排序key表示排序的依据使用匿名函数并索引键值对的值排序reverse为布尔值是否降序
vocab_list vocab_list[ : max_size] # 索引前max_size个值 3代码运行结果 4调试模式 2、评论删除、填充切分数据集 1代码内容 将下列代码放入创建的文件名为load_dataset.py的文件中后面还有代码需要往里增加
from tqdm import tqdm
import pickle as pkl
import random
import torchUNK,PAD UNK,PAD # 未知字padding符号
def load_dataset(path,pad_size70): # path为文件地址pad_size为单条评论字符的最大长度contents [] # 用来存储转换为数值标号的句子元祖类型里面存放每一行每一个字的对应词库的索引、每一行对应的标签、每一行的实际长度70及以内vocab pkl.load(open(simplifyweibo_4_moods.pkl,rb)) # 读取vocab词表文件rb二进制只读tokenizer lambda x:[y for y in x] # 自定义函数用来将字符串分隔成单个字符并存入列表with open(path,r,encodingutf8) as f: # 打开评论文件i 0for line in tqdm(f): # 遍历文件内容的每一行同时展示进度条if i 0: # 此处循环目的为了跳过第一行的无用内容i 1continueif not line: # 筛选是不是空行空行则跳过continuelabel int(line[0]) # 返回当前行的标签整型content line[2:].strip(\n) # 取出标签和逗号后的所有内容同时去除前后的换行符words_line [] # 用于存放每一行评论的每一个字对应词库的索引值token tokenizer(content) # 将每一行的内容进行分字返回一个列表seq_len len(token) # 获取一行实际内容的长度if pad_size: # 非0即Trueif len(token) pad_size: # 如果一行的字符数少于70则填充字符PAD填充个数为少于的部分的个数token.extend([PAD]*(pad_size-len(token)))else: # 如果一行的字大于70则只取前70个字token token[:pad_size] # 如果一条评论种的宁大于或等于70个字索引的切分seq_len pad_size # 当前评论的长度# word to idfor word in token: # 遍历实际内容的每一个字符words_line.append(vocab.get(word,vocab.get(UNK))) # vocab为词库其中为字典形式使用get去获取遍历出来的字符的值值可表示索引值如果该字符不在词库中则将其值增加为字典中键UNK对应的值words_line中存放的是每一行的每一个字符对应的索引值contents.append((words_line,int(label),seq_len)) # 将每一行评论的字符对应的索引以及这一行评论的类别还有当前评论的实际内容的长度以元组的形式存入列表random.shuffle(contents) # 随机打乱每一行内容的顺序切分80%训练集、10%验证集、10%测试集train_data contents[ : int(len(contents)*0.8)] # 前80%的评论数据作为训练集dev_data contents[int(len(contents)*0.8):int(len(contents)*0.9)] # 把80%~90%的评论数据集作为验证数热test_data contents[int(len(contents)*0.9):] # 90%~最后的数据作为测试数据集return vocab,train_data,dev_data,test_data # 返回词库、训练集、验证集、测试集数据集为列表中的元组形式if __name__ __main__:vocab,train_data,dev_data,test_data load_dataset(simplifyweibo_4_moods.csv)print(train_data,dev_data,test_data)print(结束)2运行结果 3调试模式