之所以心血来潮想写这篇博客,是因为最近在关注NLP文本分类这类任务中的文本预处理工作,想总结一下自己的所学所想,老规矩,本博文记载 仅供备忘与参考,不具备学术价值,本文默认使用python3编程(代码能力是屎山级别的,请谅解),默认文本为英文,代码主要使用Pytorch(博主老笨蛋了,之前一直执迷不悟用Keras,现在刚刚开始用torch,怎么说呢,挺香的 XD)
NLP文本预处理一直是一个很受关注的问题,当下最常用的文本预处理工具当属nltk,功能统一,api也很简单,安装的话直接输入:
pip install nltkpython#进入pythonimport nltk nltk.download()#下载需要的内容
一般来讲,最简单最常见的预处理就是把一整段文本分词化(Tokenize),对于一段文本(Sentence),可以直接调用nltk库功能将其分词化,返回结果为一个词表(word list)。
import nltk# 为方便,任何import都只在所有代码块中出现一遍,以后的也同理word_list=nltk.word_tokenize(sentence)
一般来讲在预处理数据的时候还会选择去除标点以及不需要的url等等内容,因此我在自己做实验的时候选择使用以下配置来作为基础的预处理方法。
import stringimport re
PUNCT_TO_REMOVE = string.punctuation
url_pattern = re.compile(r'https?://\S+|www\.\S+')
sentence=url_pattern.sub(r'', sentence)#remove puncsentence=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 pyspellcheckerfrom 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 += 1def 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 contractionsimport 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)
今天暂时更到这里,后续把自己做实验遇到的其他一些有趣内容补上
转自https://www.cnblogs.com/shiningrain3/p/13856645.html
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69983372/viewspace-2728748/ ,如需转载,请注明出处,否则将追究法律责任。