淺談NLP 文字分類/情感分析 任務中的文字預處理工作

只愛宅zmy發表於2020-10-22

淺談NLP 文字分類/情感分析 任務中的文字預處理工作

前言

之所以心血來潮想寫這篇部落格,是因為最近在關注NLP文字分類這類任務中的文字預處理工作,想總結一下自己的所學所想,老規矩,本博文記載 僅供備忘與參考,不具備學術價值,本文預設使用python3程式設計(程式碼能力是屎山級別的,請諒解),預設文字為英文,程式碼主要使用Pytorch(博主老笨蛋了,之前一直執迷不悟用Keras,現在剛剛開始用torch,怎麼說呢,挺香的 XD)

NLP相關的文字預處理

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的預處理方法進行處理的話只會浪費時間。

# 參考連結





當然,很多預處理方法在常見的場合並不適用,例如文字中 在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部落格 ” ,連結:http://blog.itpub.net/69983372/viewspace-2728748/,如需轉載,請註明出處,否則將追究法律責任。

相關文章