當今世界,大量數據是非結構化的,例如社交媒體評論、瀏覽歷史和客戶反饋等文本數據。面對海量文本數據卻不知從何下手分析? Python 的自然語言處理 (NLP) 技術可以助您一臂之力!
本教程旨在指導您運用 NLP 的核心概念,使用 Python 分析文本數據。我們將學習如何將文本分解成更小的單元(詞元化),將單詞規範化為詞幹形式(詞幹提取和詞形還原),以及如何清理文檔以準備進一步分析。
讓我們開始吧!
FreqDist
類查找單詞頻率。這對於查找文本中常用的術語非常有用。 本教程將使用 Python 的 NLTK 庫對文本執行所有 NLP 操作。撰寫本教程時,我們使用的是 NLTK 3.4 版本。您可以使用終端上的 pip 命令安裝該庫:
pip install nltk==3.4
要檢查系統中安裝的 NLTK 版本,可以將庫導入 Python 解釋器並檢查版本:
import nltk print(nltk.__version__)
在本教程中,為了執行 NLTK 中的某些操作,您可能需要下載特定的資源。我們將在需要時對每個資源進行描述。
但是,如果您想避免在教程後期逐個下載資源,可以現在一次性下載所有資源:
python -m nltk.downloader all
計算機系統無法自行理解自然語言。處理自然語言的第一步是將原始文本轉換為詞元。詞元是具有某種意義的連續字符的組合。如何將句子分解成詞元取決於您自己。例如,一種簡單的方法是按空格分割句子以將其分解成單個單詞。
在 NLTK 庫中,您可以使用 word_tokenize()
函數將字符串轉換為詞元。但是,您首先需要下載 punkt 資源。在終端中運行以下命令:
nltk.download('punkt')
接下來,您需要從 nltk.tokenize
導入 word_tokenize
以使用它:
from nltk.tokenize import word_tokenize print(word_tokenize("Hi, this is a nice hotel."))
代碼的輸出如下:
pip install nltk==3.4
您會注意到,word_tokenize
不僅僅是基於空格分割字符串,還會將標點符號也分離成詞元。保留或去除標點符號取決於您的分析需求。
在處理自然語言時,您經常會注意到同一個單詞存在各種語法形式。例如,“go”、“going”和“gone”都是同一個動詞“go”的不同形式。
雖然您的項目可能需要保留單詞的各種語法形式,但讓我們討論一種將同一個單詞的不同語法形式轉換為其詞幹形式的方法。您可以使用兩種技術將單詞轉換為其詞幹形式。
第一種技術是詞幹提取。詞幹提取是一種簡單的算法,它去除單詞的詞綴。 NLTK 中有多種可用的詞幹提取算法。在本教程中,我們將使用 Porter 算法。
我們首先從 nltk.stem.porter
導入 PorterStemmer
。接下來,我們將詞幹提取器初始化為 stemmer
變量,然後使用 .stem()
方法查找單詞的詞幹形式:
import nltk print(nltk.__version__)
上面代碼的輸出是 go。如果您對上面描述的“go”的其他形式運行詞幹提取器,您會注意到詞幹提取器返回相同的詞幹形式“go”。但是,由於詞幹提取只是一個基於去除單詞詞綴的簡單算法,因此當單詞在語言中使用頻率較低時,它會失效。
例如,當您嘗試對單詞“constitutes”使用詞幹提取器時,它會給出不直觀的結果:
python -m nltk.downloader all
您會注意到輸出是“constitut”。
這個問題可以通過採用更複雜的方法來解決,該方法是在給定的上下文中查找單詞的詞幹形式。這個過程稱為詞形還原。詞形還原根據文本的上下文和詞彙表將單詞規範化。在 NLTK 中,您可以使用 WordNetLemmatizer
類對句子進行詞形還原。
首先,您需要從 NLTK 下載器在 Python 終端下載 wordnet 資源:
nltk.download('punkt')
下載完成後,您需要導入 WordNetLemmatizer
類並對其進行初始化:
from nltk.tokenize import word_tokenize print(word_tokenize("Hi, this is a nice hotel."))
要使用詞形還原器,請使用 .lemmatize()
方法。它接受兩個參數:單詞和上下文。在我們的示例中,我們將使用“v”作為上下文。在查看 .lemmatize()
方法的輸出後,我們將進一步探討上下文:
<code>['Hi', ',', 'this', 'is', 'a', 'nice', 'hotel', '.']</code>
您會注意到,.lemmatize()
方法正確地將單詞“constitutes”轉換為其詞幹形式“constitute”。您還會注意到,詞形還原比詞幹提取花費的時間更長,因為該算法更複雜。
讓我們檢查如何以編程方式確定 .lemmatize()
方法的第二個參數。 NLTK 有一個 pos_tag()
函數,它有助於確定句子中單詞的上下文。但是,您首先需要通過 NLTK 下載器下載 averaged_perceptron_tagger
資源:
pip install nltk==3.4
接下來,導入 pos_tag()
函數並在句子上運行它:
import nltk print(nltk.__version__)
您會注意到,輸出是一個對列表。每一對都包含一個詞元及其標籤,該標籤表示詞元在整個文本中的上下文。請注意,標點符號的標籤就是它本身:
python -m nltk.downloader all
如何解碼每個詞元的上下文?以下是網絡上所有標籤及其相應含義的完整列表。請注意,所有名詞的標籤都以“N”開頭,所有動詞的標籤都以“V”開頭。我們可以在 .lemmatize()
方法的第二個參數中使用此信息:
nltk.download('punkt')
上面代碼的輸出如下:
from nltk.tokenize import word_tokenize print(word_tokenize("Hi, this is a nice hotel."))
此輸出符合預期,“constitutes”和“magistrates”分別轉換為“constitute”和“magistrate”。
準備數據的下一步是清理數據並去除任何不會為您的分析增加意義的內容。總的來說,我們將研究如何從分析中去除標點符號和停用詞。
去除標點符號是一項相當簡單的任務。 string
庫的 punctuation
對象包含英語中的所有標點符號:
<code>['Hi', ',', 'this', 'is', 'a', 'nice', 'hotel', '.']</code>
此代碼片段的輸出如下:
from nltk.stem.porter import PorterStemmer stemmer = PorterStemmer() print(stemmer.stem("going"))
為了從詞元中去除標點符號,您可以簡單地運行以下代碼:
print(stemmer.stem("constitutes"))
接下來,我們將重點介紹如何去除停用詞。停用詞是語言中常用的詞,例如“I”、“a”和“the”,在分析文本時,這些詞幾乎不提供任何意義。因此,我們將從分析中去除停用詞。首先,從 NLTK 下載器下載 stopwords 資源:
nltk.download('wordnet')
下載完成後,從 nltk.corpus
導入 stopwords
並使用 words()
方法,其中“english”作為參數。這是一個包含英語中 179 個停用詞的列表:
from nltk.stem.wordnet import WordNetLemmatizer lem = WordNetLemmatizer()
我們可以將詞形還原示例與本節中討論的概念結合起來,創建以下函數 clean_data()
。此外,在比較單詞是否屬於停用詞列表的一部分之前,我們將將其轉換為小寫。這樣,如果停用詞出現在句首並大寫,我們仍然可以捕獲它:
print(lem.lemmatize('constitutes', 'v'))
此示例的輸出如下:
nltk.download('averaged_perceptron_tagger')
如您所見,標點符號和停用詞已被去除。
現在您已經熟悉了 NLP 中的基本清理技術,讓我們嘗試查找文本中單詞的頻率。在本練習中,我們將使用童話故事《老鼠、鳥和香腸》的文本,該文本可在古騰堡項目上免費獲得。我們將把這個童話故事的文本存儲在一個字符串 text
中。
首先,我們對 text
進行詞元化,然後使用上面定義的函數 clean_data
對其進行清理:
pip install nltk==3.4
要查找文本中單詞的頻率分佈,可以使用 NLTK 的 FreqDist
類。使用詞元作為參數初始化該類。然後使用 .most_common()
方法查找常用術語。在本例中,讓我們嘗試查找前十個術語:
import nltk print(nltk.__version__)
以下是這個童話故事中出現頻率最高的十個術語:
python -m nltk.downloader all
不出所料,三個最常見的術語是童話故事中的三個主要人物。
在分析文本時,單詞的頻率可能並不重要。通常,NLP 的下一步是生成統計數據——TF-IDF(詞頻-逆文檔頻率)——它表示單詞在一組文檔中的重要性。
在本教程中,我們初步了解了 Python 中的自然語言處理。我們將文本轉換為詞元,將單詞轉換為其詞幹形式,最後清理文本以去除任何不會為分析增加意義的部分。
雖然在本教程中我們研究了簡單的 NLP 任務,但還有許多其他技術需要探索。例如,我們可能希望對文本數據執行主題建模,其目標是查找文本可能討論的共同主題。 NLP 中一項更複雜的任務是實現情感分析模型以確定任何文本背後的情感。
有任何意見或問題?請隨時在 Twitter 上聯繫我。
自然語言處理 (NLP) 和自然語言理解 (NLU) 是人工智能的兩個子領域,經常被混淆。 NLP 是一種更廣泛的概念,它包含所有用於使用自然語言與計算機交互的方法。這包括理解和生成人類語言。另一方面,NLU 是 NLP 的一個子集,專門處理理解方面。它涉及使用算法以有價值的方式理解和解釋人類語言。
提高 NLP 模型的準確性涉及多種策略。首先,您可以使用更多訓練數據。您的模型擁有的學習數據越多,其性能就越好。其次,考慮使用不同的 NLP 技術。例如,如果您使用的是詞袋 (BoW),您可能需要嘗試詞頻-逆文檔頻率 (TF-IDF) 或 Word2Vec。最後,微調模型的參數也可以帶來顯著改進。
NLP 在現實世界中具有廣泛的應用。這些包括語言翻譯、情感分析、聊天機器人、Siri 和 Alexa 等語音助手、文本摘要和電子郵件垃圾郵件檢測。
詞元化是將文本分解成單個單詞或詞元的過程。這是 NLP 中的一個關鍵步驟,因為它允許模型理解和分析文本。在 Python 中,您可以使用 NLTK 庫的 word_tokenize
函數來執行詞元化。
停用詞是常用詞,在 NLP 的預處理階段經常被過濾掉,因為它們不包含太多有意義的信息。示例包括“is”、“the”、“and”等。去除這些詞可以幫助提高 NLP 模型的性能。
由於語法、句法和詞彙的差異,在 NLP 中處理多種語言可能具有挑戰性。但是,Python 的 NLTK 庫支持多種語言。您還可以使用像 langdetect
這樣的語言檢測庫來識別文本的語言,然後再對其進行處理。
詞幹提取和詞形還原是用於將單詞簡化為其詞乾或詞根形式的技術。它們之間的主要區別在於,詞幹提取經常會創建不存在的單詞,而詞形還原則將單詞簡化為其語言上正確的詞根形式。
情感分析涉及確定文本中表達的情感。這可以使用各種 NLP 技術來完成。例如,您可以使用 Python 中的 TextBlob 庫輕鬆執行情感分析。
n 元語法是給定文本或語音樣本中 n 個連續項目的連續序列。它們用於 NLP 來預測序列中的下一個項目。例如,在二元語法 (n=2) 中,您考慮單詞對進行分析或預測。
文本分類涉及將文本分類到預定義的類別中。這可以使用各種 NLP 技術和機器學習算法來完成。例如,您可以使用詞袋或 TF-IDF 進行特徵提取,然後將這些特徵輸入機器學習模型進行分類。
以上是開始使用Python的自然語言處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!