地址:http://ai.stanford.edu/~amaas/data/sentiment/,这是一份包含了5万条流行电影的评论数据,其中训练集25000条,测试集25000条。

1.准备数据

dataset.py

'''
准备数据
'''
from torch.utils.data import DataLoader,Dataset
import torch
import utils
import os
import config class ImdbDataset(Dataset):
def __init__(self,train = True):
data_path = r"H:\073-nlp自然语言处理-v5.bt38[周大伟]\073-nlp自然语言处理-v5.bt38[周大伟]\第四天\代码\data\aclImdb_v1\aclImdb"
super(ImdbDataset,self).__init__()
data_path += r"\train" if train else r"\test"
self.total_path = []
for temp_path in [r"\pos",r"\neg"]:
cur_path = data_path + temp_path
self.total_path +=[os.path.join(cur_path,i) for i in os.listdir(cur_path) if i.endswith(".txt")] def __getitem__(self, idx):
file = self.total_path[idx]
review = utils.tokenlize(open(file,encoding='utf-8').read())
label = int(file.split("_")[-1].split(".")[0])
# label = 0 if label <5 else 1
return review,label def __len__(self):
return len(self.total_path) # def collate_fn(batch):
# #batch是list,其中是一个一个元组,每个元组是dataset中__getitem__的结果
# batch = list(zip(*batch))
# labes = torch.tensor(batch[1],dtype=torch.int32)
# texts = batch[0]
# del batch
# return labes,texts def collate_fn(batch):
"""
对batch数据进行处理
:param batch: [一个getitem的结果,getitem的结果,getitem的结果]
:return: 元组
"""
reviews,labels = zip(*batch)
reviews = torch.LongTensor([config.ws.transform(i,max_len=config.max_len) for i in reviews])
labels = torch.LongTensor(labels) return reviews,labels def get_dataloader(train=True):
dataset = ImdbDataset(train)
batch_size = config.train_batch_size if train else config.test_batch_size
return DataLoader(dataset,batch_size=batch_size,shuffle=True,collate_fn=collate_fn) if __name__ == '__main__':
dataset = ImdbDataset()
dataloader = DataLoader(dataset=dataset, batch_size=2, shuffle=True,collate_fn=collate_fn)
# 3. 观察数据输出结果
for idx, (label, text) in enumerate(dataloader):
print("idx:", idx)
print("table:", label)
print("text:", text)
break

  

2.conf.py 文件

"""
配置文件
"""
import pickle train_batch_size = 512
test_batch_size = 500 ws = pickle.load(open("./model/ws.pkl","rb")) max_len = 80

  

3.utils.py分词文件

import re

def tokenlize(sentence):
'''
进行文本分词
:param sentence:
:return:
''' fileters = ['!', '"', '#', '$', '%', '&', '\(', '\)', '\*', '\+', ',', '-', '\.', '/', ':', ';', '<', '=', '>',
'\?', '@'
, '\[', '\\', '\]', '^', '_', '`', '\{', '\|', '\}', '~', '\t', '\n', '\x97', '\x96', '”', '“', ]
sentence = sentence.lower()
sentence = re.sub("<br />"," ",sentence)
sentence = re.sub("|".join(fileters)," ",sentence)
# result = sentence.split(" ")
#去除空字符串
result = [i for i in sentence.split(" ") if len(i)>0]
return result

  

4.word2sequence.py   句子中的词转换成数字编码

'''
文本序列化
'''
class Word2Sequence:
UNK_TAG = "<UNK>"
PAD_TAG = "<PAD>"
UNK = 0
PAD = 1 def __init__(self):
self.dict = {
#保存词语和对应的数字
self.UNK_TAG:self.UNK,
self.PAD_TAG:self.PAD
}
self.count = {} #统计词频的 def fit(self,sentence):
'''
接受句子,统计词频
:param sentence:
:return:
'''
for word in sentence:
self.count[word] = self.count.get(word,0) + 1 def build_vocab(self,min_count = 1,max_count = None,max_feature = None):
'''
根据条件构造 词典
:param min_count: 最小词频
:param max_count: 最大词频
:param max_feature: 最大词语数,这个参数会排序
:return:
''' if min_count is not None:
self.count = {word:count for word,count in self.count.items() if count >= min_count}
if max_count is not None:
self.count = {word:count for word,count in self.count.items() if count <= max_count}
if max_feature is not None:
self.count = dict(sorted(self.count.items(),lambda x:x[-1],reverse=True)[:max_feature]) for word in self.count.keys():
self.dict[word] = len(self.dict) #获取每个词及生成每个词对应的编号 #字典翻转,键→值,值←键
self.inverse_dict = dict(zip(self.dict.values(),self.dict.keys())) def transform(self,sentence,max_len = None):
'''
把句子转化为数字序列
:param sentense: [str,str,,,,,,,,,,]
:return: [num,num,num,,,,,,,]
'''
if len(sentence) > max_len:
sentence = sentence[:max_len]
else:
sentence = sentence + [self.PAD_TAG]*(max_len-len(sentence))
return [self.dict.get(i,0) for i in sentence] def inverse_transform(self,incides):
'''
把数字序列转化为字符
:param incides: [num,num,num,,,,,,,,]
:return: [str,str,str,,,,,,,]
'''
return [self.inverse_dict.get(i,"<UNK>") for i in incides] if __name__ == '__main__': sentences = [['今天','天气','很','好'],
['今天','去','吃','什么']] ws = Word2Sequence()
for sentence in sentences:
ws.fit(sentence)
ws.build_vocab()
print(ws.dict)
ret = ws.transform(["好","好","好","好","好","好","好","热","呀"],max_len=20)
print(ret)
ret = ws.inverse_transform(ret)
print(ret)

  

5. main主文件,把文件中的词转换成数字编码并保存

'''
文本序列化及保存模型
''' from word_sequence import Word2Sequence
from dataset import get_dataloader
import pickle
from tqdm import tqdm if __name__ == '__main__':
ws = Word2Sequence()
dl_train = get_dataloader(True)
dl_test = get_dataloader(False)
for label,reviews in tqdm(dl_train,total=len(dl_train)):
for review in reviews:
ws.fit(review)
for label,reviews in tqdm(dl_test,total=len(dl_train)):
for review in reviews:
ws.fit(review)
ws.build_vocab() pickle.dump(ws,open("./model/ws.pkl","wb"))

  

word2sequence 把字符串转换数字编码的更多相关文章

  1. Gson将字符串转换成JsonObject和JsonArray

    以下均利用Gson来处理: 1.将bean转换成Json字符串: public static String beanToJSONString(Object bean) { return new Gso ...

  2. JS 实现"可读"字符串转换成"二进制的01"字符串

    问题起源 看过一个漫画, 两位程序员在办公司交流, 可是说的语言却是010101类似的字符串.周围人很是惊异.计算机的世界,确实是由01组成的.今天突然想实现这个编码转换. 解决思路 学过C语言的都知 ...

  3. C标准库-数值字符串转换与内存分配函数

    原文链接:http://www.orlion.ga/977/ 一.数值字符串转换函数 #include <stdlib.h> int atoi(const char *nptr); dou ...

  4. js 字符串转换数字

    方法主要有三种转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对 ...

  5. List转换成json格式字符串,json格式字符串转换成list

    一.List转换成json字符串 这个比较简单,导入gson-x.x.jar, List<User> users = new ArrayList<User>(); Gson g ...

  6. PHP面试题之驼峰字符串转换成下划线样式例子

    自己在看到这个问题的时候,想到的是用ASCII码来处理,没往万能的正则上去想.好吧,下面来看看答案: 答案1: 代码如下 复制代码 $str = 'OpenAPI'; $length = mb_str ...

  7. js 字符串转换成数字的三种方法

    在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形 ...

  8. java-装箱/拆箱-字符串转换成基本数据类型

    一.理解java中包的含义及种类 java是一个面向对象编程,即一切皆是对象,那么有一个矛盾,从数据上划分知道java中的数据分为基本数据类型和引用数据类型,但是基本数据类型如何是一个对象呢?此时,就 ...

  9. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法

    用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...

随机推荐

  1. Maven多仓库配置(公司仓库和阿里云仓库)

    Maven多仓库配置(公司仓库和阿里云仓库) 一.之前的配置 之前maven本地的setting.xml的仓库配置,都是直接设置mirror节点 <mirrors> <mirror& ...

  2. 基于 HTML5 WebGL 的楼宇智能化集成系统(二)

    前言       一套完整的可视化操作交互上,必不可少 2D/3D 的融合,在上期我们介绍了有关 3D 场景的环视漫游.巡视漫游以及动画效果,还包括了冷站场景.热站场景以及智慧末端的实现原理,本期主要 ...

  3. docker安装Elasticsearch7.6集群并设置密码

    docker安装Elasticsearch7.6集群并设置密码 Elasticsearch从6.8开始, 允许免费用户使用X-Pack的安全功能, 以前安装es都是裸奔.接下来记录配置安全认证的方法. ...

  4. Java 连接数据库总是报错

    mysql账号密码是正确的,但是一直报账号密码错误. 报错信息: java.sql.SQLException: Access denied for user 'root'@'localhost' (u ...

  5. SpringCloud Alibaba01-Nacos

    全家桶介绍: https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html ...

  6. (js描述的)数据结构[哈希表1.2](9)

    一. 优秀的哈希函数 1.快速的计算: 需要快速的计算来获得对应的hashCode(霍纳法则来减少乘除次数) 2.均匀的分布: 尽可能将元素映射到不同的位置,让元素在哈希表中均匀分布 二.哈希表的扩容 ...

  7. Linux基础篇,磁盘及文件使用管理

    在windows系统下,我们可以使用图形化界面很明了的看出当前硬盘使用量与某个文件的占用空间大小和文件数量.但是在linux系统中,我们应该如何得到这些信息呢? 当然是功能强大的df与du了. 一.d ...

  8. 分治算法(C++版)

    #include<iostream>using namespace std;  void printArray(int array[],int length)  {      for (i ...

  9. 2015蓝桥杯分机号(C++C组)

    标题:分机号X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如:751,520,321 都满足要求,而,766,918,201 就不符合要求.现 ...

  10. Java第四天,随机数如何生成?ArrayList如何使用?

    虽然很多时候我们查阅Java API文档,但是对于一些必要的类,我们还是需要去了解的.因为这样的情况下,我们就可以尽量的去缩短开发的周期.接下来我们认识一下哪些API类是必须熟记的. Random 这 ...