【Python】Python中的文本处理
作者 | KahEm Chu
編譯 | VK
來源 | Towards Data Science
互聯網連接了世界,而Facebook、Twitter和Reddit等社交媒體為人們提供了表達自己對某個話題的看法和感受的平臺。然后,智能手機的普及直接增加了這些平臺的使用率。例如,有96%或22.4億Facebook活躍用戶通過智能手機和平板電腦使用Facebook[1]。
隨著社會媒體使用量的增加,文本數據的規模不斷擴大,促進了自然語言處理(NLP)的研究,如信息檢索和情感分析。大多數情況下,被分析的文檔或文本文件是巨大的,并且含有大量的噪聲,直接使用原始文本進行分析是不適用的。因此,文本處理對于為建模和分析提供清晰的輸入至關重要。
文本處理包括兩個主要階段,即標識化(Tokenization)和規范化(Normalization)[2]。標識化是將一個較長的文本字符串拆分為較小的片段或標識的過程[3]。規范化是指將數字轉換為它們的等價詞,刪除標點符號,將所有文本轉換為相同的大小寫,刪除停用詞,刪除噪聲,詞根化或詞形還原。
詞根化-刪除詞綴(后綴、前綴、中綴),例如,running 變成run
詞形還原-捕獲單詞的原本詞形。例如,better變成good[4]
在本文中,我將演示Python中的文本處理。
下面是一段摘自丹尼爾·朱拉夫斯基和詹姆斯·H·沃克的《Speech and Language Processing》一書。馬丁[6]。
“賦予計算機處理人類語言的能力的想法和計算機本身的想法一樣古老。
這本書是關于這個令人興奮的想法的實施和影響。我們介紹了一個充滿活力的跨學科領域,有許多名稱對應于它的許多方面,如語音和語言處理、人類語言技術、自然語言處理、計算語言學和語音識別與合成。
這一新領域的目標是讓計算機執行涉及人類語言的有用任務,例如實現人機通信、改善人類通信或只是對文本或語音進行有用的處理。”
“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中的文本處理,演示中將使用兩個自然語言處理(NLP)庫,即NLTK(Natural Language Toolkit)和spaCy。之所以選擇這兩個庫而不是Gensim和Transformer等其他文本處理庫,是因為NLTK和spaCy是最受歡迎的庫,對自然語言處理(NLP)的初學者來說非常友好。
對于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的文本處理
導入所有需要的庫
1.標識化
使用標識器將句子分隔成單個單詞(標識)的列表。
word_punct_token?=?WordPunctTokenizer().tokenize(text)除了上面使用的WordPunctTokenizer之外,NLTK庫中還有幾個標識器模塊。例如,word_tokenize和RegexpTokenizer。
RegexpTokenizer通過設置RegexpTokenizer(‘\w+|<pre>不能識別此Latex公式: [\d.]+|\S+’),可以將貨幣(如9.99)分離為單個標識。所有提到的標識器都將以列表形式返回標識。NLTK還有一個模塊名sent_tokenize,它能夠將段落分隔成句子列表。
2.規范化
下面的腳本刪除了非單詞的標識,例如,符號和數字,以及僅包含少于兩個字母或僅包含輔音的標識。這個腳本在本例中可能沒有用處,但在處理大量文本數據時非常有用,它有助于清除大量噪聲。我總是喜歡在處理文本數據時包含它。
clean_token=[] for?token?in?word_punct_token:token?=?token.lower()#?刪除任何非字母的值new_token?=?re.sub(r'[^a-zA-Z]+',?'',?token)?#?刪除空值和單個字符值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在庫中有不同數量的停用詞,但是NLTK和spaCy都允許我們添加任何我們認為必要的詞。例如,當我們處理電子郵件時,我們可以添加gmail、com、outlook作為stopwords。
#?獲取停用詞列表 stop_words?=?stopwords.words('english') #?在列表中添加新的停用詞 stop_words.extend(["could","though","would","also","many",'much']) print(stop_words) #?從標識列表中刪除停用詞 tokens?=?[x?for?x?in?clean_token?if?x?not?in?stop_words]2b.詞性標注
這個過程指的是用詞性位置標識單詞,例如動詞、形容詞和名詞。nltk.pos_tag模塊以元組的形式返回結果,為了簡化以后的任務,通常我會將它們轉換為數據幀。
data_tagset?=?nltk.pos_tag(tokens) df_tagset?=?pd.DataFrame(data_tagset,?columns=['Word',?'Tag'])2c.詞形還原
詞干化和詞形還原都有助于減少詞匯的維數,方法是將單詞還原為詞根形式(詞形還原)或刪除所有后綴、詞綴、前綴等(詞干化)。
詞干分析有助于減少詞匯的維數,但大多數情況下,詞干分析會變得毫無意義,因為詞干分析只會切掉詞尾,而不會將單詞還原為基本形式。例如,houses在刪除后會變成hous,完全失去意義。因此,詞形還原對于文本分析更為可取。
以下腳本用于獲取名詞、形容詞和動詞的詞形還原形式。
#?創建lemmatizer對象 lemmatizer?=?WordNetLemmatizer()#?對每個單詞進行詞形還原并顯示輸出 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)#?創建數據幀 df?=?pd.DataFrame(lemmatize_text,?columns?=['Word',?'Lemmatized?Noun',?'Lemmatized?Adjective',?'Lemmatized?Verb'])?df['Tag']?=?df_tagset['Tag']將形容詞、名詞和動詞分開進行詞形還原是為了提高lemmatizer的準確性。
#?替換為單個字符以簡化 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')''' 定義一個函數,當tagset是名詞時,詞形還原;當標識集是形容詞時,取詞形還原的形容詞 ''' 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上面的腳本是根據詞性標簽將詞形還原后的單詞分配給原始單詞。
3.獲得清洗過的標識
#?計算標識的頻率分布 lemma_word?=?[str(x)?for?x?in?df_lemmatized['Lemmatized?Word']]在對文本進行了標識化和規范化之后,現在我們獲得了一個干凈的標識列表,可以將其插入到WordCloud或其他文本分析模型中。
spaCy文本處理
1.標識化+詞形還原
與NLTK相比,spaCy優勢在于簡化了文本處理過程。
#?導入spaCy并加載語言庫 import?spacy #?你需要在下面的這一行下載軟件包 !python?-m?spacy?download?en_core_web_sm nlp?=?spacy.load('en_core_web_sm')#?創建文檔對象 doc?=?nlp(text) token_list?=?[] #?收集POS,?依存關系和詞根 for?token?in?doc:output?=?[token.text,?token.pos_,?token.dep_,token.lemma_]token_list.append(output)#?使用數據創建數據幀 df?=?pd.DataFrame(token_list,?columns?=['Word',?'POS?Tag',?'Dependencies',?'Lemmatized?Word'])在spaCy中,當你執行標識化時,你可以獲得POS標識和詞形,這為你節省了一些精力。
2.規范化
由于詞形還原是在一開始就執行的,所以標準化步驟只留下去除噪聲和停用詞。
2a.消除噪音
df_nopunct?=?df[df['POS?Tag']!='PUNCT'] df_nopunctspaCy POS中包含了一個標點符號標簽,顯示為PUNCT,因此我們可以通過去掉帶有PUNCT標簽的標記來刪除所有的標點符號。
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有一個.is_stop可以用來檢測一個標識是否是停用詞,我們可以用它來刪除停用詞,如上面的腳本所示。
3.獲得清洗過的標識
clean_list?=?clean_df["Lemmatized?Word"].values.tolist()現在我們獲得了清理過的標識!
spaCy比NLTK更快、更先進,但是NLTK對初學者來說更好地理解文本處理中的每一個過程,因為它出現的早,并且有很多文檔和解釋。
你可以在這里找到spaCy和NLTK在GPU支持、效率、性能、最新技術、詞向量和靈活性等其他特性方面的比較:https://towardsdatascience.com/text-normalization-with-spacy-and-nltk-1302ff430119。
感謝閱讀!希望上面的演示能幫助你理解Python中的文本處理。
對于文本處理,理解數據結構與正則表達式(RegEx)一樣重要。例如,類或模塊的返回可能是元組和列表的形式,要操作輸出,首先要了解它們。下面是我經常使用的一些腳本,用于為不同的目的更改變量的數據結構。
1.從數據幀(多列)到嵌套列表,從嵌套列表到列表
在創建主題模型或情感分析模型時,通常我們會根據句子或段落分別保存標識,例如,評論和tweet會分別保存,以獲得每個評論或tweet的準確情感或話題。
因此,如果我們有10個評論,將有10個標識列表,將它們保存在一個變量中,創建一個嵌套列表。另一個例子是,一個數據框,有幾個列保存文本數據,例如產品的評論。我們可能希望直接將這些列更改為列表,但將少數數據列更改為列表也會創建嵌套列表。
#?df_essays是一個數據框,包含文本數據列 essay_list?=?df_essays.values.tolist()?#?這將創建嵌套列表#?這將創建平面列表 flatEssayList?=?[item?for?elem?in?essay_list?for?item?in?elem?if?str(item)?!=?'nan']2.從數據幀(單列)或列表到文本
文本分析中最流行的應用之一是WordCloud,它主要用于分析文本中最頻繁的討論。這個模塊只接受文本作為輸入,所以在這個場景中,我們需要將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.從數據幀(單列)到列表
reviews_list?=?df["reviews"].values.tolist()4.從文本到列表
這既簡單又方便。
token_list?=?text.split()5.從元組到數據幀
我上面提到過這個,在這里重復一下,以便更好地參考。
nltk.pos_tagmodule以元組的形式返回標簽集(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.
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯黃海廣老師《機器學習課程》視頻課本站qq群851320808,加入微信群請掃碼:
總結
以上是生活随笔為你收集整理的【Python】Python中的文本处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个坑爹的问题,js注释掉夹杂的el表达
- 下一篇: 【Python】利用 Python 分析