【Python】Python中的文本处理
作者 | KahEm Chu
編譯 | VK
來源 | Towards Data Science
互聯(lián)網(wǎng)連接了世界,而Facebook、Twitter和Reddit等社交媒體為人們提供了表達(dá)自己對某個(gè)話題的看法和感受的平臺(tái)。然后,智能手機(jī)的普及直接增加了這些平臺(tái)的使用率。例如,有96%或22.4億Facebook活躍用戶通過智能手機(jī)和平板電腦使用Facebook[1]。
隨著社會(huì)媒體使用量的增加,文本數(shù)據(jù)的規(guī)模不斷擴(kuò)大,促進(jìn)了自然語言處理(NLP)的研究,如信息檢索和情感分析。大多數(shù)情況下,被分析的文檔或文本文件是巨大的,并且含有大量的噪聲,直接使用原始文本進(jìn)行分析是不適用的。因此,文本處理對于為建模和分析提供清晰的輸入至關(guān)重要。
文本處理包括兩個(gè)主要階段,即標(biāo)識(shí)化(Tokenization)和規(guī)范化(Normalization)[2]。標(biāo)識(shí)化是將一個(gè)較長的文本字符串拆分為較小的片段或標(biāo)識(shí)的過程[3]。規(guī)范化是指將數(shù)字轉(zhuǎn)換為它們的等價(jià)詞,刪除標(biāo)點(diǎn)符號(hào),將所有文本轉(zhuǎn)換為相同的大小寫,刪除停用詞,刪除噪聲,詞根化或詞形還原。
詞根化-刪除詞綴(后綴、前綴、中綴),例如,running 變成run
詞形還原-捕獲單詞的原本詞形。例如,better變成good[4]
在本文中,我將演示Python中的文本處理。
下面是一段摘自丹尼爾·朱拉夫斯基和詹姆斯·H·沃克的《Speech and Language Processing》一書。馬丁[6]。
“賦予計(jì)算機(jī)處理人類語言的能力的想法和計(jì)算機(jī)本身的想法一樣古老。
這本書是關(guān)于這個(gè)令人興奮的想法的實(shí)施和影響。我們介紹了一個(gè)充滿活力的跨學(xué)科領(lǐng)域,有許多名稱對應(yīng)于它的許多方面,如語音和語言處理、人類語言技術(shù)、自然語言處理、計(jì)算語言學(xué)和語音識(shí)別與合成。
這一新領(lǐng)域的目標(biāo)是讓計(jì)算機(jī)執(zhí)行涉及人類語言的有用任務(wù),例如實(shí)現(xiàn)人機(jī)通信、改善人類通信或只是對文本或語音進(jìn)行有用的處理?!?/p>
“The idea of giving computers the ability to process human language is ?as old as the idea of computers themselves. This book is about the ?implementation and implications of that exciting idea. We introduce a ?vibrant interdisciplinary field with many names corresponding to its ?many facets, names like speech and language processing, human language ?technology, natural language processing, computational linguistics, and ?speech recognition and synthesis. The goal of this new field is to get ?computers to perform useful tasks involving human language, tasks like ?enabling human-machine communication, improving human-human ?communication, or simply doing useful processing of text or speech.”
本段將用于下面的文本處理示例中。
Python中的文本處理
對于Python中的文本處理,演示中將使用兩個(gè)自然語言處理(NLP)庫,即NLTK(Natural Language Toolkit)和spaCy。之所以選擇這兩個(gè)庫而不是Gensim和Transformer等其他文本處理庫,是因?yàn)镹LTK和spaCy是最受歡迎的庫,對自然語言處理(NLP)的初學(xué)者來說非常友好。
對于NLTK和spaCy,首先需要將文本保存為變量。
text?=?"""The?idea?of?giving?computers?the?ability?to?process?human?language?is?as?old?as?the?idea?of?computers?themselves.?This?book?is?about?the?implementation?and?implications?of?that?exciting?idea.?We?introduce?a?vibrant?interdisciplinary?field?with?many?names?corresponding?to?its?many?facets,?names?like?speech?and?language?processing,?human?language?technology,?natural?language?processing,?computational?linguistics,?and?speech?recognition?and?synthesis.?The?goal?of?this?new?field?is?to?get?computers?to?perform?useful?tasks?involving?human?language,?tasks?like?enabling?human-machine?communication,?improving?human-human?communication,?or?simply?doing?useful?processing?of?text?or?speech."""基于NLTK的文本處理
導(dǎo)入所有需要的庫
1.標(biāo)識(shí)化
使用標(biāo)識(shí)器將句子分隔成單個(gè)單詞(標(biāo)識(shí))的列表。
word_punct_token?=?WordPunctTokenizer().tokenize(text)除了上面使用的WordPunctTokenizer之外,NLTK庫中還有幾個(gè)標(biāo)識(shí)器模塊。例如,word_tokenize和RegexpTokenizer。
RegexpTokenizer通過設(shè)置RegexpTokenizer(‘\w+|<pre>不能識(shí)別此Latex公式: [\d.]+|\S+’),可以將貨幣(如9.99)分離為單個(gè)標(biāo)識(shí)。所有提到的標(biāo)識(shí)器都將以列表形式返回標(biāo)識(shí)。NLTK還有一個(gè)模塊名sent_tokenize,它能夠?qū)⒍温浞指舫删渥恿斜怼?/p>
2.規(guī)范化
下面的腳本刪除了非單詞的標(biāo)識(shí),例如,符號(hào)和數(shù)字,以及僅包含少于兩個(gè)字母或僅包含輔音的標(biāo)識(shí)。這個(gè)腳本在本例中可能沒有用處,但在處理大量文本數(shù)據(jù)時(shí)非常有用,它有助于清除大量噪聲。我總是喜歡在處理文本數(shù)據(jù)時(shí)包含它。
clean_token=[] for?token?in?word_punct_token:token?=?token.lower()#?刪除任何非字母的值new_token?=?re.sub(r'[^a-zA-Z]+',?'',?token)?#?刪除空值和單個(gè)字符值if?new_token?!=?""?and?len(new_token)?>=?2:?vowels=len([v?for?v?in?new_token?if?v?in?"aeiou"])if?vowels?!=?0:?#?刪除只包含輔音的行clean_token.append(new_token)2a.刪除停用詞
停用詞指沒有多少用處的詞,如介詞。NLTK和spaCy在庫中有不同數(shù)量的停用詞,但是NLTK和spaCy都允許我們添加任何我們認(rèn)為必要的詞。例如,當(dāng)我們處理電子郵件時(shí),我們可以添加gmail、com、outlook作為stopwords。
#?獲取停用詞列表 stop_words?=?stopwords.words('english') #?在列表中添加新的停用詞 stop_words.extend(["could","though","would","also","many",'much']) print(stop_words) #?從標(biāo)識(shí)列表中刪除停用詞 tokens?=?[x?for?x?in?clean_token?if?x?not?in?stop_words]2b.詞性標(biāo)注
這個(gè)過程指的是用詞性位置標(biāo)識(shí)單詞,例如動(dòng)詞、形容詞和名詞。nltk.pos_tag模塊以元組的形式返回結(jié)果,為了簡化以后的任務(wù),通常我會(huì)將它們轉(zhuǎn)換為數(shù)據(jù)幀。
data_tagset?=?nltk.pos_tag(tokens) df_tagset?=?pd.DataFrame(data_tagset,?columns=['Word',?'Tag'])2c.詞形還原
詞干化和詞形還原都有助于減少詞匯的維數(shù),方法是將單詞還原為詞根形式(詞形還原)或刪除所有后綴、詞綴、前綴等(詞干化)。
詞干分析有助于減少詞匯的維數(shù),但大多數(shù)情況下,詞干分析會(huì)變得毫無意義,因?yàn)樵~干分析只會(huì)切掉詞尾,而不會(huì)將單詞還原為基本形式。例如,houses在刪除后會(huì)變成hous,完全失去意義。因此,詞形還原對于文本分析更為可取。
以下腳本用于獲取名詞、形容詞和動(dòng)詞的詞形還原形式。
#?創(chuàng)建lemmatizer對象 lemmatizer?=?WordNetLemmatizer()#?對每個(gè)單詞進(jìn)行詞形還原并顯示輸出 lemmatize_text?=?[] for?word?in?tokens:output?=?[word,?lemmatizer.lemmatize(word,?pos='n'),???????lemmatizer.lemmatize(word,?pos='a'),lemmatizer.lemmatize(word,?pos='v')]lemmatize_text.append(output)#?創(chuàng)建數(shù)據(jù)幀 df?=?pd.DataFrame(lemmatize_text,?columns?=['Word',?'Lemmatized?Noun',?'Lemmatized?Adjective',?'Lemmatized?Verb'])?df['Tag']?=?df_tagset['Tag']將形容詞、名詞和動(dòng)詞分開進(jìn)行詞形還原是為了提高lemmatizer的準(zhǔn)確性。
#?替換為單個(gè)字符以簡化 df?=?df.replace(['NN','NNS','NNP','NNPS'],'n') df?=?df.replace(['JJ','JJR','JJS'],'a') df?=?df.replace(['VBG','VBP','VB','VBD','VBN','VBZ'],'v')''' 定義一個(gè)函數(shù),當(dāng)tagset是名詞時(shí),詞形還原;當(dāng)標(biāo)識(shí)集是形容詞時(shí),取詞形還原的形容詞 ''' df_lemmatized?=?df.copy() df_lemmatized['Tempt?Lemmatized?Word']=df_lemmatized['Lemmatized?Noun']?+?'?|?'?+?df_lemmatized['Lemmatized?Adjective']+?'?|?'?+?df_lemmatized['Lemmatized?Verb']df_lemmatized.head(5) lemma_word?=?df_lemmatized['Tempt?Lemmatized?Word'] tag?=?df_lemmatized['Tag'] i?=?0 new_word?=?[] while?i<len(tag):words?=?lemma_word[i].split('|')if?tag[i]?==?'n':????????word?=?words[0]elif?tag[i]?==?'a':word?=?words[1]elif?tag[i]?==?'v':word?=?words[2]new_word.append(word)i?+=?1df_lemmatized['Lemmatized?Word']=new_word上面的腳本是根據(jù)詞性標(biāo)簽將詞形還原后的單詞分配給原始單詞。
3.獲得清洗過的標(biāo)識(shí)
#?計(jì)算標(biāo)識(shí)的頻率分布 lemma_word?=?[str(x)?for?x?in?df_lemmatized['Lemmatized?Word']]在對文本進(jìn)行了標(biāo)識(shí)化和規(guī)范化之后,現(xiàn)在我們獲得了一個(gè)干凈的標(biāo)識(shí)列表,可以將其插入到WordCloud或其他文本分析模型中。
spaCy文本處理
1.標(biāo)識(shí)化+詞形還原
與NLTK相比,spaCy優(yōu)勢在于簡化了文本處理過程。
#?導(dǎo)入spaCy并加載語言庫 import?spacy #?你需要在下面的這一行下載軟件包 !python?-m?spacy?download?en_core_web_sm nlp?=?spacy.load('en_core_web_sm')#?創(chuàng)建文檔對象 doc?=?nlp(text) token_list?=?[] #?收集POS,?依存關(guān)系和詞根 for?token?in?doc:output?=?[token.text,?token.pos_,?token.dep_,token.lemma_]token_list.append(output)#?使用數(shù)據(jù)創(chuàng)建數(shù)據(jù)幀 df?=?pd.DataFrame(token_list,?columns?=['Word',?'POS?Tag',?'Dependencies',?'Lemmatized?Word'])在spaCy中,當(dāng)你執(zhí)行標(biāo)識(shí)化時(shí),你可以獲得POS標(biāo)識(shí)和詞形,這為你節(jié)省了一些精力。
2.規(guī)范化
由于詞形還原是在一開始就執(zhí)行的,所以標(biāo)準(zhǔn)化步驟只留下去除噪聲和停用詞。
2a.消除噪音
df_nopunct?=?df[df['POS?Tag']!='PUNCT'] df_nopunctspaCy POS中包含了一個(gè)標(biāo)點(diǎn)符號(hào)標(biāo)簽,顯示為PUNCT,因此我們可以通過去掉帶有PUNCT標(biāo)簽的標(biāo)記來刪除所有的標(biāo)點(diǎn)符號(hào)。
2b.刪除停用詞
import?numpy?as?np lemma_word?=?df_nopunct['Lemmatized?Word'].values.tolist()stopword?=?nlp.Defaults.stop_words #?將單詞添加到停用詞集中,使用小寫! nlp.Defaults.stop_words.add('btw')is_stopword_list?=?[] for?word?in?lemma_word:is_stopword?=?nlp.vocab[word].is_stopis_stopword_list.append(is_stopword) df_nopunct["is_stopword"]?=?is_stopword_list df_nopunct clean_df?=?df_nopunct[df_nopunct["is_stopword"]==False]SpaCy有一個(gè).is_stop可以用來檢測一個(gè)標(biāo)識(shí)是否是停用詞,我們可以用它來刪除停用詞,如上面的腳本所示。
3.獲得清洗過的標(biāo)識(shí)
clean_list?=?clean_df["Lemmatized?Word"].values.tolist()現(xiàn)在我們獲得了清理過的標(biāo)識(shí)!
spaCy比NLTK更快、更先進(jìn),但是NLTK對初學(xué)者來說更好地理解文本處理中的每一個(gè)過程,因?yàn)樗霈F(xiàn)的早,并且有很多文檔和解釋。
你可以在這里找到spaCy和NLTK在GPU支持、效率、性能、最新技術(shù)、詞向量和靈活性等其他特性方面的比較:https://towardsdatascience.com/text-normalization-with-spacy-and-nltk-1302ff430119。
感謝閱讀!希望上面的演示能幫助你理解Python中的文本處理。
對于文本處理,理解數(shù)據(jù)結(jié)構(gòu)與正則表達(dá)式(RegEx)一樣重要。例如,類或模塊的返回可能是元組和列表的形式,要操作輸出,首先要了解它們。下面是我經(jīng)常使用的一些腳本,用于為不同的目的更改變量的數(shù)據(jù)結(jié)構(gòu)。
1.從數(shù)據(jù)幀(多列)到嵌套列表,從嵌套列表到列表
在創(chuàng)建主題模型或情感分析模型時(shí),通常我們會(huì)根據(jù)句子或段落分別保存標(biāo)識(shí),例如,評論和tweet會(huì)分別保存,以獲得每個(gè)評論或tweet的準(zhǔn)確情感或話題。
因此,如果我們有10個(gè)評論,將有10個(gè)標(biāo)識(shí)列表,將它們保存在一個(gè)變量中,創(chuàng)建一個(gè)嵌套列表。另一個(gè)例子是,一個(gè)數(shù)據(jù)框,有幾個(gè)列保存文本數(shù)據(jù),例如產(chǎn)品的評論。我們可能希望直接將這些列更改為列表,但將少數(shù)數(shù)據(jù)列更改為列表也會(huì)創(chuàng)建嵌套列表。
#?df_essays是一個(gè)數(shù)據(jù)框,包含文本數(shù)據(jù)列 essay_list?=?df_essays.values.tolist()?#?這將創(chuàng)建嵌套列表#?這將創(chuàng)建平面列表 flatEssayList?=?[item?for?elem?in?essay_list?for?item?in?elem?if?str(item)?!=?'nan']2.從數(shù)據(jù)幀(單列)或列表到文本
文本分析中最流行的應(yīng)用之一是WordCloud,它主要用于分析文本中最頻繁的討論。這個(gè)模塊只接受文本作為輸入,所以在這個(gè)場景中,我們需要將list或DataFrame.Column更改為text。
#?dataframe.column到文本 text?=?‘?‘.join(str(x)?for?x?in?df[‘review’])#?列表到文本 text?=?‘?‘.join(str(x)?for?x?in?any_list)3.從數(shù)據(jù)幀(單列)到列表
reviews_list?=?df["reviews"].values.tolist()4.從文本到列表
這既簡單又方便。
token_list?=?text.split()5.從元組到數(shù)據(jù)幀
我上面提到過這個(gè),在這里重復(fù)一下,以便更好地參考。
nltk.pos_tagmodule以元組的形式返回標(biāo)簽集(word,pos tag)。
data_tagset?=?nltk.pos_tag(tokens) df_tagset?=?pd.DataFrame(data_tagset,?columns=['Word',?'Tag'])參考引用
[1] M. Iqbal, “Facebook Revenue and Usage Statistics (2020),” 8 March 2021. [Online]. Available: https://www.businessofapps.com/data/facebook-statistics/.
[2] M. Mayo, “A General Approach to Preprocessing Text Data,” 2017. [Online]. Available: https://www.kdnuggets.com/2017/12/general-approach-preprocessing-text-data.html. [Accessed 12 June 2020].
[3] D. Subramanian, “Text Mining in Python: Steps and Examples,” 22 August 2019. [Online]. Available: https://medium.com/towards-artificial-intelligence/text-mining-in-python-steps-and-examples-78b3f8fd913b. [Accessed 12 June 2020].
[4] M. Mayo, “Natural Language Processing Key Terms, Explained,” 2017. [Online]. Available: https://www.kdnuggets.com/2017/02/natural-language-processing-key-terms-explained.html.
[5] “Natural Language Processing In Julia (Text Analysis),” JCharisTech, 1 May 2018. [Online]. Available: https://jcharistech.wordpress.com/2018/05/01/natural-language-processing-in-julia-text-analysis/.
[6] D. Jurafsky and J. H. Martin, “Speech and Language Processing,” 3 December 2020. [Online]. Available: https://web.stanford.edu/~jurafsky/slp3/.
[7] M.F. Goh, “Text Normalization with spaCy and NLTK,” 29 November 2020. [Online]. Available: https://towardsdatascience.com/text-normalization-with-spacy-and-nltk-1302ff430119.
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯黃海廣老師《機(jī)器學(xué)習(xí)課程》視頻課本站qq群851320808,加入微信群請掃碼:
總結(jié)
以上是生活随笔為你收集整理的【Python】Python中的文本处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个坑爹的问题,js注释掉夹杂的el表达
- 下一篇: 深度强化学习入门介绍