word2sequence 把字符串转换数字编码

2024-05-26 15:32

本文主要是介绍word2sequence 把字符串转换数字编码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 地址: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 把字符串转换数字编码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004861

相关文章

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu