当前位置: 首页 > news >正文

NLP基础知识——文本处理、张量表示、文本数据分析

文本分词

jieba分词
繁体、简体都可以
精确模式分词

#精确模式分词
import jieba
content='我来工作爱生活爱拉芳爱学习喜欢跳舞'
jieba.lcut(content,cut_all=False)
#全模式分词
jieba.lcut(content,cut_all=True)
#搜索引擎模式
jieba.lcut_for_search(content)
#自定义字典dict
jieba.load_userdict("./dict.txt")
jieba.lcut(content)

hanlp分词
基于tensorflow2.0

import hanlp
#zhongwen
tokenizer=hanlp.load('CTB6_CONVSEG')
tokenizer('我来工作爱生活,爱拉芳爱学习喜欢跳舞')
#英文
tokenizer=hanlp.utils.rules.tokenize_english
tokenizer('i love work and dog and wo')
#命名实体NER 也就是专有名词的划分
#中文
recognizer=hanlp.load(hanlp.pretrained.ner.MSRA_NER_BERT_BASE_ZH)
list('我来工作爱生活,爱拉芳爱学习喜欢跳舞')
recognizer(list('我来工作爱生活,爱拉芳爱学习喜欢跳舞'))
#英文
recognizer=hanlp.load(hanlp.pretrained.ner.COLL03_NER_BERT_BASE_UNCASED_EN)

词性标注

#中文的
#词性标注 动词、名词划分
import jieba.posseg as pseg
pseg.lcut("我爱工作爱生活爱学校")
#英文
tagger=hanlp.load(hanlp.pretrained.pos.PTB_POS_RNN_FASTTEXT_EN)

文本的张量表示

其实就是把文字变成数字,计算机才认识!!
one-hot编码
优缺点:操作简单,便于理解但是割裂了词与词的联系,占用内存大
假如4个词 ’我和小王‘
就可以表示为
我(1,0,0,0)
和(0,1,0,0)
以此类推的4*4的0-1矩阵

from sklearn.externals import joblib
#导入词汇映射器
from keras.preprocessing.text import Tokenizer
#初始化词汇表
vacal={"鹿晗","张翰","林更新"}
t=Tokenizer(num_words=None,char_level=False)
t.fit_on_text(vacal)
for token in vocal:zero_list=[0]*len(vocal)token_index=t.texts_to_sequences([token])[0][0]-1zero_list[token_index]=1
tokenizer_path='./e' #保存的位置
jolib.dump(t,tokenizer_path)

word2vec
无监督训练方法,将网络参数作为词汇的向量表示包括了cbow和skipgram。
CBOW步骤就是:如果i love nice day like ,假设窗口大小为3,则是i love nice 三个词,然后 i 和nice 作为输入,采用one-hot编码,(1,0,0,0,0)和(0,1,0,0,0)然后预测 love,以此内推,love nice day用love和day预测nice
skipgram的步骤和CBOW类似,输入和输出交换

 #lr表示学习率# 训练模型
import fasttest
model=fasttext.train_unsupervised(data,'cbow',dim=300,epoch=1,lr=0.05)
#训练完后检验,找到nice相关的词汇
model.get_nearest_neighbors('nice')
#保存模型
model.save_model('fil9.bin')
#用的时候直接调用
modelnew=fasttext.load_model('fil9.bin')

word embedding 词嵌入

# 导入torch和tensorboard导入进来
import torch
import json
import fileinput
from torch.utils.tensorboard import SummaryWriter# 实例化一个写入对象
writer = SummaryWriter()# 随机初始化一个100*50的矩阵, 将其视作已经得到的词嵌入矩阵
embedded = torch.randn(100, 50)# 导入事先准备好的100个中文词汇文件, 形成meta列表原始词汇
meta = list(map(lambda x: x.strip(), fileinput.FileInput("./vocab100.csv")))
writer.add_embedding(embedded, metadata=meta)
writer.close()

文本数据分析

也就是帮忙理解语调,标签正常不、特征丰富不、标签分类
下面以酒店评语的数据来进行文本分析

标签数量分布
酒店的评论有两列,第一列包括各种评论,第二列是评论的好坏 好的为1,不好的0

# 导入必备的工具包
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import jieba
# 设置显示风格
plt.style.use('fivethirtyeight')
# 利用pandas读取训练数据和验证数据
train_data = pd.read_csv("./cn_data/train.tsv", sep="\t")
valid_data = pd.read_csv("./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)
# plt.xticks([])
# plt.show()# 绘制dist长度分布图
# sns.distplot(train_data["sentence_length"])
# plt.yticks([])
# plt.show()
#---------------------------------=-----------------------
# 在验证数据中添加新的句子长度列, 每个元素的值对应句子的长度
valid_data["sentence_length"] = list(map(lambda x: len(x), valid_data["sentence"]))
# 绘制句子长度列的数量分布图
# sns.countplot("sentence_length", data=valid_data)
# plt.xticks([])
# plt.show()
# 绘制dist长度分布图
# sns.distplot(valid_data["sentence_length"])
# plt.yticks([])
# 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()

统计不同词汇的数量

# 进行训练集的句子进行分词, 并统计出不同词汇的总数
# 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的词性标注方法来切分文本, 获得两个属性word,flag# 利用flag属性去判断一个词汇是否是形容词r = []for g in pseg.lcut(text):if g.flag == '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(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)
#-------------------------------------------------------------
# 获取验证集的数据正样本
p_valid_data = valid_data[valid_data["label"]==1]["sentence"]# 获取正样本的每个句子的形容词
valid_p_a_vocab = chain(*map(lambda x: get_a_list(x), p_valid_data))# 获取验证集的数据负样本
n_valid_data = valid_data[valid_data["label"]==0]["sentence"]# 获取负样本的每个句子的形容词
valid_n_a_vocab = chain(*map(lambda x: get_a_list(x), n_valid_data))# 调用获取词云的函数
get_word_cloud(valid_p_a_vocab)
get_word_cloud(valid_n_a_vocab)

文本特征处理
包括语料、长度的处理
‘我 喜欢 工作’假设是【2,43,56】
1.n-gram特征:就是特征中假如到相邻的特征 而我和喜欢相邻假设是89 加到里面 喜欢和工作相邻假设是5 加入其中【2,43,56,89,5】

#n-gram
def creat_ngram_set(input_list):return set(zip(*[input_list[i:] for i in range(ngram_range)]))
input_list=[4,2,89,56,7]
#长度规范 能够覆盖90%以上的语料长度
假设是20,不足加0,长度大于20保留后面20个舍去前面的
cutlen=20
def padding(x_train):return sequence.pad_sequences(x_train,cutlen)

文本增强
回译数据增强,基于google翻译接口,将原始的中文句子翻译成另外一种语言如英语,然后又翻译回来
优势劣势:获得预料质量高,但是对于短文本可能重复率高,那么也可以中文变成英语,英语变韩文然后再变回中文

word1='我爱狗狗'
word2='她和他的家的东西'
from gooletrain import Translator
translator=Translator()
#ko是韩语
translations=translator.translate([word1,word2],dest='ko')
ko_result=list(map(lambda x:x.text,translations))
#翻译回来
translations=translator.translate(ko_result,dest='zh-cn')
cn_result=list(map(lambda x:x.text,translations))

新闻主题分类

看这一段新闻是哪一类的体育?财经?

相关文章:

  • 支持向量机 (SVM) 算法详解
  • 测试用例编写指导
  • PHP入门教程4:文件处理和表单处理
  • SPI协议——读取外部SPI Flash ID
  • Flink 窗口触发器
  • 【OpenHarmony开发】自定义系统应用之实践
  • 示例:WPF中绑定枚举到ComboBox想显示成中文或自定义名称如何实现
  • utf8和utf8mb4的主要区别
  • OceanBase 并行执行参数 parallel_servers_target 理解
  • git提交错了?别慌,直接删除提交记录
  • 机器学习实验--- 金融数据基础与计算在线实验闯关
  • git的Cherry pick
  • shell中的流程控制
  • numpy用savez_compressed压缩数据
  • 比较日志性能:Glog、Spdlog 和 ofstream 在不同硬件上的表现(推荐Spdlog)
  • [译]CSS 居中(Center)方法大合集
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 30秒的PHP代码片段(1)数组 - Array
  • CSS相对定位
  • express如何解决request entity too large问题
  • HTML-表单
  • Java 多线程编程之:notify 和 wait 用法
  • java概述
  • oldjun 检测网站的经验
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Redis 中的布隆过滤器
  • 翻译:Hystrix - How To Use
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 跨域
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 深度学习在携程攻略社区的应用
  • 深入浏览器事件循环的本质
  • 实战|智能家居行业移动应用性能分析
  • 试着探索高并发下的系统架构面貌
  • 小程序 setData 学问多
  • 责任链模式的两种实现
  • 1.Ext JS 建立web开发工程
  • ​iOS实时查看App运行日志
  • # include “ “ 和 # include < >两者的区别
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (007)XHTML文档之标题——h1~h6
  • (2)(2.10) LTM telemetry
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (多级缓存)缓存同步
  • (转)jdk与jre的区别
  • (转)Sublime Text3配置Lua运行环境
  • (转)详解PHP处理密码的几种方式
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .Net中的设计模式——Factory Method模式