浅谈NLP 文本分类/情感分析 任务中的文本预处理工作
浅谈NLP 文本分类/情感分析 任务中的文本预处理工作
前言
之所以心血来潮想写这篇博客,是因为最近在关注NLP文本分类这类任务中的文本预处理工作,想总结一下自己的所学所想,老规矩,本博文记载仅供备忘与参考,不具备学术价值,本文默认使用python3编程(代码能力是屎山级别的,请谅解),默认文本为英文,代码主要使用Pytorch(博主老笨蛋了,之前一直执迷不悟用Keras,现在刚刚开始用torch,怎么说呢,挺香的 XD)
NLP相关的文本预处理
NLP文本预处理一直是一个很受关注的问题,当下最常用的文本预处理工具当属nltk,功能统一,api也很简单,安装的话直接输入:
pip install nltk
python#进入python
import nltk
nltk.download()#下载需要的内容
一般来讲,最简单最常见的预处理就是把一整段文本分词化(Tokenize),对于一段文本(Sentence),可以直接调用nltk库功能将其分词化,返回结果为一个词表(word list)。
import nltk# 为方便,任何import都只在所有代码块中出现一遍,以后的也同理
word_list=nltk.word_tokenize(sentence)
一般来讲在预处理数据的时候还会选择去除标点以及不需要的url等等内容,因此我在自己做实验的时候选择使用以下配置来作为基础的预处理方法。
import string
import re
PUNCT_TO_REMOVE = string.punctuation
url_pattern = re.compile(r'https?://\S+|www\.\S+')
sentence=url_pattern.sub(r'', sentence)
#remove punc
sentence=sentence.translate(str.maketrans('', '', PUNCT_TO_REMOVE))
tmp_word_list=nltk.word_tokenize(sentence)
word_list=[]
for word in tmp_word_list:
#lower
word=word.lower()
word_list.append(word)
事实上,文本预处理的方法是非常多样的,根据下边代码块中的参考内容链接,你可以找到各种各样数十种有针对性或者泛用的预处理方法,有的是为了处理Twitter中的一些tag,有的是是为了对文本进行词根化,有的是为了将双重否定转换成肯定……总而言之,一切预处理方法都是为了使得NLP任务更好地被执行,使得数据集更容易也更好地被训练。因此在我们针对NLP任务选择预处理方法时也应当注意选择合适的方法。如果我们在一个新闻数据集中使用去除Twitter中tag的预处理方法进行处理的话只会浪费时间。
# 参考链接
https://medium.com/sciforce/text-preprocessing-for-nlp-and-machine-learning-tasks-3e077aa4946e
https://towardsdatascience.com/all-you-need-to-know-about-text-preprocessing-for-nlp-and-machine-learning-bc1c5765ff67
https://towardsdatascience.com/nlp-text-preprocessing-a-practical-guide-and-template-d80874676e79
https://www.kaggle.com/sudalairajkumar/getting-started-with-text-preprocessing
https://www.kaggle.com/theoviel/improve-your-score-with-text-preprocessing-v2
https://medium.com/datadriveninvestor/data-cleaning-character-encoding-b4e0e9c65b2a
https://github.com/Deffro/text-preprocessing-techniques/blob/master/techniques.py
当然,很多预处理方法在常见的场合并不适用,例如文本中表情处理在Reuters新闻分类以及IMDB情感分析等常用任务上就没有什么用处。
为此我总结了5个我认为常用的预处理方法在下面的代码中
# 1. stem词根化
porter = nltk.stem.porter.PorterStemmer()
tmp_word_list=nltk.word_tokenize(sentence)
word_list=[]
for word in tmp_word_list:
word=porter.stem(word)
word_list.append(word)
# 2. spell check拼写检查
# pip install pyspellchecker
from spellchecker import SpellChecker
spell=SpellChecker()
tmp_word_list=nltk.word_tokenize(sentence)
word_list=[]
for word in tmp_word_list:
#lower
misspelled_words = spell.unknown(word.split())
if word in misspelled_words:
word_list.append(spell.correction(word))
else:
word_list.append(word)
# 3. negation否定词替换
token=nltk.word_tokenize(token)
word_list=[]
i, l = 0, len(token)
while i < l:
word = token[i]
if word == 'not' and i+1 < l:
ant = replace(token[i+1])
if ant:
word_list.append(ant)
i += 2
continue
word_list.append(word)
i += 1
def replace(self,word, pos=None):
""" Creates a set of all antonyms for the word and if there is only one antonym, it returns it """
antonyms = set()
for syn in nltk.corpus.wordnet.synsets(word, pos=pos):
for lemma in syn.lemmas():
for antonym in lemma.antonyms():
antonyms.add(antonym.name())
if len(antonyms) == 1:
return antonyms.pop()
else:
return None
# 4. stop word 停用词替换
stops_list = set(nltk.corpus.stopwords.words('english'))
tmp_word_list=nltk.word_tokenize(token)
word_list=[]
for word in tmp_word_list:
if word not in stops_list:
word_list.append(word)
# 5. contraction 连接词分离
# pip install contractions
import contractions as ctr
tmp_word_list=token.split(' ')
word_list=[]
for word in tmp_word_list:
word=ctr.fix(word)
tmp=nltk.word_tokenize(word)
for w in tmp:
word_list.append(w)
今天暂时更到这里,后续把自己做实验遇到的其他一些有趣内容补上
浅谈NLP 文本分类/情感分析 任务中的文本预处理工作的更多相关文章
- 浅谈layer.open的弹出层中的富文本编辑器为何不起作用!
很多童鞋都喜欢用贤心的layui框架.是的,我也喜欢用,方便,简单.但是呢,有时候项目中的需求会不一样,导致我们用的时候,显示效果可能会不一样,好吧.这样的话,个别遇到的问题总是解决不好,但是呢还是那 ...
- 浅谈PHP随机数安全的分析
之前在身边有很多学PHP的朋友写一些小程序的时候,很多时候会使用PHP随机数函数rand()和mt_rand()函数去生成随机数 可是,随机数真的随机吗?这篇文章讲从多个实例中探讨随机数,当然,有写作 ...
- <转载>浅谈C/C++的浮点数在内存中的存储方式
C/C++浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100.则在Intel CPU架构的系统中 ...
- 浅谈Windows下SVN在Android Studio中的配置、基本使用及解除关联
看到网上很多关于svn环境配置和关联Android-Studio的很多博文,发现很零散,想集大家所长整理一下: 在AndroidStudio中开发版本控制中,除了Git就是SVN,和Eclipse不同 ...
- 浅谈如何使用python抓取网页中的动态数据
我们经常会发现网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念, 动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到 ...
- 浅谈Excel开发:十 Excel 开发中与线程相关的若干问题
采用VSTO或者Shared Add-in等技术开发Excel插件,其实是在与Excel提供的API在打交道,Excel本身的组件大多数都是COM组件,也就是说通过Excel PIA来与COM进行交互 ...
- 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法
Excel开发过程中有时候会遇到各种奇怪的问题,下面就列出一些本人在开发中遇到的一些比较典型的问题,并给出了解决方法,希望对大家有所帮助. 一 插件调试不了以及错误导致崩溃的问题 在开发机器上,有时可 ...
- 浅谈Bootstrap自适应功能在Web开发中的应用
随着移动端市场的强势崛起,web的开发也变得愈发复杂,对于个体开发者来说,自己开发的网站,在电脑.手机.Pad等上面都要有正常的显示以及良好的用户体验.如果每次都要自己去调整网页去匹配各个不同的客户端 ...
- python 之文本搜索与替换文件中的文本
#!/usr/local/env python import os, sys nargs = len(sys.argv) if not 3 <= nargs <= 5: print &qu ...
随机推荐
- C、算法、操作系统杂记《malloc 0大小是什么行为》
linux手册上的说明 If size is 0, then malloc() returns either NULL, or a unique pointer value that can late ...
- Docker容器监控(十)
docker自带的监控命令 docker自带了三个监控命令即ps, top, stats ps docker ps 可以帮助我们很快的了解当前正在运行的容器 -a:会显示已经停掉的容器 [root ...
- openstack核心组件——nova计算服务(7)
云计算openstack核心组件——nova计算服务(7) 一.nova介绍: Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 ...
- Flutter学习一之环境搭建
MacOS上搭建Flutter开发环境 1.flutter官网下载最新的安装包,https://flutter.io/sdk-archive/#macos 2.解压安装包到你想安装的目录.直接解压或者 ...
- 多NX如何共存
在安装NX时,本机已经装了NX其他版本,只能修改当前程序,无法安装,那么多NX如何共存? 如图:先安装了32位NX8.5,后安装64位NX 8.5时弹的框. 解决办法有两种: 1)将已经安装的NX目录 ...
- ubuntu 开启samba
sudo apt-get update sudo apt-get install samba samba-common sudo mkdir /home/vagrant/share sudo chmo ...
- Pycharm默认输入状态是insert状态,选中文字无法直接输入替换或删除
最近在学习Python,使用pycharm的时候,我的光标处于加粗状态,也就是编程软件经常出现的insert插入编辑模式,我就点击了一下insert按键,退出了这个模式,但是我每次打开都是会处于这种模 ...
- Redis深入浅出
一.基础使用 常用命令 keys,expire(过期),ttl(查看生存时间),set,select,dbsize,flushdb(删除当前库),flushall(删除所有), get,append, ...
- 俯瞰 Java 服务端开发
原文首发于 github ,欢迎 star . Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...
- [vscode直接运行js文件报错]: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
报错示例: 报错原因: 在vscode里面编写了一段js代码,使用了import来引入一个函数并调用 代码复现 // inherit() returns a newly created object ...