当前位置: 首页 > 编程日记 > 正文

NLP任务中的文本预处理步骤、工具和示例

作者 | Viet Hoang Tran Duong

来源 | DeepHub IMBA

头图 | CSDN付费下载于视觉中国

数据是新的石油,文本是我们需要更深入钻探的油井。文本数据无处不在,在实际使用之前,我们必须对其进行预处理,以使其适合我们的需求。对于数据也是如此,我们必须清理和预处理数据以符合我们的目的。这篇文章将包括一些简单的方法来清洗和预处理文本数据以进行文本分析任务。

我们将在Covid-19 Twitter数据集上对该方法进行建模。这种方法有3个主要组成部分:

首先,我们要清理和过滤所有非英语的推文/文本,因为我们希望数据保持一致。

其次,我们为复杂的文本数据创建一个简化的版本。

最后,我们将文本向量化并保存其嵌入以供将来分析。


清理和过滤文本

首先,为了简化文本,我们要将文本标准化为仅为英文字符。此函数将删除所有非英语字符。

def clean_non_english(txt):txt = re.sub(r'\W+', ' ', txt)txt = txt.lower()txt = txt.replace("[^a-zA-Z]", " ")word_tokens = word_tokenize(txt)filtered_word = [w for w in word_tokens if all(ord(c) < 128 for c in w)]filtered_word = [w + " " for w in filtered_word]return "".join(filtered_word)

我们甚至可以通过删除停止词来做得更好。停词是出现在英语句子中对意思没有多大帮助的常见词。我们将使用nltk包来过滤stopwords。由于我们的主要任务是使用word cloud将tweet的主题可视化,所以这一步需要避免使用“the,”“a,”等常见单词。但是,如果你的任务需要完整的句子结构,比如下一个单词预测或语法检查,你可以跳过这一步。

import nltk
nltk.download('punkt') # one time execution
nltk.download('stopwords')
from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))def clean_text(english_txt):try:word_tokens = word_tokenize(english_txt)filtered_word = [w for w in word_tokens if not w in stop_words]filtered_word = [w + " " for w in filtered_word]return "".join(filtered_word)except:return np.nan

对于tweets,在清理之前我们需要考虑一个特殊的特性:提及@。您的数据可能具有这样的特殊特性(也可能没有),这是具体情况,而不是普遍要求。因此,在盲目地清理和预处理数据之前,要充分了解您的数据!

def get_mention(txt):mention = []for i in txt.split(" "):if len(i) > 0 and i[0] == "@":mention.append(i)return "".join([mention[i] + ", " if i != len(mention) - 1 else mention[i] for i in range(len(mention))]

以前,我们清理非英文字符。现在,我们删除非英语文本(语义上)。Langdetect是一个python包,它允许检查文本的语言。它是谷歌的语言检测库从Java到Python的直接端移植。

from langdetect import detect
def detect_lang(txt):try:return detect(txt)except:return np.nan

然后我们过滤掉所有不是“en”语言的列。

简化复杂的数据

对于数值数据,良好的处理方法是缩放,标准化和规范化。此资源有助于理解并将这些方法应用于您的数据。在本文的讨论范围内,由于其他资源在此方面做得很好,因此我将不做进一步讨论。

对于分类数据,有许多方法。两种名义上的方法是标签编码器(为每个标签分配一个不同的编号)和一种热编码(以0和1的向量表示)。有关这些分类值的方法的更多详细信息,请参见此处。与我提到的这两种资源相比,此资源非常丰富,具有更多类型的编码。

这篇文章将介绍一些减少数据特别是位置数据复杂性的方法。在我的数据集中,有一列位置,带有作者的地址。但是,由于这些原始数据过于混乱和复杂(具有城市,县,州,国家/地区),因此我无法对其进行太多分析。因此,我们可以将文本标准化,并将其缩小到“国家”级别。处理位置数据的程序包是geopy。它可以识别正确的地址并将这些位置重新格式化为标准格式。然后,您可以选择保留所需的任何信息。对我来说,国家,国家足够体面。

from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="twitter")def get_nation(txt):try:location = geolocator.geocode(txt)x = location.address.split(",")[-1]return xexcept:return np.nan

向量化和嵌入

文本向量化将文本转换为值的向量以表示其含义。早些时候,我们有一种热编码方法,其向量的大小与我们的词汇量相同,在出现文本的任何地方都为1,在其他地方为0。如今,我们拥有更高级的方法,例如spacy,GloVe甚至bert嵌入。对于本项目的范围,我将向您介绍python和Jupiter笔记本中的GloVe。

首先,我们下载嵌入向量。您可以在此处手动下载或直接在笔记本中进行下载。

!wget http://nlp.stanford.edu/data/glove.6B.zip
!unzip glove*.zip

然后,我们创建一个向量矢量化每个数据点的函数。句子是每个单词的平均表示。对于空句子,我们将其默认为零向量。

def vectorize(value, word_embeddings, dim = 100):sentences = value.to_list()sentence_vectors = []for i in sentences:if len(i) != 0:v = sum([word_embeddings.get(w, np.zeros((dim,))) for w in     i.split()])/(len(i.split())+0.001)else:v = np.zeros((dim,))sentence_vectors.append(v)sentence_vectors = np.array(sentence_vectors)return sentence_vectors

最后,我们对整个数据集进行矢量化处理,并将矢量化的numpy数组另存为文件,因此我们不必在每次运行代码时都再次进行此过程。矢量化版本将以.npy文件的形式保存为numpy数组。Numpy包方便存储和处理海量数组数据。

作为我的个人标准做法,我尝试将每个部分之后的所有数据保存为单独的文件,以评估数据并更灵活地更改代码。

def vectorize_data(data = data, value = 'english_text', dim = 100):# Extract word vectorsword_embeddings = {}f = open('glove.6B.{}d.txt'.format(str(dim)), encoding='utf-8')for line in f:values = line.split()word = values[0]coefs = np.asarray(values[1:], dtype='float32')word_embeddings[word] = coefsf.close()   text_vec = vectorize(data[value], word_embeddings, dim)np.save("vectorized_{}.npy".format(str(dim)), text_vec)print("Done. Data:", text_vec.shape)return True

总结

数据预处理,特别是文本预处理,可能是一个非常麻烦的过程。机器学习工程师工作流程的很大一部分将用于这些清理和格式化数据(如果您的数据已经完全清理好了,那么,幸运的是,对于所有实现这一目标的工程师来说,他们都感到很荣幸)。

这篇文章中的所有代码都是非常抽象的,可以应用于许多数据项目(您只需更改列名,所有代码都可以正常工作)。在笔记本中,我还添加了异常功能来处理故障情况,以确保您的代码不会在中途崩溃。我希望它对您的项目有帮助,就像对我的帮助一样。

最后,所有的代码可以在这里找到:

https://github.com/viethoangtranduong/covid19-tweets

更多精彩推荐
  • 11.11大促来袭,京东如何保障云安全?

  • 算力至上?四大AI芯片大对决

  • 牛!发出中国第一封电子邮件,注册登记域名CN,中国互联网之父传奇

  • 2021年,很可能是以太坊的“高光之年”

  • SQL分页查询方案的性能对比

相关文章:

github设置添加SSH

https 和 SSH 的区别&#xff1a; 1、前者可以随意克隆github上的项目&#xff0c;而不管是谁的&#xff1b;而后者则是你必须是你要克隆的项目的拥有者或管理员&#xff0c;且需要先添加 SSH key &#xff0c;否则无法克隆。 2、https url 在push的时候是需要验证用户名和密码…

在asp.net中使用客户端脚本

我们常常在asp.net中需要使用到客户端脚本&#xff0c;在asp.net中使用客户端脚本很容易&#xff0c;使用到Page的RegisterClientScriptBlock方法就行了。下面是我写的一段C#代码,用来打开新窗口&#xff1a; using System; using System.Web.UI; namespace MyBill { …

一个DIV调用多个CSS样式

1使用以上两个CSS样式表对描述同一个DIV的写法class利用class可以对于同一个标签多重定义样式. 比如用1、2两种样式同时控制一个DIV&#xff0c;可以写成以下格式&#xff1a; <div class"1 2"> </div> 使用以上两个CSS样式表对描述同一个DIV&#xff0…

最新!百度首发 OCR 自训练平台 EasyDL OCR

今年以来&#xff0c;人工智能愈发火热。在2020年4月&#xff0c;政府已将人工智能基础设施列入新基建范围。在利好政策引导下&#xff0c;人工智能的应用范围越来越广。以 OCR&#xff08;文字识别技术&#xff09;为例&#xff0c;随着智能手机与各种端边电子产品的增多&…

性能测试初学_loadrunner base64/md5 编码 解码

参考这3篇文章&#xff1a; MD5&#xff1a; http://bbs.51testing.com/forum.php?modviewthread&tid1111323 base64&#xff1a; http://www.cnblogs.com/preftest/archive/2011/06/12/2079178.html http://www.51testing.com/html/41/15103841-3707341.html 主要思路为&…

ASP.NET管理状态的十种途径

HTTP协议是无状态的&#xff0c;ASP.NET提供了丰富的手段在页面之间管理状态。本文列举ASP.NET管理状态的十种途径。 ASP.NET中&#xff0c;从System.Web.UI.Page继承的类里有以下十种管理页面状态的途径&#xff1a; 1. Application对象: this.Application 2. …

sed学习系列---第3/3部分

为什么80%的码农都做不了架构师&#xff1f;>>> ---简介 在这篇 sed 系列的总结性文章中&#xff0c;Daniel Robbins 带您体验 sed 的真正力量。在介绍完几个重要的 sed 脚本之后&#xff0c;他将通过将一个 Quicken .QIF 文件转换成可读文本格式来演示一些基本 s…

11位科幻作家参与,首次AI人机共创写作实验启动

人工智能会怎样影响人类文学创作&#xff1f;人类智慧与机器智慧如何相互激发创作灵感&#xff1f; 10月27日&#xff0c;由传茂文化和创新工场联手打造的华语科幻AI人机共创写作实验项目《共生纪》启动&#xff0c;人类作家与AI算法将围绕环保、人机关系、性别、文化多样性等…

笔记之远程桌面服务(RDS)

Windows默认只能有2个用户同时通过RDP进行连接&#xff0c;非常不方便&#xff0c;于是借此机会学习了下Win2012R2的远程桌面配置。以下我把学习过程记录一下&#xff1a; 1. 最开始我觉得只需要安装“Remote Desktop Session Host”&#xff0c;事实证明这样没错&#xff0c;可…

用Asp.net 传送大文件

Chris Hynes我们在上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题&#xff0c;因为ASP.NET会block直到把整个文件载入内存后&#xff0c;再加以处理。实际上&#xff0c;如果文件很大的话&#xff0c;我们经常会见到Internet Explorer…

[转]Java Os Properties

2019独角兽企业重金招聘Python工程师标准>>> // File: io/properties/SysPropList.java // Description: Shows system properties. This must be an application. // An applet cant get this information. // Author: Fred Swartz // Date: 2 Feb…

思谋科技A轮融资超1亿美元 ,成为最年轻“准独角兽”AI企业

新一代视觉AI前沿技术公司——思谋科技今天宣布&#xff0c;已完成A轮融资。据知情人士透露&#xff0c;思谋科技此次融资金额超1亿美元&#xff0c;成为业内最年轻的“准独角兽”AI企业&#xff0c;本新投资方包括松禾资本、红杉资本中国基金、基石资本、闻天下投资等。今年6月…

C语言 · 征税程序

算法提高 征税程序 时间限制&#xff1a;1.0s 内存限制&#xff1a;512.0MB问题描述税务局希望你帮他们编写一个征税程序&#xff0c;该程序的功能是&#xff1a;首先输入某公司的年销售额sale和税率rate&#xff0c;然后程序将计算出相应的税额tax&#xff0c;并把它显示在…

在ASP.NET中随意创建图形信息

如果没有一个外部组件的支持&#xff0c;在ASP中是不能动态创建图形的&#xff0c;不管它是一个图表&#xff0c;一个横幅或仅仅是一个图形计数器。可喜的是&#xff0c;这一点在ASP.NET中改变了。现在&#xff0c;我们只需要使用内置功能&#xff0c;就能够很容易动态创建图形…

做动态图表没有数据?用Python就能获取

来源 | 法纳斯特&#xff08;ID:walker398&#xff09;刷爆全网的动态条形图&#xff0c;原来 5 行 Python 代码就能实现&#xff01;这是小F在国庆之前写的一篇文章&#xff0c;既然有了Python这个制作动态条形图工具&#xff0c;缺的那便是数据了。先看一下B站2019年「数据可…

CCTouchDispatcher sharedDispatcher 方法过期

//[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:selfpriority:0swallowsTouches:YES];转载于:https://www.cnblogs.com/sell/archive/2013/01/14/2…

哪些听起来像段子一样的故事?

杭州海底世界&#xff0c;一个小走廊两边都是各种爬行动物展览。有两只蜥蜴当时是这个样子人还年轻&#xff0c;还比较猥琐&#xff0c;看到一个趴在另一个身上就觉得在做什么羞羞的事。于是就拍下来&#xff0c;发到群里&#xff0c;然后说了句交配中。然后一天就光拍照&#…

立足高校矢志创新,鲲鹏计算生态长沙在行动

在今年&#xff0c;虽然全球经济发展受到疫情和国际形势变化影响增速减缓&#xff0c;但我国在AI、云计算、大数据、5G等前沿技术方面的发展却依然没有停下脚步。发展前沿技术&#xff0c;计算产业是基础。因此&#xff0c;培养计算产业人才成为当前全社会共同面对的一大关键。…

用好ASP.NET 2.0的URL映射

简介&#xff1a;   URL映射是ASP.NET 2.0中提供的新特性。URL映射技术帮助我们将一个特定URL映射为另一个URL。为了帮助理解&#xff0c;我们假设你在站点有一个叫Homepage.aspx的页面来访问主页&#xff0c;所有的用户也都用这个页面来访问你的主页。但由于某些原因&#x…

N皇后问题的位运算求解——目前最快的方法

核心代码如下&#xff1a; 1 void test(int row, int ld, int rd) 2 { 3 int pos, p; 4 if ( row ! upperlim ) 5 { 6 pos upperlim & (~(row | ld | rd )); 7 while ( pos ) 8 { 9 p pos & (~pos 1); 1…

cocos2d-x JS 获取当前系统时间(解决屏幕双击点击事件)

记录一下&#xff0c;好开心&#xff0c;感觉今天自己又学到东西了&#xff0c;对于屏幕双击事件本来还毫无头绪的&#xff0c;今天得以解决总算没白费加班&#xff0c;其实原理很简单&#xff1b;就是在点击事件里做一个判断&#xff0c;这个判断就是需要获取当前系统的时间的…

怎么样给下拉框加载背景色

选择自 PPLUNCLE 的 Blog 部分代码:------aspx页面&#xff1a; <tr> <td><select id“job“ name“job“ runat“server“></td></tr>说明&#xff1a;下拉框必须写成上面的形式&#xff0c;用<asp:dropdownlist....>不能实现------cs页…

Windows 7 部署(一):安装和部署简述

术语表&#xff1a; 英文缩写英文全称中文全称备注 MDT Microsoft Deployment Toolkit 微软部署工具包 免费&#xff0c;需要域环境及DHCP服务器(Port 66 and 67)&#xff0c;需要首先安装WAIK。使用MDT部署Windows 7时&#xff0c;也需要WDS&#xff0c;WDS主要负责推送WinP…

希捷发布CORTX对象存储软件与开源社区,普惠超大规模数据存储

数据存储和管理解决方案提供商希捷科技今日&#xff08;10月29日&#xff09;举行了“Let’s Rethink Data”希捷科技Datasphere线上峰会。在本次峰会&#xff0c;希捷科技携手行业专家与生态合作伙伴洞见数据产业趋势&#xff0c;并发布了对象存储软件CORTXTM以及CORTXTM开源社…

最优化:拉格朗日乘子法

作者&#xff1a;桂。 时间&#xff1a;2017-03-27 20:26:17 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/6628785.html 声明&#xff1a;欢迎被转载&#xff0c;不过记得注明出处哦~ 【读书笔记06】 前言 看到西蒙.赫金的《自适应滤波器原理》第四版第四章&#xf…

在Asp.Net中从sqlserver检索(retrieve)图片

介绍&#xff1a;这篇文章是我写的"如何把图片存入sqlServer中"的后续。我建议你在读这篇文章之前先看看那篇。和存储图片相比&#xff0c;读取图片就要简单多了。输出一副图片我们要做的就是使用Response对象的BinaryWrite方法。同时设置图片的格式。在这篇文章中&a…

华为鲲鹏产业生态加速算力升级,企业数字化转型在山西吹响号角

2020年&#xff0c;新基建风口已至&#xff0c;建设数字基础设施&#xff0c;打造数字产业生态是其关键与核心&#xff0c;而算力底座将成为其重要的运行支撑。数字化浪潮大背景下&#xff0c;鲲鹏计算产业生态&#xff0c;充满巨大的想象与发展空间。从企业数字化转型角度来看…

隐藏TabBar

在项目中经常遇到隐藏tabBar,实力很多种方法&#xff0c;可以解决不同情况下问题1&#xff1a;//隐藏tabBar WebViewController *webVc [[WebViewController alloc] init]; webVc.hidesBottomBarWhenPushed YES; [self.navigationController pushViewController:web…

Linux下安装JDK和Eclipse

安装Eclipse时前需要确保系统中已经具备Java运行环境&#xff0c;本文以干净系统初次安装Eclipse为例&#xff0c;同时安装JDK和Eclipse. 1.下载JDK压缩包&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/index.html  假设保存位置为&#xff1a;/hom…

如何在ASP.Net 中把图片存入数据库

介绍 可能有很多的时候&#xff0c;我们急需把图片存入到数据库当中。在一些应用程序中&#xff0c;我们可能有一些敏感的资料&#xff0c;由于存储在文件系统&#xff08;file system&#xff09;中的东西&#xff0c;将很容易被某些用户盗取&#xff0c;所以这些数据不能存…