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

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2