江东的笔记

Be overcome difficulties is victory

0%

《Python自然语言处理入门与实践》作业

5.17日作业:文本向量化,TF-IDF关键词提取,情感分类

《Python自然语言处理入门与实践》作业

作业一

1、将以下内容转为txt文本:

I could imagine his giving a friend a little pinch of the latest vegetable alkaloid,not out of malevolence,you understand,but simply out of a spirit of inquiry in order to have an accurate idea of the effects.

1
2
3
4
5
content = "I could imagine his giving a friend a little pinch of the latest vegetable alkaloid, not out of malevolence, you understand, but simply out of a spirit of inquiry in order to have an accurate idea of the effects."

# 将内容写入txt文件
with open('output.txt', 'w') as file:
file.write(content)

2、对内容进行分词,统计文本中的所有词语,进行独热编码,得到每个词的one-hot向量表示。

1
2
3
4
5
6
text = 'I could imagine his giving a friend a little pinch of the latest vegetable alkaloid,not out of malevolence,you understand,but simply out of a spirit of inquiry in order to have an accurate idea of the effects.'
lis = jieba.lcut(text)
label_encoder = LabelEncoder()
label_encoded = label_encoder.fit_transform(lis)
one_hot_encoder = OneHotEncoder()
one_hot_encoded = one_hot_encoder.fit_transform(label_encoded.reshape(-1, 1)).toarray()

3、将句子进行文本向量化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:杜培博
# datetime:2023/5/17 20:00
# software: PyCharm

import torch
from transformers import BertTokenizer, BertModel
model_name = "bert-base-cased" # 请替换为您的模型名称
tokenizer = BertTokenizer.from_pretrained(model_name)
text = "I could imagine his giving a friend a little pinch of the latest vegetable alkaloid,not out of malevolence,you understand,but simply out of a spirit of inquiry in order to have an accurate idea of the effects."
# 对文本进行分词并添加特殊标记(例如[CLS]和[SEP])
input_ids = tokenizer.encode(text, add_special_tokens=True)
# 将输入ID序列转换为BERT模型的输入
input_tensor = torch.tensor([input_ids])
# 加载预训练的BERT模型
model = BertModel.from_pretrained(model_name)
# 将输入序列传递给BERT模型并获取输出(1个句子的向量表示)
outputs = model(input_tensor)
# 获取第一个输出(即整个句子的向量表示)
last_hidden_state = outputs[0]
# 将输出张量展平以获取单个句子向量
sentence_vector = last_hidden_state.squeeze(0)
print("Sentence vector:", sentence_vector)

作业二

使用TF-IDF算法完成以下内容实现关键词的提取:

展望2035年,我国将基本实现社会主义现代化。经济实体、科技实力、综合国力将大幅跃升,经济总量和城乡居民人均收入将再迈上新的大台阶,关键核心技术实现重大突破,进入创新型国家前列。基本实现新型工业化、信息化、城镇化、农业现代化,建成现代化经济体系。基本实现国家治理体系和治理能力现代化,人民平等参与、平等发展,权利得到充分保障,基本建成法治国家、法治政府、法治社会。建成文化强国、教育强国、人才强国、体育强国、健康中国,国民素质和社会文明程序达到新高度,国家文化软实力显著增强。广泛形成绿色生产生活方式,碳排放达峰后稳中有降,生态环境根本好转,美丽中国建设目标基本实现。形成对外开放新格局,参与国际经济合作和竞争新优势明显增强。人均国内生产总值达到中等发达国家水平,中等收入群体显著扩大,基本公共服务实现均等化,城乡区域发展差距和居民生活水平差距显著缩小。平安中国建设达到更高水平,基本实现国防和军队现代化。人民生活更加美好,人的全面发展、全体人民共同富裕取得更为明显的实质性进展。经济发展取得新成效,发展是解决我国一切问题的基础和关键,发展必须坚持新民展理念,在质量效益明显提升的基础上实现经济持续健康发展,增长潜力充分发挥,国内生产总值年均增长保持在合理区间、各年度视情提出,全员劳动生产率增长高于国内生产总值增长,国内市场更加强大,经济结构更加优化,创新能力显著提升,全社会研发经费投入年增长7%以上、力争投入强度高于“十三五”时期实际,产业基础高级化、产业链现代化水平明显提高,农业基础更加稳固,城乡区域发展协调性明显增强,常住人中城镇化率提高到65%,现代化经济体系建设取得重大进展。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:杜培博
# datetime:2023/5/17 19:47
# software: PyCharm

import jieba
from jieba import analyse
import pandas as pd
text = '展望2035年,我国将基本实现社会主义现代化。经济实体、科技实力、综合国力将大幅跃升,经济总量和城乡居民人均收入将再迈上新的大台阶,关键核心技术实现重大突破,进入创新型国家前列。基本实现新型工业化、信息化、城镇化、农业现代化,建成现代化经济体系。基本实现国家治理体系和治理能力现代化,人民平等参与、平等发展,权利得到充分保障,基本建成法治国家、法治政府、法治社会。建成文化强国、教育强国、人才强国、体育强国、健康中国,国民素质和社会文明程序达到新高度,国家文化软实力显著增强。广泛形成绿色生产生活方式,碳排放达峰后稳中有降,生态环境根本好转,美丽中国建设目标基本实现。形成对外开放新格局,参与国际经济合作和竞争新优势明显增强。人均国内生产总值达到中等发达国家水平,中等收入群体显著扩大,基本公共服务实现均等化,城乡区域发展差距和居民生活水平差距显著缩小。平安中国建设达到更高水平,基本实现国防和军队现代化。人民生活更加美好,人的全面发展、全体人民共同富裕取得更为明显的实质性进展。经济发展取得新成效,发展是解决我国一切问题的基础和关键,发展必须坚持新民展理念,在质量效益明显提升的基础上实现经济持续健康发展,增长潜力充分发挥,国内生产总值年均增长保持在合理区间、各年度视情提出,全员劳动生产率增长高于国内生产总值增长,国内市场更加强大,经济结构更加优化,创新能力显著提升,全社会研发经费投入年增长7%以上、力争投入强度高于“十三五”时期实际,产业基础高级化、产业链现代化水平明显提高,农业基础更加稳固,城乡区域发展协调性明显增强,常住人中城镇化率提高到65%,现代化经济体系建设取得重大进展。'
lis = jieba.analyse.extract_tags(text, withWeight = True, topK=11) # 要求返回权重值

score = pd.DataFrame(columns=['名词','重要性'])

score['名词'] = [i[0] for i in lis]
score['重要性'] = [i[1] for i in lis]
score = score[1:]

from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文黑体
# plt.rcParams['axes.unicode_minus'] = False # 负值显示
plt.barh(score['名词'], score['重要性'], height=0.7, color="c",hatch="/",edgecolor='#005344') # 更多颜色可参见颜色大全
# plt.xlabel('feature importance') # x 轴
# plt.ylabel('features') # y轴
plt.title('TFIDF权重') # 标题
for a,b in zip( score['重要性'],score['名词']): # 添加数字标签
print(a,b)
plt.text(a+0.001, b,'%.3f'%float(a)) # a+0.001代表标签位置在柱形图上方0.001处
plt.show()

作业三

自定义函数sdwu_get_content(),分别读取data文件夹下的neg和pos文件夹中的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:杜培博
# datetime:2023/5/17 20:24
# software: PyCharm
import os
def sdwu_get_content(folder_name):
"""
读取指定文件夹中的文件内容并返回一个列表。
参数:
folder_name (str): 文件夹名称。
返回值:
list: 包含文件夹中所有文件内容的列表。
"""
content = []
# 遍历文件夹中的所有文件
for filename in os.listdir(folder_name):
# 如果文件是文本文件,则读取文件内容并添加到列表中
if filename.endswith(".txt"):
file_path = os.path.join(folder_name, filename)
with open(file_path, "r", encoding="utf-8") as f:
content.append(f.read())
return content

# 调用自定义函数并打印结果
neg_folder = "data/neg"
pos_folder = "data/pos"
neg_content = sdwu_get_content(neg_folder)
pos_content = sdwu_get_content(pos_folder)
print("neg_content:", neg_content)
print("pos_content:", pos_content)

作业四

考虑以下任务:给定一段英文文本,设计一个NLP应用程序,实现文本情感分析。程序应该能够分析文本中的情感并给出正面、负面或中性的情感标签。请描述你的解决方案的主要步骤,包括数据预处理、特征提取、模型选择和评估。

  1. 数据预处理:
    • 对评论文本进行长度分析,确定合适的评论长度。
    • 将数据集分割为训练集、验证集和测试集。
    • 进行数据预处理操作,如文本清洗、分词等。
  2. 模型选择和搭建:
    • 选择适用于英文情感分类的预训练模型,例如BERT、RoBERTa、GPT等。
    • 在选择预训练模型时,确保模型经过情感分类任务的微调或在英文情感分类数据上进行预训练。
    • 根据选定的预训练模型,在其之上添加适当的分类层。
  3. 特征提取:
    • 使用预训练模型对文本进行编码,获取文本的表示向量。
    • 可以选择只使用预训练模型的最后一层输出作为特征表示,或者结合多层输出进行特征提取。
  4. 模型训练和评估:
    • 选择适当的优化器和损失函数,例如AdamW优化器和交叉熵损失函数。
    • 使用训练集对模型进行训练,使用验证集评估模型的性能。
    • 监控模型的准确率、损失值等指标,可视化训练过程。
  5. 模型评估指标分析:
    • 根据验证集或测试集的真实标签和模型预测结果计算评估指标,如准确率、精确率、召回率和F1-score等。
  6. 对测试数据进行预测:
    • 使用训练好的模型对测试数据进行预测,并获取预测结果。