当前位置:   article > 正文

05-基于pytorch的文本情感分类_文本情感分析英文数据集

文本情感分析英文数据集

目录

1.案例介绍

2.思路分析

3.准备数据集

3.1 基础Dataset的准备

3.2 文本序列化

4.构建模型


1.案例介绍

或者数据存在百度网盘中glove.6B.50d.txt_免费高速下载|百度网盘-分享无限制 (baidu.com)

                                提取码:p1ua

关于文本分类(情感分析)的英文数据集汇总:(2条消息) 关于文本分类(情感分析)的英文数据集汇总_饭饭童鞋的博客-CSDN博客_英文文本分类数据集

2.思路分析

3.准备数据集

3.1 基础Dataset的准备

  1. import jieba
  2. from keras.datasets import imdb#情感文本分类数据集
  3. import torch,os,re
  4. from torch.utils.data import DataLoader,Dataset
  5. def tokenlize(content):
  6. re.sub('<.*?>',' ',content)#将特殊字符替换成空格
  7. fileters=["\.",":",'\t','\n','\x97','\x96','#','$','%','&']#删去这些字符
  8. content=re.sub('|'.join(fileters),' ',content)
  9. tokens=[i.strip() for i in content.split()]
  10. return tokens
  11. class ImdbDataset(Dataset):
  12. def __init__(self,train=True):
  13. self.train_data_path=r'D:\各种编译器的代码\pythonProject12\机器学习\NLP自然语言处理\datas\IMDB文本情感分类数据集\aclImdb\train'
  14. self.test_data_path=r'D:\各种编译器的代码\pythonProject12\机器学习\NLP自然语言处理\datas\IMDB文本情感分类数据集\aclImdb\test'
  15. data_path=self.train_data_path if train else self.test_data_path
  16. #1.把所有的文件名放入列表
  17. temp_data_path=[os.path.join(data_path,'pos'),os.path.join(data_path,'neg')]#不需要\符号了 两个文件夹
  18. self.total_file_path=[]#所有评论文件的path
  19. for path in temp_data_path:
  20. file_name_list=os.listdir(path)
  21. file_path_list=[os.path.join(path,i) for i in file_name_list if i.endswith('.txt')]#当前文件夹中所有的文件名字
  22. self.total_file_path.extend(file_path_list)#正例 负例文件名字都在
  23. def __getitem__(self, index):
  24. file_path=self.total_file_path[index]
  25. #获取label
  26. label_str=file_path.split("\\")[-2]
  27. label=0 if label_str=='neg' else 1#文本类型数字化
  28. #获取内容
  29. tokens=tokenlize(open(file_path,'r',encoding='utf8').read())
  30. return tokens,label
  31. def __len__(self):
  32. return len(self.total_file_path)
  33. def collate_fn(batch):
  34. """
  35. :param batch:([tokens,label],[tokens,label]...)
  36. :return:
  37. """
  38. content,label=zip(*batch)
  39. return content,label
  40. def get_dataloader(train=True):
  41. imdb_dataset=ImdbDataset(train)
  42. data_loader=DataLoader(imdb_dataset,batch_size=2,shuffle=True,collate_fn=collate_fn)
  43. return data_loader
  44. if __name__ == '__main__':
  45. for idx,(input,target) in enumerate(get_dataloader()):
  46. print(idx)
  47. print(input)
  48. print(target)
  49. break

3.2 文本序列化

  1. """
  2. 实现的是:构建字典,实现方法把句子转化为数字序列和其翻转
  3. """
  4. class Word2Sequence:
  5. UNK_TAG='UNK'#不常见的单词 标记
  6. PAD_TAG="PAD"#padding填充,即测试集中遇到新单词 标记
  7. UNK=0
  8. PAD=1
  9. def __init__(self):
  10. self.dict={
  11. self.UNK_TAG:self.UNK,
  12. self.PAD_TAG:self.PAD
  13. }
  14. self.count={}#统计词频
  15. def fit(self,sentence):
  16. """
  17. 把单个句子保存到dict中
  18. :param sentence:[word1,word2,word3,...]
  19. :return:
  20. """
  21. for word in sentence:
  22. self.count[word]=self.count.get(word,0)+1
  23. def build_vocab(self,min=5,max=None,max_features=None):
  24. """
  25. 生成词典
  26. :param min:最小出现的次数
  27. :param max:最大出现的次数
  28. :param max_features:一共保留多少个词语
  29. :return:
  30. """
  31. #删除count中词频小于min的word
  32. if min is not None:
  33. self.count={word:value for word,value in self.count.items() if value>min}
  34. #删除count中词频大于max的word
  35. if max is not None:
  36. self.count={word:value for word,value in self.count.items() if value<max}
  37. #限制保留的词语数
  38. if max_features is not None:
  39. temp=sorted(self.count.items(),key=lambda x:x[-1],reverse=True)[:max_features]#降序,按照values值
  40. self.count=dict(temp)#转换为字典
  41. for word in self.count:
  42. self.dict[word]=len(self.dict)
  43. #得到一个翻转的字典
  44. self.inverse_dict=dict(zip(self.dict.values(),self.dict.keys()))
  45. def transform(self,sentence,max_len=None):
  46. """
  47. 把句子转化为数字序列
  48. :param sentence:[word1,word2,...]
  49. :param max_len:int,对句子进行填充或裁剪裁剪
  50. :return:
  51. """
  52. if max_len is not None:
  53. if max_len>len(sentence):#填充
  54. sentence=sentence+[self.PAD_TAG]*(max_len-len(sentence))
  55. elif max_len<len(sentence):#裁剪
  56. sentence=sentence[:max_len]
  57. return [self.dict.get(word,self.UNK) for word in sentence]
  58. def inverse_transform(self,indices):
  59. """
  60. 把序列转化为句子
  61. :param indices:[1,2,3,4,...]
  62. :return:
  63. """
  64. return [self.inverse_dict.get(idx) for idx in indices]
  65. if __name__ == '__main__':
  66. ws=Word2Sequence()
  67. ws.fit(['我', '是', '谁'])
  68. ws.fit(['我', '是', '我'])
  69. ws.build_vocab(min=0)
  70. print(ws.dict)
  71. ret=ws.transform(['我','爱','北京'],max_len=10)
  72. print(ret)
  73. ret=ws.inverse_transform(ret)
  74. print(ret)

4.构建模型

  1. '''
  2. 定义模型
  3. '''
  4. import torch
  5. import torch.nn as nn
  6. from lib import ws,max_len
  7. import torch.nn.functional as F
  8. from torch.optim import Adam
  9. from dataset import get_dataloader
  10. class MyModel(nn.Module):
  11. def __init__(self):
  12. super(MyModel,self).__init__()
  13. self.embedding=nn.Embedding(len(ws),100)
  14. self.fc=nn.Linear(max_len*100,2)
  15. def forward(self,*input):
  16. """
  17. :param input:[batch_size,max_len]
  18. :return:
  19. """
  20. x=self.embedding(input)#进行embedding操作,形状:[batch_size,max_len,100]
  21. x=x.view([-1,max_len*100])
  22. out=self.fc(x)
  23. return F.log_softmax(out,dim=-1)
  24. model=MyModel()
  25. optimizer=Adam(model.parameters(),lr=0.001)
  26. def train(epoch):
  27. for idx,(input,target) in enumerate(get_dataloader(train=True)):
  28. optimizer.zero_grad()#梯度归0
  29. output=model(input)
  30. loss=F.nll_loss(output,target)
  31. loss.backward()
  32. optimizer.step()
  33. print(loss.item())
  34. if __name__ == '__main__':
  35. for i in range(1):
  36. train(i)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/417398
推荐阅读
相关标签
  

闽ICP备14008679号