文本预处理

article/2025/8/25 4:45:52

文本预处理

1 词向量表示

1.1 word2vec之skipgram方式:

  • 定义:给你一段文本,选定特定的窗口长度,然后利用中间词来预测上下文

  • 实现过程:1、选定一个窗口长度:3、5、7等;2、指定词向量的维度:人为规定

 

  • 获取词向量

1.2 Fasttext实现word2vec的训练

  • 基本过程:

    • 导包:fasttext

    • 获取数据集

    • 训练和保存

    • 加载使用

    # 导入fasttext
    import fasttext
    ​
    def dm_fasttext_train_save_load():# 1 使用train_unsupervised(无监督训练方法) 训练词向量mymodel = fasttext.train_unsupervised('./data/fil9')print('训练词向量 ok')
    ​# 2 save_model()保存已经训练好词向量 # 注意,该行代码执行耗时很长 mymodel.save_model("./data/fil9.bin")print('保存词向量 ok')
    ​# 3 模型加载mymodel = fasttext.load_model('./data/fil9.bin')print('加载词向量 ok')
    ​
    ​
    # 步骤1运行效果如下:
    有效训练词汇量为124M, 共218316个单词
    Read 124M words
    Number of words:  218316
    Number of labels: 0
    Progress: 100.0% words/sec/thread:   53996 lr:  0.000000 loss:  0.734999 ETA:   0h 0m
    ​

1.3 WordEmbedding词向量

  • 定义:将词映射到指定维度的空间:词向量的一种表示方法

  • 实现过程

    def dm02_nnembeding_show():
    ​# 1 对句子分词 word_listsentence1 = '传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能'sentence2 = "我爱自然语言处理"sentences = [sentence1, sentence2]
    ​word_list = []for s in sentences:word_list.append(jieba.lcut(s))# print('word_list--->', word_list)
    ​# 2 对句子word2id求my_token_list,对句子文本数值化sentence2idmytokenizer = Tokenizer()mytokenizer.fit_on_texts(word_list)# print(mytokenizer.index_word, mytokenizer.word_index)
    ​# 打印my_token_listmy_token_list = mytokenizer.index_word.values()print('my_token_list-->', my_token_list)
    ​# 打印文本数值化以后的句子sentence2id = mytokenizer.texts_to_sequences(word_list)print('sentence2id--->', sentence2id, len(sentence2id))
    ​# 3 创建nn.Embedding层embd = nn.Embedding(num_embeddings=len(my_token_list), embedding_dim=8)# print("embd--->", embd)# print('nn.Embedding层词向量矩阵-->', embd.weight.data, embd.weight.data.shape, type(embd.weight.data))
    ​# 4 创建SummaryWriter对象 词向量矩阵embd.weight.data 和 词向量单词列表my_token_listsummarywriter = SummaryWriter()summarywriter.add_embedding(embd.weight.data, my_token_list)summarywriter.close()
    ​# 5 通过tensorboard观察词向量相似性# cd 程序的当前目录下执行下面的命令# 启动tensorboard服务 tensorboard --logdir=runs --host 0.0.0.0# 通过浏览器,查看词向量可视化效果 http://127.0.0.1:6006
    ​print('从nn.Embedding层中根据idx拿词向量')# # 6 从nn.Embedding层中根据idx拿词向量for idx in range(len(mytokenizer.index_word)):tmpvec = embd(torch.tensor(idx))print('%4s'%(mytokenizer.index_word[idx+1]), tmpvec.detach().numpy())

  • 可视化:

    • 工具:tensorboard

    • 命令: tensorboard --logdir=runs --host 0.0.0.0

2 文件数据分析

定义:

文本数据分析能够有效帮助我们理解数据语料, 快速检查出语料可能存在的问题,

2.1 获取标签数量分布

作用

在深度学习模型评估中: 我们一般使用ACC作为评估指标, 若想将ACC的基线定义在50%左右, 则需要我们的正负样本比例维持在1:1左右, 否则就要进行必要的数据增强或数据删减.

代码实现:

def dm_label_sns_countplot():
​# 1 设置显示风格plt.style.use('fivethirtyeight')plt.style.use('fivethirtyeight')
​# 2 pd.read_csv 读训练集 验证集数据train_data = pd.read_csv(filepath_or_buffer = './cn_data/train.tsv', sep='\t')dev_data = pd.read_csv(filepath_or_buffer = './cn_data/dev.tsv', sep='\t')
​# 3 sns.countplot() 统计label标签的0、1分组数量sns.countplot(x='label', data = train_data)
​# 4 画图展示 plt.title() plt.show()plt.title('train_label')plt.show()
​# 验证集上标签的数量分布# 3-2 sns.countplot() 统计label标签的0、1分组数量sns.countplot(x='label', data = dev_data)
​# 4-2 画图展示 plt.title() plt.show()plt.title('dev_label')plt.show()

2.2 获取句子长度分布

作用

通过绘制句子长度分布图, 可以得知我们的语料中大部分句子长度的分布范围, 因为模型的输入要求为固定尺寸的张量,合理的长度范围对之后进行句子截断补齐(规范长度)起到关键的指导作用.

代码实现

def dm_len_sns_countplot_distplot():# 1 设置显示风格plt.style.use('fivethirtyeight')plt.style.use('fivethirtyeight')
​# 2 pd.read_csv 读训练集 验证集数据train_data = pd.read_csv(filepath_or_buffer='./cn_data/train.tsv', sep='\t')dev_data = pd.read_csv(filepath_or_buffer='./cn_data/dev.tsv', sep='\t')
​# 3 求数据长度列 然后求数据长度的分布train_data['sentence_length'] =  list( map(lambda x: len(x), train_data['sentence']))
​# 4 绘制数据长度分布图-柱状图sns.countplot(x='sentence_length', data=train_data)# sns.countplot(x=train_data['sentence_length'])plt.xticks([]) # x轴上不要提示信息# plt.title('sentence_length countplot')plt.show()
​# 5 绘制数据长度分布图-曲线图sns.displot(x='sentence_length', data=train_data)# sns.displot(x=train_data['sentence_length'])plt.yticks([]) # y轴上不要提示信息plt.show()
​# 验证集# 3 求数据长度列 然后求数据长度的分布dev_data['sentence_length'] = list(map(lambda x: len(x), dev_data['sentence']))
​# 4 绘制数据长度分布图-柱状图sns.countplot(x='sentence_length', data=dev_data)# sns.countplot(x=dev_data['sentence_length'])plt.xticks([])  # x轴上不要提示信息# plt.title('sentence_length countplot')plt.show()
​# 5 绘制数据长度分布图-曲线图sns.displot(x='sentence_length', data=dev_data)# sns.displot(x=dev_data['sentence_length'])plt.yticks([])  # y轴上不要提示信息plt.show()

2.3 获取正负样本散点图分布

作用

通过查看正负样本长度散点图, 可以有效定位异常点的出现位置, 帮助我们更准确进行人工语料审查.

代码实现

def dm03_sns_stripplot():# 1 设置显示风格plt.style.use('fivethirtyeight')plt.style.use('fivethirtyeight')
​# 2 pd.read_csv 读训练集 验证集数据train_data = pd.read_csv(filepath_or_buffer='./cn_data/train.tsv', sep='\t')dev_data = pd.read_csv(filepath_or_buffer='./cn_data/dev.tsv', sep='\t')
​# 3 求数据长度列 然后求数据长度的分布train_data['sentence_length'] = list(map(lambda x: len(x), train_data['sentence']))
​# 4 统计正负样本长度散点图 (对train_data数据,按照label进行分组,统计正样本散点图)sns.stripplot(y='sentence_length', x='label', data=train_data)plt.show()
​sns.stripplot(y='sentence_length', x='label', data=dev_data)plt.show()

2.4 获取不同词汇总数统计

代码实现

# 导入jieba用于分词
# 导入chain方法用于扁平化列表
import jieba
from itertools import chain
​
# 进行训练集的句子进行分词, 并统计出不同词汇的总数
train_vocab = set(chain(*map(lambda x: jieba.lcut(x), train_data["sentence"])))
print("训练集共包含不同词汇总数为:", len(train_vocab))
​
# 进行验证集的句子进行分词, 并统计出不同词汇的总数
valid_vocab = set(chain(*map(lambda x: jieba.lcut(x), valid_data["sentence"])))
print("训练集共包含不同词汇总数为:", len(valid_vocab))

2.5 获取数据集形容词词云

# 使用jieba中的词性标注功能
import jieba.posseg as pseg
from wordcloud import WordCloud
​
# 每句话产生形容词列表
def get_a_list(text):r = []
​# 使用jieba的词性标注方法切分文本 找到形容词存入到列表中返回for g in pseg.lcut(text):if g.flag == "a":r.append(g.word)return r
​
# 根据词云列表产生词云
def  get_word_cloud(keywords_list):# 实例化词云生成器对象wordcloud = WordCloud(font_path="./SimHei.ttf", max_words=100, background_color='white')# 准备数据keywords_string = " ".join (keywords_list)# 产生词云wordcloud.generate(keywords_string)
​# 画图plt.figure()plt.imshow(wordcloud, interpolation="bilinear")plt.axis('off')plt.show()
​
​
# 思路分析 训练集正样本词云 训练集负样本词云
# 1 获得训练集上正样本 p_train_data
#   eg: 先使用逻辑==操作检索符合正样本 train_data[train_data['label'] == 1]
# 2 获取正样本的每个句子的形容词 p_a_train_vocab = chain(*map(a,b))
# 3 调用绘制词云函数
def dm_word_cloud():# 1 获得训练集上正样本p_train_data#   eg: 先使用逻辑==操作检索符合正样本 train_data[train_data['label'] == 1]train_data = pd.read_csv(filepath_or_buffer='./cn_data/train.tsv', sep='\t')p_train_data = train_data[train_data['label'] == 1 ]['sentence']
​# 2 获取正样本的每个句子的形容词 p_a_train_vocab = chain(*map(a,b))p_a_train_vocab = list(chain(*map(lambda x: get_a_list(x) , p_train_data)))# print(p_a_train_vocab)# print(list(p_a_train_vocab))
​# 3 调用绘制词云函数get_word_cloud(p_a_train_vocab)
​
​print('*' * 60 )# 训练集负样本词云n_train_data = train_data[train_data['label'] == 0 ]['sentence']
​# 2 获取正样本的每个句子的形容词 p_a_train_vocab = chain(*map(a,b))n_a_train_vocab = chain(*map(lambda x: get_a_list(x) , n_train_data)  )# print(n_a_dev_vocab)# print(list(n_a_dev_vocab))
​# 3 调用绘制词云函数get_word_cloud(n_a_train_vocab)

作用:

根据高频形容词词云显示, 我们可以对当前语料质量进行简单评估, 同时对违反语料标签含义的词汇进行人工审查和修正, 来保证绝大多数语料符合训练标准


http://www.hkcw.cn/article/ZetogNHLte.shtml

相关文章

C++中单例模式详解

在C中,单例模式 (Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这在需要一个全局对象来协调整个系统行为的场景中非常有用。 为什么要有单例模式? 在许多项目中,某些类从逻辑上讲只需要一个实…

什么是单片机?

众所周知,人类行为受大脑调控,正如视觉、听觉、味觉、嗅觉、触觉及运动功能等感官与肢体活动均受其指挥;换言之,大脑作为人体的中枢神经系统,负责管理所有可控制的生理功能。 在电子设备领域,单片机…

DMBOK对比知识点整理(4)

1.常见数据质量维度 常见数据质量维度(DMBOK-P353)质量维度

Web攻防-SQL注入增删改查盲注延时布尔报错有无回显错误处理

知识点: 1、Web攻防-SQL注入-操作方法&增删改查 2、Web攻防-SQL注入-布尔&延时&报错&盲注 案例说明: 在应用中,存在增删改查数据的操作,其中SQL语句结构不一导致注入语句也要针对应用达到兼容执行,另…

动态规划-152.乘积最大子数组-力扣(LeetCode)

一、题目解析 根据示例nums数组中存在负数,下面分析时需注意 二、算法原理 1、状态表示 此时f[i]表示:以i位置为结尾的所有子数组中的最大乘积,但是由于nums中存在负数,所以还需要g[i]表示:以i位置为结尾的所有子数组…

Leetcode 159. 至多包含两个不同字符的最长子串

1.题目基本信息 1.1.题目描述 给你一个字符串 s ,请你找出 至多 包含 两个不同字符 的最长子串,并返回该子串的长度。 1.2.题目地址 https://leetcode.cn/problems/longest-substring-with-at-most-two-distinct-characters/description/ 2.解题方法…

MATLAB 横向剪切干涉系统用户界面设计及其波前重构研究

▒▒本文目录▒▒ 一、横向剪切干涉系统效果预览二、引言三、横向剪切干涉理论基础四、MATLAB 横向剪切干涉系统用户界面设计五、参考文献六、实验指导与matlab代码获取 一、横向剪切干涉系统效果预览 开发的系统如下所示: 横向剪切干涉系统 二、引言 横向剪切干…

C54-动态开辟内存空间

1.malloc 原型&#xff1a;void* malloc(size_t size);&#xff08;位于 <stdlib.h> 头文件中&#xff09; 作用&#xff1a;分配一块连续的、未初始化的内存块&#xff0c;大小为 size 字节。 返回值&#xff1a; 成功&#xff1a;返回指向分配内存首地址的 void* 指针…

【Linux网络篇】:初步理解应用层协议以及何为序列化和反序列化

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;Linux篇–CSDN博客 文章目录 一.序列化和反序列化为什么需要序列化和反序列化为什么应用层…

【Tips】关于PCI和PCIe的配置空间差异和io/memory io读写

最近在看同事2023年讲的PCI基础课&#xff0c;感觉确实是豁然开朗了&#xff0c;赞美同事。 PCIe实际上是PCI的扩展&#xff08;extended&#xff09;&#xff0c;PCIe设备相当于是迭代升级产品。 而PCIe的配置空间基于PCI原有的0xFF&#xff08;256字节&#xff09;配置空间…

华为OD机试真题——阿里巴巴找黄金宝箱(III)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

拓扑排序算法剖析与py/cpp/Java语言实现

拓扑排序算法深度剖析与py/cpp/Java语言实现 一、拓扑排序算法的基本概念1.1 有向无环图&#xff08;DAG&#xff09;1.2 拓扑排序的定义1.3 拓扑排序的性质 二、拓扑排序算法的原理与流程2.1 核心原理2.2 算法流程 三、拓扑排序算法的代码实现3.1 Python实现3.2 C实现3.3 Java…

C#学习:基于LLM的简历评估程序

前言 在pocketflow的例子中看到了一个基于LLM的简历评估程序的例子&#xff0c;感觉还挺好玩的&#xff0c;为了练习一下C#&#xff0c;我最近使用C#重写了一个。 准备不同的简历&#xff1a; 查看效果&#xff1a; 不足之处是现实的简历应该是pdf格式的&#xff0c;后面可以…

华为OD机试真题——阿里巴巴找黄金宝箱(II)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现

最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现 一、网络流问题与相关概念1.1 网络流问题定义1.2 关键概念 二、Ford-Fulkerson算法原理2.1 核心思想2.2 算法步骤 三、Ford-Fulkerson算法的代码实现3.1 Python实现3.2 C实现3.3 Java实现 四、Ford-Fulkerson算法的时间…

摄像头模块的镜头类型

一、‌按光学功能分类‌ ‌球面镜&#xff08;Spherical Lens&#xff09;‌ ‌特点‌&#xff1a;表面为球面曲率&#xff0c;工艺简单且成本低&#xff0c;但存在球面像差和色差&#xff0c;边缘画质易模糊。 ‌应用‌&#xff1a;低端监控设备、玩具相机等对画质要求低的…

汽车EPS系统的核心:驱动芯片的精准控制原理

随着科技的飞速发展&#xff0c;电机及其驱动技术在现代工业、汽车电子、家用电器等领域扮演着越来越重要的角色。有刷马达因其结构简单、成本低廉、维护方便等优点&#xff0c;在市场上占据了一定的份额。然而&#xff0c;为了充分发挥有刷马达的性能&#xff0c;一款高效能、…

51c视觉~3D~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13954440 #SceneTracker 在4D时空中追踪万物&#xff01;国防科大提出首个长时场景流估计方法 本篇分享 TPAMI 2025 论文​​SceneTracker: Long-term Scene Flow Estimation Network​​&#xff0c;国防科大提出首…

【25-cv-05855】Keith律所代理Paula Alejandra Navarro 版权图

Paula Alejandra Navarro 版权图 案件号&#xff1a;25-cv-05855 立案时间&#xff1a;2025年5月27日 原告&#xff1a;Paula Alejandra Navarro 代理律所&#xff1a;Keith 原告介绍 原告是来自巴拿马的自由职业艺术家&#xff0c;擅长将精灵、中世纪服饰等经典奇幻元素…

vue自定义穿梭框(内容体+多选框)

最近需要做一个资源分配的一个功能&#xff0c;然后用到了穿梭框&#xff0c;但是需要更多的功能控制。具体业务场景如下&#xff1a;需要同时可以分配查看和下载的权限。实现效果如下&#xff1a; 组件用的是&#xff1a; Ant Design Vue 的穿梭框 操作方式&#xff1a;在左…