【NLP02-文本处理的基本方法】

文本处理的基本方法

1、文本预处理

1.1、什么是分词

就是将连续的字序列按照一定的规范重新组合成词序列的过程

1.2、分词的作用

词作为语言语义理解最小单位,是人类理解文本语言的基础

1.3、流行中文词jieba

import jieba
content ="公信处女干事每月经过下属科室都要清口交代24口交换机等技术性器件的安排工作"
jieba.lcut(content,cut_all=False) #精确
jieba.lcut(content,cut_all=True) #全模式
jieba.lcut_for_search(content) 
import jieba
content="八一双鹿更名为八一南昌篮球队"
jieba.load_userdict('D:/data/usedict.txt')
jieba.lcut(content) #精确

1.4、中英文分词工具hanlp

import hanlp
tokenizer=hanlp.load('CTB6_CONVSEG')
tokenizer("公信处女干事每月经过下属科室都要清口交代24口交换机等技术性器件的安排工作")

2、命名实体识别

命名实体:通常我们将人名,地名,机构名等专有名词统称命名实体,如周杰伦

命名实体识别(NER):识别出一段文本中可能存在的命名实体

2、文本张量

2.1、什么是文本张量表示

讲一段文本使用张量进行表示,其中一般将词汇表示成向量,称作词向量,再由各个词向量按顺序组成矩阵形成文本表示。

2.2、文本张量表示作用

将文本表示成张量(矩阵)形式,能够使语言文本可以作为计算机处理程序的输入,进行接下来一系列的解析工作

2.3、文本张量表示的方法

one-hot编码 word2vec word embedding

2.4、one-hot词向量表示

又称独热编码,将每个词表示成具有n个元素的向量,这个词向量中只有一个元素是1,其它元素都是0,不同词汇元素为0的位置不同,其中n的大小是整个语料中不同词汇的总数。

from sklearn.externals import joblib
from keras.preprocessing.text import Tokenizer
import joblib#初始化一个词汇表
vocab ={"周杰伦","陈奕迅","王力宏","李宗盛","吴亦凡","鹿晗"}t=Tokenizer(num_words=None,char_level=False)t.fit_on_texts(vocab)for token in vocab:zero_list =[0] * len(vocab)token_index=t.texts_to_sequences([token])[0][0] -1zero_list[token_index] =1print(token,"的one-hot编码为:",zero_list)tokenizer_path="./Tokenizer"
joblib.dump(t,tokenizer_path)#导入用于对象保存用于加载的包
import joblib
t=joblib.load("./Tokenizer")
token ="李宗盛"
#从词汇映射中得到李宗盛的index
token_index=t.texts_to_sequences([token])[0][0] -1
#初始化全0向量
zero_list=[0]*6
zero_list[token_index]=1
print(token,"的one-hot编码为:",zero_list)
2.4.1、one-hot编码的优劣势

优势:操作简单,容易理解

劣势:完全割裂了词与词之间的联系,而且在大语料集下,每个向量的长度过大,占据打了内存。

2.5、什么是word2vec

是一种流行的将词汇表示成向量的无监督训练方法,该过程将构建神经网络模型,将网络参数作为词汇的向量表示,它包含CBOW和skipgram两种训练模式。

CBOM(continuous bag of words)模式:给定一段用于训练的文本语料,再选定某段长度(窗口)作为研究对象,使用上下文词汇预测目标词汇

skipgram模式

给定一段用于训练的文本语料,再选定某段长度(窗口)作为研究对象,使用目标词汇预测上下文词汇

2.6、使用fasttext工具实现word2vec的训练和使用

1、获取训练数据 2、训练词向量 3、模型超参数设定

4、模型效果检验 5、模型的保存与重加载

2.7、什么是word embedding(词嵌入)

通过一定的方式将词汇映射到指定维度(一般是更高维度)的空间

广义的word embedding包括所有密集词汇向量的表示方法,如之前学习的word2vec,即可认为是word embedding的一种。

狭义的word embedding是指在神经网络中加入的embedding层,对整个网络进行训练的同时产生的embedding矩阵(embedding层的参数),这个embedding矩阵就是训练过程中所有输入词汇的向量表示组成的矩阵

3、文本情感分析

3.1、文本数据分析作用:

文本数据分析能够有效帮助我们理解数据语料,快速检查出语料可能存在的问题,并指导之后模型训练过程中一些超参数的选择

3.2、常用的文本数据分析方法

标签数量分布 句子长度分布 词频统计与关键词词云

3.3、基于真实的中文酒店评论语料进行几种文本数据分析方法

1、获得训练集和验证集的标签数量分布

2、获得训练集和验证集的句子长度分布

3、获得训练集和验证集的正负样本长度散点分布

4、获得训练集和验证集的不同词汇总数统计

5、获得训练集上正负的样本的高频形容词词云

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt#设置显示风格
plt.style.use('fivethirtyeight')#分别读取训练tsv和验证tsv
train_data = pd.read_csv("D:/data/cn_data/train.tsv",sep="\t")
valid_data = pd.read_csv("D:/data/cn_data/dev.tsv",sep="\t")#获取训练数据标签数量分布
sns.countplot("label",data=train_data)
plt.title("train_data")
plt.show()#获取验证数据标签数量分布
sns.countplot("label",data=valid_data)
plt.title("valid_data")
plt.show()#在训练数据中添加新的句子长度列,每个元素的值都是对应的句子列的长度
train_data["sentence_length"]=list(map(lambda x:len(x),train_data["sentence"]))#绘制句子长度列的数量分布图
sns.countplot("sentence_length",data=train_data)#主要关注count长度分布的纵坐标,不需要绘制横坐标,横坐标范围通过dist图进行查看
plt.xticks([])
plt.show()#绘制dist长度分布图
sns.distplot(train_data["sentence_length"])#主要关注dist长度分布横坐标,不需要绘制纵坐标
plt.yticks([])
plt.show()#在验证数据中添加新的句子长度列,每个元素的值都是对应的句子列的长度
valid_data["sentence_length"] = list(map(lambda x:len(x),valid_data["sentence"]))#绘制句子长度列的数量分布图
sns.countplot("sentence_length",data=valid_data)
#主要关注count长度分布的纵坐标,不需要绘制横坐标,横坐标范围通过dist图进行查看
plt.sticks([])
plt.show()#绘制dist长度分布图
sns.distplot(valid_data["sentence_length"])
plt.ysticks([])
plt.show()#获取训练集和验证集的政府样本长度散点分布
#训练集
sns.stripplot(y='sentence_length',x='label',data=train_data)
plt.show()#验证集
sns.stripplot(y='sentence_length',x='label',data=valid_data)
plt.show()#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))#获得训练集上正负样本的高频词云
#使用jieba中的词性标注功能
import jieba.posseg as pseg
def get_a_list(text):"""用于获取形容词列表"""#使用jieba词性标注方法切分文本,获得具有词性属性flag和词汇属性word的对象,从而判断flag是否为形容词,来返回对应的词汇r=[]for g in pseg.lcut(text):if g.flag == "a":   #a表示形容词r.append(g.word)return r#导入绘制词云的工具包
from wordcloud import WordCloud
def get_word_cloud(keywords_list):#实例化绘制词云的类,其中参数font_path是字体路径,为了能够显示中文#max_words指词云图像最多显示多少个词,backgroud_color为背景颜色wordcloud = WordCloud(font_path='D:\data\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()#获得训练集上正样本
p_train_data = train_data[train_data["label"]==1]["sentence"]#对正样本的每个句子的形容词
train_p_a_vocab = chain(*map(lambda x: get_a_list(x),p_train_data))#获得训练集上负样本
n_train_data=train_data[train_data["label"] == 0]["sentence"]##对负样本的每个句子的形容词
train_n_a_vocab = chain(*map(lambda x: get_a_list(x),n_train_data))#调用绘制词云函数
get_word_cloud(train_p_a_vocab)
get_word_cloud(train_n_a_vocab)

4、文本特征处理

4.1、文本特征处理的作用

文本特征处理包括为语料添加具有普遍性的文本特征,如n-gram特征,以及对加入特征之后的文本语料进行必要的处理,如长度规范。这些特征处理工作能够有效的将重要的文本特征加入模型训练中,增强模型评估指标。

4.2、常见的文本特征处理方法

添加n-gram特征 文本长度规范

4.3、什么是n-gram特征

给定一段文本序列,其中n个词或字的相邻共现特征即n-gram特征,常见的n-gram特征是bi-gram(2元特征)和tri-gram(3元特征)特征,对应n为2和3.

举个例子

ngram_range=2
def create_ngram_set(input_list):return set(zip(*[input_list[i:] for i in range(ngram_range)]))input_list=[1,3,2,1,5,3]
res=create_ngram_set(input_list)
print(res)

4.4、文本长度规范及其作用

一般模型的输入需要等尺寸大小的矩阵,因此在进入模型前需要对每条文本数值映射后的长度进行规范,此时将根据句子长度分布分析出覆盖绝大多数文本的合理长度,对超长文本进行截断,对不足文本进行补齐(一般使用数字0),这个过程就是文本长度规范

from keras.preprocessing import sequence
#cutlen根据数据分析中句子长度分布,覆盖90%左右语料的最短长度
#这里假定cutlen为10
cutlen=10
def padding(x_train):"""description:对输入文本张量进行长度规范:param x_train: 文本的张量表示,形如:[[1,32,32,61],[2,54,31,7,19]]:return: 进行截断补齐后的文本张量表示"""#使用sequence.pad_sequences即可完成return sequence.pad_sequences(x_train,cutlen)#假定x_train里面有两条文本,一条长度大于10,一天小于10
x_train = [[1,23,5,32,55,63,2,21,78,32,23,1],[2,32,1,23,1]]
res =padding(x_train)
print(res)

5、文本数据增强

回译数据增强法:回译数据增强法是文本数据增强方面效果较好的增强方法,一般基于google翻译接口,将文本数据翻译成另外一种语言(一般选择小语种),之后再翻译回原语言,即可认为得到与与原语料同标签的新语料,新语料加入到原数据集中即可认为是对原数据集数据增强

优势:操作简便,获得新语料质量高

存在问题:再短文本回译过程中,新语料与原语料可能存在很高的重复率,并不能有效增大样本的特征空间

解决办法:进行连续翻译 如中文->韩文->英文

#假设取两条已经存在的正样本和两条负样本,将基于这四条样本产生新的同标签的四条样本
p_sample1 ="酒店设施非常不错"
p_sample2 ="这家价格很便宜"
n_sample1 ="拖鞋都发霉了,太差了"
n_sample2 ="电视不好用,没看到足球"#导入google翻译接口工具
from googletrans import Translator
#实例化翻译对象
translator = Translator()
#进行第一次批量翻译,翻译目标是韩语
translations = translator.translate([p_sample1, p_sample2, n_sample1, n_sample2], dest="ko")
#获得翻译后的结果
ko_result = list(map(lambda x: x.text,translations))
#打印结果
print("中间翻译结果:")
print(ko_result)#最后在翻译回中文,完成回译全部流程
translations = translator.translate(ko_result, dest='zh-cn')
cn_res = list(map(lambda x: x.text, translations))
print("回译得到的增强数据:")
print(cn_res)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Python 编写网络爬虫:从入门到实战

网络爬虫是一种自动化获取网页信息的程序,通常用于数据采集、信息监控等领域。Python 是一种广泛应用于网络爬虫开发的编程语言,具有丰富的库和框架来简化爬虫的编写和执行过程。本文将介绍如何使用 Python 编写网络爬虫,包括基本原理、常用库…

机器学习资料

Matplotlib 教程 | 菜鸟教程 https://www.cnblogs.com/wang_yb/p/17666711.html numpy: nhttps://www.cnblogs.com/wang_yb/p/17515408.html NumPy 中文文档 (numpy123.com) pandas: https://www.cnblogs.com/wang_yb/p/17371731.html scikit-learn …

SQL IN 参数超过2100的解决方案

在SQL Server或者MySQL中,当你在IN子句中需要处理的结果集可能超过2100个元素时,由于SQL Server对IN子句中的参数数量存在大约2100个左右的限制,直接使用IN会导致错误。为了解决这个问题,可以采取以下策略: 1、将参数…

实地研究降本增效的杀伤力,LSTM算法实现全国失业率分析预测

前言 ​ 降本增效降本增笑?增不增效暂且不清楚,但是这段时间大厂的产品频繁出现服务器宕机和产品BUG确实是十分增笑。目前来看降本增效这一理念还会不断渗透到各行各业,不单单只是互联网这块了,那么对于目前就业最为严峻的一段时…

Spring--设计模式

一、简介 设计模式是软件工程领域的一组最佳实践,它们提供了一种通用解决方案来解决常见问题。Spring框架中融入了多种设计模式,以增强其灵活性、可扩展性和可重用性。 二、单例模式 Spring的单例模式指的是:确保一个类只有一个实例&#…

zynq7000 neon 裸机编译

最近想用zynq7000跑下neon,所以就开始折腾。 因为ne10不能用在裸机上,所以盯上了cmsis_dsp。因为这个库可以在cortex-a和cortex-m上面跑,而zynq7000用的是cortex-a9。应该是可以跑的。在这里特别感谢大佬的文章,少走不少弯路。 …

android api 34 编译ffmpeg with libfdk-aac

利用ffmpeg-android-maker编译,地址Javernaut/ffmpeg-android-maker: Contains a script that assembles FFmpeg library for Android (github.com)libfdk-aac编译脚本 #!/bin/bash NDK$ANDROID_NDK_HOME # 这里需要替换成你本地的 NDK 路径 HOST_TAGlinux-x86_64…

Cinema 4D 2024 for mac/Win:开启三维动画与建模新纪元

在数字化时代,三维动画与建模已成为影视、游戏、广告等多个领域不可或缺的创作工具。而Cinema 4D,作为这一领域的佼佼者,始终以其卓越的性能和创新的功能引领着行业的发展。如今,Cinema 4D 2024的发布,更是为我们带来了…

键盘映射工具KeyTweak的使用,把F9和F10改为 Home、End

如果你的笔记本没有Home、End键 对于写文字和写代码影响还是比较大的 下面使用键盘映射工具KeyTweak 把F9和F10分别改为 Home、End 然后点击ok 电脑重启后 就生效了 很好用 完美解决 小尺寸笔记本 的按键少的烦恼 可以自己再琢磨琢磨 去映射 符合自己需求的按键 软件下载链接&…

全屏时框架的message alert 下拉框失效问题

在工作中将#app div设为全屏后,elementUI的message和alert和下拉框展开都不见了,解决方法是将设为全屏 // 全屏 function fullScreen() { let el document.documentElement; //之前是#app // console.log(el.requestFullscreen); let refs el.request…

【早鸟优惠|高录用|EI稳定检索】2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)诚邀投稿/参会!

【早鸟优惠|高录用|EI稳定检索】 2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)诚邀投稿/参会! # 早鸟优惠 # 先投稿先送审 # #投稿免费参会、口头汇报及海报展示# 2024年虚拟现实、图像和信号处理国际学术会议(I…

Golang案例开发之gopacket抓包入门(1)

文章目录 前言一、gopacket是什么?二、gopacket前提二、实践 枚举主机上网络设备的接口1、代码2、结果文档 总结 前言 说起网络抓包,我们一定听过大名鼎鼎的Tcpdump和WireShark。他们分别是Linux平台和Windows平台的抓包工具。 Wireshark抓包工具&…

杉德支付配合调查 - 数字藏品服务

最近,数字收藏品平台淘派发布了一则公告,宣布支付通道杉德已暂停接口服务,以配合调查。 近期发现多个异常账户,涉嫌盗取他人信息和银行卡,利用平台从事非法交易。淘派已第一时间报警,协助警方追回资金(回执…

idea maven 项目融合

背景 :项目A 和项目B 是两个独立的多模块项目,项目A 和项目B ,均为独立的数据源 。其中项目B 有两个数据原。 需要将项目B 以多模块的方式融合进项目A。 解决版本。建立项目C,只含有pom的,空项目,项目A和项…

RPM与DNF的操作实践

这几课有三个目标: 第一步:先配置软件源 跳转到yum.repos.d目录,用vim创建一个openeuler_x84_64.repo文件。这个文件就是我们将会用到的软件源。 我们在里面添加这些东西,保存并退出即可。 然后,我们用yum list all就…

深入理解nginx的请求限速模块[下]

目录 3. 源码分析3.1 配置指令3.1.1 limit_req_zone指令3.1.2 limit_req指令3.1.3 limit_req_dry_run指令3.1.4 limit_req_log_level指令3.1.5 limit_req_status指令3.2 模块初始化3.3 请求处理3.3.1 ngx_http_limit_req_handler3.3.1 ngx_http_limit_req_lookup3.3.2 ngx_http…

阿里云发布 AI 编程助手 “通义灵码”——VSCode更强了 !!

文章目录 什么是 通义灵码(TONGYI Lingma) 快速体验“通义灵码” 什么是“通义灵码”(TONGYI Lingma) 通义灵码(TONGYI Lingma),是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff…

C语言字符函数和字符串函数以及内存函数(全是代码版):一篇文章让你秒懂基础!

JAMES别扣了-CSDN博客(个人主页) 💕在校大学生一枚。对IT有着极其浓厚的兴趣 ✨系列专栏目前为C语言初阶、后续会更新c语言的学习方法以及c题目分享. 😍希望我的文章对大家有着不一样的帮助,欢迎大家关注我&#xff0c…

【Java常用API】正则表达式练习

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

【TypeScript系列】混入

混入 Table of contents 介绍 混入示例 理解示例 介绍 ↥ 回到顶端 除了传统的面向对象继承方式,还流行一种通过可重用组件创建类的方式,就是联合另一个简单类的代码。 你可能在Scala等语言里对mixins及其特性已经很熟悉了,但它在Java…