本文关键词:文本数据预处理、中文文本预处理、自然语言处理
摘要: 要进行自然语言处理相关工作,文本数据预处理是个必不可少的过程。本文将对文本数据预处理相关的内容进行归纳整理,主要包括以下4个方面内容:
“巧妇难为无米之炊”,要做文本数据处理,首先需要获得文本数据。对于此问题,大家可以“八仙过海,各显神通”,借助一切合法、合理方式收集数据集。一般的,可以通过:自有数据整理、公开数据爬取和开源数据引用三个渠道获取数据。
自有数据:收集整理自有或者组织内部的可用数据集。
爬取数据:爬虫是获取数据的重要手段,但是在执行该操作前需遵守相关法规和Robots协议,在爬取数据后合法应用数据。通常,可以通过requests、BeautifulSoup4和Selenium等python工具完成绝大多数爬取任务。
图片豆瓣电影评论爬取可参考:
https://www.cnblogs.com/fengxi177/p/16939376.html
| 项目名 | 项目链接 | 项目概述 |
|---|---|---|
| CLUEDatasetSearch | https://github.com/CLUEbenchmark/CLUEDatasetSearch | 收集了众多中英文NLP数据集 |
| funNLP | https://github.com/fighting41love/funNLP | 分门别类的组织了众多的NLP数据集和项目 |
| awesome-chinese-nlp | https://github.com/crownpku/Awesome-Chinese-NLP | 收集了中文自然语言处理相关资料 |
| Chinese_medical_NLP | https://github.com/lrs1353281004/Chinese_medical_NLP | 收集了医疗NLP领域(主要关注中文)评测数据集与论文相关资源 |
由此,在收集好原始数据集后便可进行后续相关的NLP分析了。
特别的,数据集可以保存为txt、json、csv、tsv、sql表等等格式,只要你喜欢,都可以(哈哈哈,有些格式可能会比较占用内存,较大数据集时需要留意)。
图片此处分享一个csv超大文件数据读取技巧,即利用pandas的chunksize分块读取。
import pandas as pd
df = pd.read_csv("data.csv", chunksize=10000) # 每次读取1w行数据
for df_chunk in df:
print(df_chunk)
文本数据作为一种非结构化数据,除了特别处理过的数据集,大多数直接收集的文本数据会掺杂或多或少的无用信息,如果直接将其进行相关的文本分析于建模是无益的。通常,需要先对文本数据进行预处理操作。
文本数据预处理的主要目的一般有两个,即:
(1)将文本数据清洗干净(标准自定)
(2)将文本数据格式化(需求自定)
空格换行符,利用replace操作将原始文本中的空格、tab键、换行符\n、\r等与文本无关的字符直接替换为空。
无用信息剔除,如:停用词表构建。
标点符号去除,利用正则表达式去除标点符号,中英文标点符号可以通过如下两个方式获取。
中文标点符号:from zhon.hanzi import punctuation (需要安装包:pip install zhon)
英文标点符号:from string import punctuation
特别的,文本情感分析中,可保留有情感倾向的标点符号,如:?和!
在噪声数据中提取需要数据,利用正则表达式完成数据提取。如:只需要提取汉字时可以利用正则[\u4e00-\u9fa5]
简体繁体转换,可安装包:pip install opencc
英文数据:词形还原、大小写转换等 (推荐python包:NLTK)
至此,经过常规预处理后,文本数据会变的比较干净与规整,可以用于后续nlp研究与应用。(说明,适用于自己任务的操作才是必须的,其他的参照奥卡姆剃刀“如无必要,勿增实体”)。
前面介绍了通常情况下文本预处理可能涉及的注意点,但是要真正的做好数据预处理,应该与具体的任务相结合起来。比如:数据不平衡问题,数据增强问题、数据标注问题等等。
特别的,如需获得泛化性能好的模型,首先需要关注解决不平衡问题。
数据太少,那就需要利用规则和算法增强数据,使数据多样化。
对于文本预处理工作,目前已有一些专门的工具包,功能比较多样,大家可以试用一下,提升自己处理数据的效率和质量。
本文对文本预处理,特别是中文文本预处理做了一个简要的概述,希望于相关的nlper有所帮助。后续,将依次递进分享相应的NLP文章,敬请关注。

特别的,如本文有疏漏,麻烦留言指出,以期校正提升。
如看到文章的小伙伴有感兴趣的nlp主题,欢迎留言交流讨论,共同撰文分享。
原文首发于微信公众号:实用自然语言处理
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_