使用 Python 的 NLTK 包進行自然語言處理 |【生長吧!Python!】 【生長吧!Python】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/278897(使用驅動器u盤之前需要格式化)
目錄
Python 的 NLTK 入門
代幣化
過濾停用詞
詞干
標記詞性
詞形還原
分塊
咬牙切齒
使用命名實體識別 (NER)
獲取要分析的文本
使用索引
制作色散圖
進行頻率分布
尋找搭配
結論
自然語言處理(NLP) 是一個專注于使計算機程序可以使用自然人類語言的領域。NLTK或Natural Language Toolkit是可用于 NLP 的 Python 包。
您可以分析的許多數據都是非結構化數據,并且包含人類可讀的文本。在以編程方式分析該數據之前,您首先需要對其進行預處理。在本教程中,您將首先了解可以使用 NLTK 執行的文本預處理任務的種類,以便您準備好在未來的項目中應用它們。您還將看到如何進行一些基本的文本分析和創建可視化。
如果您熟悉使用 Python的基礎知識,并希望了解一些 NLP,那么您來對地方了。
在本教程結束時,您將知道如何:
查找要分析的文本
預處理您的文本以進行分析
分析你的文字
根據您的分析創建可視化
讓我們開始 Python!
Python 的 NLTK 入門
您需要做的第一件事是確保安裝了 Python。在本教程中,您將使用 Python 3.9。如果您還沒有安裝 Python,請查看Python 3 安裝和設置指南以開始使用。
一旦你解決了這個問題,下一步就是安裝 NLTK與pip.?最佳做法是將其安裝在虛擬環境中。要了解有關虛擬環境的更多信息,請查看Python 虛擬環境:入門。
對于本教程,您將安裝 3.5 版:
$ python -m pip install nltk==3.5
為了為命名實體識別創建可視化,您還需要安裝NumPy和Matplotlib:
$ python -m pip install numpy matplotlib
如果您想了解更多有關pip工作原理的信息,可以查看什么是 Pip?新 Pythonistas 指南。您還可以查看安裝 NLTK 數據的官方頁面。
代幣化
通過標記化,您可以方便地按單詞或按句子拆分文本。這將允許您處理較小的文本片段,即使在文本其余部分的上下文之外,這些文本片段仍然相對連貫且有意義。這是將非結構化數據轉化為更易于分析的結構化數據的第一步。
當您分析文本時,您將按單詞進行標記并按句子進行標記。以下是兩種類型的標記化帶來的好處:
按單詞標記:單詞就像自然語言的原子。它們是本身仍然有意義的最小意義單位。通過單詞標記您的文本可以讓您識別特別頻繁出現的單詞。例如,如果您正在分析一組招聘廣告,那么您可能會發現“Python”這個詞經常出現。這可能表明對 Python 知識的需求很高,但您需要更深入地了解更多信息。
按句子標記:當您按句子標記時,您可以分析這些詞之間的關系并查看更多上下文。因為招聘經理不喜歡 Python,所以圍繞“Python”這個詞是否有很多負面詞?爬蟲學領域是否有比軟件開發領域更多的術語,表明您可能正在處理一種與您預期完全不同的Python?
以下是如何導入NLTK 的相關部分,以便您可以按單詞和句子進行標記:
>>> from nltk.tokenize import sent_tokenize, word_tokenize
現在您已經導入了您需要的內容,您可以創建一個字符串來標記化。以下是Dune的引用,您可以使用:
>>> example_string = """ ... Muad'Dib learned rapidly because his first training was in how to learn. ... And the first lesson of all was the basic trust that he could learn. ... It's shocking to find how many people do not believe they can learn, ... and how many more believe learning to be difficult."""
您可以使用sent_tokenize()拆分example_string成句子:
>>> sent_tokenize(example_string) ["Muad'Dib learned rapidly because his first training was in how to learn.", 'And the first lesson of all was the basic trust that he could learn.', "It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult."]
example_string按句子標記為您提供了三個作為句子的字符串的列表:
"Muad'Dib learned rapidly because his first training was in how to learn."
'And the first lesson of all was the basic trust that he could learn.'
"It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult."
現在嘗試example_string按單詞標記:
>>> word_tokenize(example_string) ["Muad'Dib", 'learned', 'rapidly', 'because', 'his', 'first', 'training', 'was', 'in', 'how', 'to', 'learn', '.', 'And', 'the', 'first', 'lesson', 'of', 'all', 'was', 'the', 'basic', 'trust', 'that', 'he', 'could', 'learn', '.', 'It', "'s", 'shocking', 'to', 'find', 'how', 'many', 'people', 'do', 'not', 'believe', 'they', 'can', 'learn', ',', 'and', 'how', 'many', 'more', 'believe', 'learning', 'to', 'be', 'difficult', '.']
您得到了 NLTK 認為是單詞的字符串列表,例如:
"Muad'Dib"
'training'
'how'
但以下字符串也被認為是單詞:
"'s"
','
'.'
看看如何"It's"在撇號處拆分給你'It'和"'s",但"Muad'Dib"仍然是完整的?發生這種情況是因為 NLTK 知道'It'和"'s"(“is”的縮寫)是兩個不同的詞,所以它分別計算了它們。但"Muad'Dib"不是像 一樣被接受的縮略詞"It's",所以它沒有被當作兩個單獨的詞來讀,而是保持不變。
過濾停用詞
停用詞是您想要忽略的詞,因此在處理文本時將它們從文本中過濾掉。非常常見的詞,例如'in','is'和'an'經常用作停用詞,因為它們本身并沒有為文本添加很多含義。
下面介紹如何導入 NLTK 的相關部分以過濾停用詞:
>>> nltk.download("stopwords") >>> from nltk.corpus import stopwords >>> from nltk.tokenize import word_tokenize
以下是您可以過濾的Worf 引述:
>>> worf_quote = "Sir, I protest. I am not a merry man!"
現在worf_quote按單詞標記并將結果列表存儲在words_in_quote:
>>> words_in_quote = word_tokenize(worf_quote) >>> words_in_quote ['Sir', ',', 'protest', '.', 'merry', 'man', '!']
您有一個 中的詞列表worf_quote,因此下一步是創建一組停用詞以進行過濾words_in_quote。對于此示例,您需要關注 中的停用詞"english":
>>> stop_words = set(stopwords.words("english"))
接下來,創建一個空列表來保存通過過濾器的單詞:
>>> filtered_list = []
您創建了一個空列表 ,filtered_list以保存words_in_quote其中不是停用詞的所有單詞。現在您可以使用stop_words過濾器words_in_quote:
>>> for word in words_in_quote: ... if word.casefold() not in stop_words: ... filtered_list.append(word)
您words_in_quote使用for循環進行迭代并將所有不是停用詞的詞添加到filtered_list.?您使用了.casefold()onword這樣您就可以忽略其中的字母word是大寫還是小寫。這是值得做的,因為stopwords.words('english')僅包含停用詞的小寫版本。
或者,您可以使用列表理解來列出文本中所有不是停用詞的單詞:
>>> filtered_list = [ ... word for word in words_in_quote if word.casefold() not in stop_words ... ]
當您使用列表推導式時,您不會創建一個空列表,然后將項目添加到它的末尾。相反,您可以同時定義列表及其內容。使用列表推導式通常被視為更Pythonic。
看看以 結尾的單詞filtered_list:
>>> filtered_list ['Sir', ',', 'protest', '.', 'merry', 'man', '!']
你過濾掉了幾個像'am'和這樣的詞'a',但你也過濾掉了'not',這確實影響了句子的整體含義。(Worf 不會對此感到高興。)
像'I'和這樣的詞'not'可能看起來太重要而無法過濾掉,這取決于您想要進行的分析類型,它們可以是。原因如下:
'I'?是代詞,是上下文詞而不是內容詞:
'not'從技術上講是副詞,但仍包含在NLTK 的英語停用詞列表中。如果您想編輯停用詞列表以排除'not'或進行其他更改,則可以下載它。
所以,'I'and'not'可以是句子的重要部分,但這取決于你想從這句話中學到什么。
詞干
詞干提取是一項文本處理任務,您可以在其中將單詞縮減為詞根,這是詞的核心部分。例如,單詞“helping”和“helper”共享詞根“help”。詞干分析允許您將單詞的基本含義歸零,而不是將其使用方式的所有細節歸零。NLTK 有多個詞干分析器,但您將使用Porter 詞干分析器。
以下是如何導入 NLTK 的相關部分以開始詞干:
>>> from nltk.stem import PorterStemmer >>> from nltk.tokenize import word_tokenize
現在您已完成導入,您可以使用以下命令創建詞干分析器PorterStemmer():
>>> stemmer = PorterStemmer()
下一步是為您創建一個字符串作為詞干。這是您可以使用的一個:
>>>
>>> string_for_stemming = """ ... The crew of the USS Discovery discovered many discoveries. ... Discovering is what explorers do."""
在您可以提取該字符串中的單詞之前,您需要將其中的所有單詞分開:
>>>
>>> words = word_tokenize(string_for_stemming)
現在您有了字符串中所有標記詞的列表,請查看其中的內容words:
>>> words ['The', 'crew', 'of', 'the', 'USS', 'Discovery', 'discovered', 'many', 'discoveries', '.', 'Discovering', 'is', 'what', 'explorers', 'do', '.']
words通過stemmer.stem()在列表理解中使用,創建單詞 in 的詞干版本列表:
>>>
>>> stemmed_words = [stemmer.stem(word) for word in words]
看看里面有什么stemmed_words:
>>>
>>> stemmed_words ['the', 'crew', 'of', 'the', 'uss', 'discoveri', 'discov', 'mani', 'discoveri', '.', 'discov', 'is', 'what', 'explor', 'do', '.']
以下是所有以'discov'or開頭的單詞的情況'Discov':
這些結果看起來有點不一致。'Discovery'給你的'discoveri'時候為什么要給'Discovering'你'discov'?
詞干不足和詞干過度是詞干可能出錯的兩種方式:
Understemming當兩個相關的詞應減少到相同的干,但都沒有發生。這是一個假陰性。
當兩個不相關的詞被簡化為同一個詞干時,即使它們不應該如此,也會發生過度詞干。這是一個誤報。
該波特詞干算法從1979年的日期,所以它是上了年紀的側一點。該雪球詞干,也稱為Porter2,是對原有的改進,也可以通過NLTK,所以你可以使用一個在自己的項目。還值得注意的是,Porter 詞干分析器的目的不是生成完整的單詞,而是查找單詞的變體形式。
幸運的是,您還有其他一些方法可以將單詞簡化為它們的核心含義,例如詞形還原,您將在本教程后面看到。但首先,我們需要涵蓋詞性。
標記詞性
詞性是一個語法術語,處理單詞在句子中一起使用時所扮演的角色。標記詞性或詞性標記是根據詞性標記文本中的單詞的任務。
在英語中,有八個詞類:
一些來源還包括詞性列表中的類別冠詞(如“a”或“the”),但其他來源將它們視為形容詞。NLTK 使用單詞確定器來指代文章。
以下是如何導入 NLTK 的相關部分以標記詞性:
>>>
>>> from nltk.tokenize import word_tokenize
現在創建一些要標記的文本。你可以使用這個卡爾薩根名言:
>>>
>>> sagan_quote = """ ... If you wish to make an apple pie from scratch, ... you must first invent the universe."""
使用word_tokenize的話在該字符串分隔,并將它們存儲在一個列表:
>>>
>>> words_in_sagan_quote = word_tokenize(sagan_quote)
現在調用nltk.pos_tag()你的新單詞列表:
>>>
>>> import nltk >>> nltk.pos_tag(words_in_sagan_quote) [('If', 'IN'), ('you', 'PRP'), ('wish', 'VBP'), ('to', 'TO'), ('make', 'VB'), ('an', 'DT'), ('apple', 'NN'), ('pie', 'NN'), ('from', 'IN'), ('scratch', 'NN'), (',', ','), ('you', 'PRP'), ('must', 'MD'), ('first', 'VB'), ('invent', 'VB'), ('the', 'DT'), ('universe', 'NN'), ('.', '.')]
引用中的所有單詞現在都在一個單獨的元組中,并帶有一個表示其詞性的標簽。但是標簽是什么意思?以下是獲取標簽列表及其含義的方法:
>>>
>>> nltk.help.upenn_tagset()
該列表很長,但您可以隨意展開下面的框進行查看。
POS 標簽及其含義顯示隱藏
以下是您可以用來開始使用 NLTK 的 POS 標簽的摘要:
現在您知道 POS 標簽的含義,您可以看到您的標簽相當成功:
'pie'被標記NN是因為它是一個單數名詞。
'you'被標記PRP是因為它是人稱代詞。
'invent'被標記VB是因為它是動詞的基本形式。
但是 NLTK 將如何處理在一個基本上是胡言亂語的文本中標記詞性呢?Jabberwocky是一首胡說八道的詩,從技術上講并沒有多大意義,但它的寫作方式仍然可以向說英語的人傳達某種意義。
制作一個字符串來保存這首詩的摘錄:
>>>
>>> jabberwocky_excerpt = """ ... 'Twas brillig, and the slithy toves did gyre and gimble in the wabe: ... all mimsy were the borogoves, and the mome raths outgrabe."""
使用word_tokenize的詞語的摘錄分開,并將它們存儲在一個列表:
>>>
>>> words_in_excerpt = word_tokenize(jabberwocky_excerpt)
調用nltk.pos_tag()你的新單詞列表:
>>>
>>> nltk.pos_tag(words_in_excerpt) [("'T", 'NN'), ('was', 'VBD'), ('brillig', 'VBN'), (',', ','), ('and', 'CC'), ('the', 'DT'), ('slithy', 'JJ'), ('toves', 'NNS'), ('did', 'VBD'), ('gyre', 'NN'), ('and', 'CC'), ('gimble', 'JJ'), ('in', 'IN'), ('the', 'DT'), ('wabe', 'NN'), (':', ':'), ('all', 'DT'), ('mimsy', 'NNS'), ('were', 'VBD'), ('the', 'DT'), ('borogoves', 'NNS'), (',', ','), ('and', 'CC'), ('the', 'DT'), ('mome', 'JJ'), ('raths', 'NNS'), ('outgrabe', 'RB'), ('.', '.')]
接受的英語單詞 like'and'和'the'分別被正確標記為連詞和限定詞。這個胡言亂語的詞'slithy'被標記為形容詞,這也是講英語的人可能會根據詩的上下文做出的假設。一路走好,NLTK!
詞形還原
現在您已經掌握了詞性,您可以回到詞形還原。像詞干提取一樣,詞形還原將單詞簡化為它們的核心含義,但它會給你一個完整的英語單詞,它本身就有意義,而不僅僅是像'discoveri'.
注:一個引理是代表字的整組一個詞,那組詞被稱為語義。
例如,如果您要在字典中查找單詞“blending”,那么您需要查看“blend”的條目,但您會發現該條目中列出了“blending”。
在這個例子中,“blend”是詞條,“blending”是詞素的一部分。因此,當您對一個詞進行詞形還原時,您就是在將它簡化為它的詞綴。
以下是如何導入 NLTK 的相關部分以開始詞形還原:
>>>
>>> from nltk.stem import WordNetLemmatizer
創建一個 lemmatizer 以使用:
>>>
>>> lemmatizer = WordNetLemmatizer()
讓我們從詞形還原一個復數名詞開始:
>>>
>>> lemmatizer.lemmatize("scarves") 'scarf'
"scarves"給了你'scarf',所以這已經比你用 Porter 詞干分析器得到的要復雜一點,即'scarv'.?接下來,創建一個包含多個單詞的字符串以進行詞形還原:
>>>
>>> string_for_lemmatizing = "The friends of DeSoto love scarves."
現在按單詞標記該字符串:
>>>
>>> words = word_tokenize(string_for_lemmatizing)
這是你的單詞列表:
>>>
>>> words ['The', 'friends', 'of', 'DeSoto', 'love' 'scarves', '.']
創建一個包含words詞形還原后的所有單詞的列表:
>>>
>>> lemmatized_words = [lemmatizer.lemmatize(word) for word in words]
這是你得到的清單:
>>>
>>> lemmatized_words ['The', 'friend', 'of', 'DeSoto', 'love', 'scarf', '.'
看起來是對的。復數'friends'和'scarves'變成單數'friend'和'scarf'。
但是,如果您將一個看起來與其引理非常不同的詞引理化會發生什么?嘗試詞形還原"worst":
>>>
>>> lemmatizer.lemmatize("worst") 'worst'
你得到了結果,'worst'因為lemmatizer.lemmatize()假設那"worst"是一個名詞。你可以明確表示你想"worst"成為一個形容詞:
>>>
>>> lemmatizer.lemmatize("worst", pos="a") 'bad'
for 的默認參數pos是'n'名詞,但您"worst"通過添加參數確保將其視為形容詞pos="a"。結果,您得到了'bad',它看起來與您的原始詞非常不同,并且與您使用詞干時得到的完全不同。這是因為"worst"is 是形容詞的最高級形式'bad',詞形還原減少了最高級以及與它們的引理的比較級。
既然您知道如何使用 NLTK 來標記詞性,您可以在詞形還原之前嘗試標記詞,以避免混淆同形異義詞或拼寫相同但含義不同且可能是詞性不同的詞。
分塊
分詞可讓您識別單詞和句子,而組塊可讓您識別短語。
注意:甲短語是一個單詞或一組單詞的作品作為單個單元來執行語法功能。名詞短語圍繞名詞構建。
這里有些例子:
“一顆行星”
“一個傾斜的星球”
“一個快速傾斜的星球”
分塊使用 POS 標簽對單詞進行分組并將塊標簽應用于這些組。塊不重疊,因此一個單詞的一個實例一次只能在一個塊中。
以下是如何導入 NLTK 的相關部分以進行分塊:
>>>
>>> from nltk.tokenize import word_tokenize
在進行分塊之前,您需要確保文本中的詞性已被標記,因此創建一個用于詞性標記的字符串。您可以使用指環王中的這句話:
>>>
>>> lotr_quote = "It's a dangerous business, Frodo, going out your door."
現在按單詞標記該字符串:
>>>
>>> words_in_lotr_quote = word_tokenize(lotr_quote) >>> words_in_lotr_quote ['It', "'s", 'a', 'dangerous', 'business', ',', 'Frodo', ',', 'going', 'out', 'your', 'door', '.']
現在您已經獲得了 中所有單詞的列表lotr_quote。
下一步是按詞性標記這些詞:
>>>
>>> nltk.download("averaged_perceptron_tagger") >>> lotr_pos_tags = nltk.pos_tag(words_in_lotr_quote) >>> lotr_pos_tags [('It', 'PRP'), ("'s", 'VBZ'), ('a', 'DT'), ('dangerous', 'JJ'), ('business', 'NN'), (',', ','), ('Frodo', 'NNP'), (',', ','), ('going', 'VBG'), ('out', 'RP'), ('your', 'PRP$'), ('door', 'NN'), ('.', '.')]
您已經獲得了引用中所有單詞的元組列表,以及它們的 POS 標簽。為了分塊,首先需要定義一個分塊語法。
注:一個塊的語法是規則上的句子應該如何進行分塊的組合。它經常使用正則表達式或正則表達式。
對于本教程,您無需了解正則表達式的工作原理,但如果您想處理文本,它們將來肯定會派上用場。
使用一個正則表達式規則創建塊語法:
>>>
>>> grammar = "NP: {
NP代表名詞短語。您可以在使用 Python進行自然語言處理—使用自然語言工具包分析文本的第 7 章中了解有關名詞短語組塊的更多信息。
根據您創建的規則,您的塊:
從可選的 (??) 限定符 (?'DT') 開始
可以有任意數量的 (?*) 形容詞 (?JJ)
以名詞結尾 (?
使用以下語法創建塊解析器:
>>>
>>> chunk_parser = nltk.RegexpParser(grammar)
現在試試你的報價:
>>>
>>> tree = chunk_parser.parse(lotr_pos_tags)
您可以通過以下方式查看此樹的可視化表示:
>>>
>>> tree.draw()
這是視覺表示的樣子:
你有兩個名詞短語:
'a dangerous business'?有限定詞、形容詞和名詞。
'door'?只有一個名詞。
既然您已經了解了分塊,那么是時候看看分塊了。
Chinking
Chinking 與chunking 一起使用,但chunking 用于包含模式,chinking用于排除模式。
讓我們重用您在分塊部分中使用的引用。您已經有一個包含引用中每個單詞及其詞性標記的元組列表:
>>>
>>> lotr_pos_tags [('It', 'PRP'), ("'s", 'VBZ'), ('a', 'DT'), ('dangerous', 'JJ'), ('business', 'NN'), (',', ','), ('Frodo', 'NNP'), (',', ','), ('going', 'VBG'), ('out', 'RP'), ('your', 'PRP$'), ('door', 'NN'), ('.', '.')]
下一步是創建語法來確定要在塊中包含和排除的內容。這一次,您將使用多個行,因為您將擁有多個規則。因為您使用的語法不止一行,所以您將使用三重引號 (?"""):
>>>
>>> grammar = """ ... Chunk: {<.*>+} ... }
你的語法的第一條規則是{<.*>+}。此規則有面向內的花括號 (?{}),因為它用于確定要包含在塊中的模式。在這種情況下,您希望包含所有內容:<.*>+.
你的語法的第二條規則是}
使用以下語法創建塊解析器:
>>>
>>> chunk_parser = nltk.RegexpParser(grammar)
現在用您指定的縫隙將您的句子分塊:
>>>
>>> tree = chunk_parser.parse(lotr_pos_tags)
結果是這棵樹:
>>>
>>> tree Tree('S', [Tree('Chunk', [('It', 'PRP'), ("'s", 'VBZ'), ('a', 'DT')]), ('dangerous', 'JJ'), Tree('Chunk', [('business', 'NN'), (',', ','), ('Frodo', 'NNP'), (',', ','), ('going', 'VBG'), ('out', 'RP'), ('your', 'PRP$'), ('door', 'NN'), ('.', '.')])])
在這種情況下,('dangerous', 'JJ')被排除在塊之外,因為它是一個形容詞 (?JJ)。但是如果您再次獲得圖形表示會更容易看到:
>>>
>>> tree.draw()
您將獲得以下可視化表示tree:
在這里,您已經'dangerous'從塊中排除了形容詞,并留下了包含其他所有內容的兩個塊。第一個塊包含出現在被排除的形容詞之前的所有文本。第二個塊包含被排除的形容詞之后的所有內容。
現在您知道如何從塊中排除模式,是時候研究命名實體識別 (NER) 了。
使用命名實體識別 (NER)
命名實體是指代特定位置、人員、組織等的名詞短語。通過命名實體識別,您可以在文本中找到命名實體并確定它們是哪種命名實體。
以下是NLTK 書中的命名實體類型列表:
您可以使用nltk.ne_chunk()來識別命名實體。讓我們lotr_pos_tags再次使用來測試一下:
>>>
>>> nltk.download("maxent_ne_chunker") >>> nltk.download("words") >>> tree = nltk.ne_chunk(lotr_pos_tags)
現在來看看視覺表現:
>>>
>>> tree.draw()
這是你得到的:
看到如何Frodo被標記為PERSON?binary=True如果您只想知道命名實體是什么而不是它們是什么類型的命名實體,您也可以選擇使用該參數:
>>>
>>> tree = nltk.ne_chunk(lotr_pos_tags, binary=True) >>> tree.draw()
現在你看到的Frodo是一個NE:
這就是您可以識別命名實體的方法!但是您可以更進一步,直接從文本中提取命名實體。創建一個字符串,從中提取命名實體。你可以使用世界大戰中的這句話:
>>>
>>> quote = """ ... Men like Schiaparelli watched the red planet—it is odd, by-the-bye, that ... for countless centuries Mars has been the star of war—but failed to ... interpret the fluctuating appearances of the markings they mapped so well. ... All that time the Martians must have been getting ready. ... ... During the opposition of 1894 a great light was seen on the illuminated ... part of the disk, first at the Lick Observatory, then by Perrotin of Nice, ... and then by other observers. English readers heard of it first in the ... issue of Nature dated August 2."""
現在創建一個函數來提取命名實體:
>>>
>>> def extract_ne(quote): ... words = word_tokenize(quote, language=language) ... tags = nltk.pos_tag(words) ... tree = nltk.ne_chunk(tags, binary=True) ... return set( ... " ".join(i[0] for i in t) ... for t in tree ... if hasattr(t, "label") and t.label() == "NE" ... )
使用此功能,您可以無重復地收集所有命名實體。為此,您可以按單詞進行標記,將詞性標簽應用于這些單詞,然后根據這些標簽提取命名實體。因為您包含了binary=True,您將獲得的命名實體將不會被更具體地標記。您只會知道它們是命名實體。
看看你提取的信息:
>>>
>>> extract_ne(quote) {'Lick Observatory', 'Mars', 'Nature', 'Perrotin', 'Schiaparelli'}
你錯過了尼斯市,可能是因為 NLTK 將它解釋為一個普通的英語形容詞,但你仍然得到以下內容:
機構:?'Lick Observatory'
一顆行星:?'Mars'
一個出版物:?'Nature'
人:?'Perrotin'、'Schiaparelli'
這是一些相當不錯的品種!
獲取要分析的文本
既然您已經使用小示例文本完成了一些文本處理任務,您就可以立即分析一堆文本了。一組文本稱為語料庫。NLTK 提供了多種語料庫,涵蓋從古騰堡計劃主持的小說到美國總統就職演說的所有內容。
為了分析 NLTK 中的文本,您首先需要導入它們。這需要nltk.download("book"),這是一個相當大的下載:
>>>
>>> nltk.download("book") >>> from nltk.book import * *** Introductory Examples for the NLTK Book *** Loading text1, ..., text9 and sent1, ..., sent9 Type the name of the text or sentence to view it. Type: 'texts()' or 'sents()' to list the materials. text1: Moby Dick by Herman Melville 1851 text2: Sense and Sensibility by Jane Austen 1811 text3: The Book of Genesis text4: Inaugural Address Corpus text5: Chat Corpus text6: Monty Python and the Holy Grail text7: Wall Street Journal text8: Personals Corpus text9: The Man Who Was Thursday by G . K . Chesterton 1908
您現在可以訪問一些線性文本(例如Sense and Sensibility和Monty Python and the Holy Grail)以及幾組文本(例如聊天語料庫和個人語料庫)。人性是迷人的,所以讓我們通過仔細查看交友語料庫來看看我們可以發現什么!
這個語料庫是一個交友廣告的集合,這是網上約會的早期版本。如果你想見一個人,那么你可以在報紙上放個廣告,然后等待其他讀者回復你。
如果您想學習如何讓其他文本進行分析,那么您可以查看使用 Python進行自然語言處理的第 3 章– 使用自然語言工具包分析文本。
使用索引
當您使用索引時,您可以看到每次使用一個詞時,以及它的直接上下文。這可以讓您了解一個詞在句子級別的使用方式以及與它一起使用的詞。
來看看這些尋找愛情的好人怎么說吧!個人語料庫被稱為text8,因此我們將.concordance()使用參數調用它"man":
>>>
>>> text8.concordance("man") Displaying 14 of 14 matches: to hearing from you all . ABLE young man seeks , sexy older women . Phone for ble relationship . GENUINE ATTRACTIVE MAN 40 y . o ., no ties , secure , 5 ft . ship , and quality times . VIETNAMESE MAN Single , never married , financially ip . WELL DRESSED emotionally healthy man 37 like to meet full figured woman fo nth subs LIKE TO BE MISTRESS of YOUR MAN like to be treated well . Bold DTE no eeks lady in similar position MARRIED MAN 50 , attrac . fit , seeks lady 40 - 5 eks nice girl 25 - 30 serious rship . Man 46 attractive fit , assertive , and k 40 - 50 sought by Aussie mid 40s b / man f / ship r / ship LOVE to meet widowe discreet times . Sth E Subs . MARRIED MAN 42yo 6ft , fit , seeks Lady for discr woman , seeks professional , employed man , with interests in theatre , dining tall and of large build seeks a good man . I am a nonsmoker , social drinker , lead to relationship . SEEKING HONEST MAN I am 41 y . o ., 5 ft . 4 , med . bui quiet times . Seeks 35 - 45 , honest man with good SOH & similar interests , f genuine , caring , honest and normal man for fship , poss rship . S / S , S /
有趣的是,這十四場比賽中的最后三場與尋找一個誠實的人有關,具體來說:
SEEKING HONEST MAN
Seeks 35 - 45 , honest man with good SOH & similar interests
genuine , caring , honest and normal man for fship , poss rship
讓我們看看這個詞是否有類似的模式"woman":
>>>
>>> text8.concordance("woman") Displaying 11 of 11 matches: at home . Seeking an honest , caring woman , slim or med . build , who enjoys t thy man 37 like to meet full figured woman for relationship . 48 slim , shy , S rry . MALE 58 years old . Is there a Woman who would like to spend 1 weekend a other interests . Seeking Christian Woman for fship , view to rship . SWM 45 D ALE 60 - burly beared seeks intimate woman for outings n / s s / d F / ston / P ington . SCORPIO 47 seeks passionate woman for discreet intimate encounters SEX le dad . 42 , East sub . 5 " 9 seeks woman 30 + for f / ship relationship TALL personal trainer looking for married woman age open for fun MARRIED Dark guy 37 rinker , seeking slim - medium build woman who is happy in life , age open . AC . O . TERTIARY Educated professional woman , seeks professional , employed man real romantic , age 50 - 65 y . o . WOMAN OF SUBSTANCE 56 , 59 kg ., 50 , fit
誠實問題只出現在第一場比賽中:
Seeking an honest , caring woman , slim or med . build
深入研究語料庫并不能提供完整的圖片,但看一眼并查看是否有任何突出之處仍然很有趣。
制作色散圖
您可以使用分散圖來查看特定單詞出現的次數以及出現的位置。到目前為止,我們一直在尋找"man"and?"woman",但看看這些詞與其同義詞相比的使用量會很有趣:
>>>
>>> text8.dispersion_plot( ... ["woman", "lady", "girl", "gal", "man", "gentleman", "boy", "guy"] ... )
這是您得到的分散圖
每條垂直的藍線代表一個詞的一個實例。每條水平的藍線代表整個語料庫。該圖顯示:
"lady"被使用得比"woman"or多得多"girl"。沒有實例"gal"。
"man"and"guy"被使用的次數相似,并且比"gentleman"or更常見"boy"。
當您想查看單詞在文本或語料庫中的顯示位置時,可以使用離散圖。如果您正在分析單個文本,這可以幫助您查看哪些單詞顯示在彼此附近。如果您正在分析按時間順序組織的文本語料庫,它可以幫助您了解哪些詞在一段時間內或多或少地被使用。
繼續以浪漫為主題,通過為Sense 和 Sensibility制作一個分散圖,看看你能發現什么,即text2。簡奧斯汀的小說講了很多人的家,所以用幾個家的名字做一個分散的情節:
>>>
>>> text2.dispersion_plot(["Allenham", "Whitwell", "Cleveland", "Combe"])
這是你得到的情節:
顯然,艾倫漢姆在小說的前三分之一中被提到了很多,然后就不再出現了。另一方面,克利夫蘭在前三分之二中幾乎沒有出現,但在后三分之一中出現了相當多的表現。這種分布反映了瑪麗安和威洛比之間關系的變化:
Allenham是 Willoughby 的恩人的家,當 Marianne 第一次對他感興趣時,他經常出現。
克利夫蘭是瑪麗安去倫敦看威洛比后住的家,但事情出了問題。
色散圖只是您可以為文本數據制作的一種可視化類型。您將了解的下一個是頻率分布。
進行頻率分布
通過頻率分布,您可以檢查文本中出現頻率最高的單詞。您需要開始使用import:
>>>
>>> from nltk import FreqDist
FreqDist是 的子類collections.Counter。以下是創建整個交友廣告語料庫頻率分布的方法:
>>>
>>> frequency_distribution = FreqDist(text8) >>> print(frequency_distribution)
由于1108樣本和4867結果包含大量信息,因此請先縮小范圍。以下是查看20語料庫中最常用詞的方法:
>>>
>>> frequency_distribution.most_common(20) [(',', 539), ('.', 353), ('/', 110), ('for', 99), ('and', 74), ('to', 74), ('lady', 68), ('-', 66), ('seeks', 60), ('a', 52), ('with', 44), ('S', 36), ('ship', 33), ('&', 30), ('relationship', 29), ('fun', 28), ('in', 27), ('slim', 27), ('build', 27), ('o', 26)]
您的頻率分布中有很多停用詞,但您可以像之前一樣刪除它們。創建一個包含所有text8不是停用詞的詞的列表:
>>>
>>> meaningful_words = [ ... word for word in text8 if word.casefold() not in stop_words ... ]
既然您已經有了語料庫中所有非停用詞的列表,請進行頻率分布:
>>>
>>> frequency_distribution = FreqDist(meaningful_words)
看看20最常見的詞:
>>>
>>> frequency_distribution.most_common(20) [(',', 539), ('.', 353), ('/', 110), ('lady', 68), ('-', 66), ('seeks', 60), ('ship', 33), ('&', 30), ('relationship', 29), ('fun', 28), ('slim', 27), ('build', 27), ('smoker', 23), ('50', 23), ('non', 22), ('movies', 22), ('good', 21), ('honest', 20), ('dining', 19), ('rship', 18)]
您可以將此列表轉換為圖表:
>>>
>>> frequency_distribution.plot(20, cumulative=True)
這是你得到的圖表:
一些最常見的詞是:
'lady'
'seeks'
'ship'
'relationship'
'fun'
'slim'
'build'
'smoker'
'50'
'non'
'movies'
'good'
'honest'
從你已經了解的關于寫這些交友廣告的人的情況來看,他們似乎確實對誠實感興趣并且經常使用這個詞'lady'。此外,'slim'和'build'都顯示了相同的次數。當您學習索引時,您看到slim和build使用彼此接近,所以也許這兩個詞在這個語料庫中經常一起使用。這給我們帶來了搭配!
尋找搭配
甲搭配是字序列該數值顯示常。如果你對英語中的常見搭配感興趣,那么你可以查看BBI英語單詞組合詞典。這是一個方便的參考,您可以使用它來幫助您確保您的寫作是地道的。以下是一些使用“樹”一詞的搭配示例:
語法樹
家譜
決策樹
要查看語料庫中經常出現的單詞對,您需要調用.collocations()它:
>>>
>>> text8.collocations() would like; medium build; social drinker; quiet nights; non smoker; long term; age open; Would like; easy going; financially secure; fun times; similar interests; Age open; weekends away; poss rship; well presented; never married; single mum; permanent relationship; slim build
slim build確實出現了,medium build和其他幾個單詞組合一樣。雖然沒有長時間在海灘上散步!
但是,如果您在對語料庫中的單詞進行詞形還原后尋找搭配會發生什么?您是否會發現一些您第一次錯過的單詞組合,因為它們的版本略有不同?
如果按照說明前面,那么你就已經有了lemmatizer,但你不能叫collocations()上只是任何數據類型,所以你會需要做一些準備工作。首先創建 中所有單詞的詞形還原版本列表text8:
>>>
>>> lemmatized_words = [lemmatizer.lemmatize(word) for word in text8]
但是為了讓您能夠完成迄今為止所見的語言處理任務,您需要使用以下列表制作NLTK 文本:
>>>
>>> new_text = nltk.Text(lemmatized_words)
以下是如何查看您的 中的搭配new_text:
>>>
>>> new_text.collocations() medium build; social drinker; non smoker; long term; would like; age open; easy going; financially secure; Would like; quiet night; Age open; well presented; never married; single mum; permanent relationship; slim build; year old; similar interest; fun time; Photo pls
與你之前的搭配清單相比,這個新搭配少了一些:
weekends away
poss rship
quiet nights仍然出現在詞形還原版本中的想法,quiet night.?您最近對搭配的搜索也帶來了一些新聞:
year old?建議用戶經常提到年齡。
photo pls?建議用戶經常請求一張或多張照片。
這就是您如何找到常見的單詞組合以了解人們在談論什么以及他們如何談論它!
結論
恭喜您邁出了NLP 的第一步!一個全新的非結構化數據世界現已開放供您探索。現在您已經了解了文本分析任務的基礎知識,您可以找到一些文本進行分析,看看您可以了解關于文本本身以及編寫它們的人和它們所涉及的主題的內容。
現在您知道如何:
查找要分析的文本
預處理您的文本以進行分析
分析你的文字
根據您的分析創建可視化
對于下一步,您可以使用 NLTK 來分析文本以查看其中表達的情緒是積極的還是消極的。要了解有關情感分析的更多信息,請查看情感分析:使用 Python 的 NLTK 庫的第一步。如果您想更深入地了解NLTK 的具體細節,那么您可以按照自己的方式使用 Python進行自然語言處理——使用自然語言工具包分析文本。
現在走出去,找到一些文本來分析!
【生長吧!Python】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/278897
Python 機器學習 自然語言處理基礎
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。