浅谈NLP 文本分类/情感分析 任务中的文本预处理工作

转载自

仅供学习参考

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)  

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值