AI學習入門之初識自然語言處理
1、自然語言處理的能力
一、語音識別:機器能夠識別自然語言的口語形式,并將其翻譯成文本形式。比如智能手機上的聽寫,你可以啟用聽寫功能并對著手機說話,它會將你所說的一切轉換成文本。
二、自然語言理解:機器能夠理解自然語言的口語和書面語。如果給機器一個命令,它就能理解并執行。
三、自然語言生成:機器能夠自己生成自然語言。
注:文本數據被稱為語料庫(corpora)或一個語料(corpus)。
2、自然語言處理中的應用
1、自動文摘:包括對語料庫生成摘要。 2、翻譯:要求有翻譯工具,以從不同的語言翻譯文本,例如,谷歌翻譯。 3、情感分析:這也被稱為情感的人工智能或意見挖掘,它是從書面和口頭語料庫中識別、提取和量化情感和情感狀態的過程。情感分析工具用于處理諸如客戶評論和社交媒體帖子之類的事情,以理解對特定事物的情緒反應和意見,比如新餐廳的菜品質量。 4、信息提取:這是從語料庫中識別并提取重要術語的過程,稱為實體。命名實體識別屬于這一類,將在下一章中解釋。 5、關系提取:關系提取包括從語料庫中提取語義關系。語義關系發生在兩個或多個實體(如人、組織和事物)之間屬于許多語義類別之一。 6、聊天機器人:聊天機器人是人工智能的一種形式,被設計成通過語音和文本與人類交流。 7、社交媒體分析:社交媒體的應用,如Twitter和Facebook,都有標簽和趨勢,并使用自然語言處理來跟蹤和監控這些標簽和趨勢,以了解世界各地正在交談的話題。此外,自然語言通過過濾負面的、攻擊性的和不恰當的評論和帖子來幫助優化過程。 8、個人語音助理:Siri、Alexa、谷歌助手以及Cortana都是個人語音助理,充分利用自然語言處理技術來理解和回應我們。 9、語法檢查:語法檢查軟件會自動檢查和糾正你的語法、標點和拼寫錯誤。
2.1、文本預處理
文本預處理思想是這樣的:機器不需要語料庫中的無關部分。它只需要執行手頭任務所需的重要單詞和短語。因此,文本預處理技術涉及為機器學習模型和深度學習模型以及適當的分析準備語料庫。文本預處理基本上是告訴機器什么需要考慮、哪些可以忽略。
每個語料庫根據需要來執行任務的不同文本預處理技術,一旦你學會了不同的預處理技術,你就會明白什么地方使用什么文本預處理技術和為什么使用。其中技術的解釋順序通常是被執行的順序。
在下面的練習中,我們將使用NLTK Python庫,但是在進行這些活動時可以隨意使用不同的庫。NLTK代表自然語言工具包(Natural Language Toolkit),是自然語言處理最簡單也是最受歡迎的Python庫之一,這就是為什么我們用它來理解自然語言處理的基本概念。
2.2、文本預處理技術
# 將輸入句子存儲在“s”變量中 s = "The cities I like most in India are Mumbai, Bangalore, Dharamsala and Allahabad." # 應用lower()函數將大寫字母轉換為小寫字符,然后打印新字符串 s = s.lower() print(s) # 創建一個大寫字符的單詞數組 words = ['indiA', 'India', 'india', 'iNDia'] # 使用列表理解,對words數組的每個元素應用lower()函數,然后打印新數組 words = [word.lower() for word in words] print(words)
# 導入正則表達式庫 import re # 創建一個名為“clean_words”的函數,該函數將包含從單詞中刪除不同類型噪聲的方法 def clean_words(text): # remove html markup text = re.sub("(<.*?>)", "", text) # remove non-ascii and digits text = re.sub("(\W|\d+)", " ", text) # remove whitespace text = text.strip() return text # 創建一個帶有噪聲的原始單詞數組 raw = ['..sleepy', 'sleepy!!', '#sleepy', '>>>>>sleepy>>>>', 'sleepy'] # 對raw數組中的單詞應用clean_words()函數,然后打印去噪后單詞數組 clean = [clean_words(r) for r in raw] print(clean)
文本規范化是將原始語料庫轉換為規范和標準形式的過程,這基本上是為了確保文本輸入在被分析、處理和操作之前保證一致。
對于規范化來說,并沒有標準的方法,因為它非常依賴于語料庫和手頭的任務。最常見的方法是使用字典映射,它涉及手動創建一個字典,將一個單詞的所有不同形式映射到該單詞,然后用一個標準形式的單詞替換掉每個單詞。
在語料庫上執行詞干提取以將詞語減少到詞干或詞根形式。說“詞干或詞根形式”的原因在于,詞干提取的過程并不總是將詞語簡化為詞根,有時只是將其簡化為規范形式。
經過詞干提取的詞語被稱為變形詞。這些單詞的形式與單詞的根形式不同,以表示諸如數字或性別之類的屬性。
# 導入nltk和pandas庫以及Porter Stemmer import nltk import pandas as pd from nltk.stem import PorterStemmer as ps # 創建一個stemmer實例 stemmer = ps() # 創建一個包含相同單詞的不同形式的數組 words = ['annoying', 'annoys', 'annoyed', 'annoy'] # 將詞干分析器應用于words數組中的每個單詞,并將它們存儲在一個新數組中 stems = [stemmer.stem(word=word) for word in words] # 以DataFrame的形式打印原始單詞及其詞干 sdf = pd.DataFrame({'raw word': words, 'stem': stems}) print(sdf)
詞形還原是一個類似于詞干提取的過程,它的目的是將一個詞簡化為詞根形式。它的與眾不同之處在于,它不僅僅刪除單詞的末尾以獲取詞根形式,而是遵循一個過程,遵守規則,并且經常使用WordNet進行映射以將單詞返回到其根形式。
# 導入WordNetLemmatizer import nltk import pandas as pd from nltk.stem import WordNetLemmatizer as wnl # 創建一個lemmatizer實例 lemmatizer = wnl() # 創建一個包含相同單詞的不同形式的數組 words = ['troubling', 'troubled', 'troubles', 'trouble'] # 將lemmatizer應用于words數組中的每個單詞,并將它們存儲在新數組中, # 如下所示。words參數提供了lemmatize函數與它應該被詞形還原的單詞。 # pos參數是你想要詞形還原的詞性。“v”代表動詞,因此lemmatizer會將單詞縮減為最接近的動詞形式 lemmatized = [lemmatizer.lemmatize(word=word, pos='v') for word in words] # 以DataFrame的形式打印原始單詞及其根形式 ldf = pd.DataFrame({'raw word': words, 'lemmatized': lemmatized}) ldf = ldf[['raw word', 'lemmatized']] print(ldf)
標記化是將語料庫分解為單個標記的過程。標記是最常用的單詞。因此,此過程將語料庫分解為單個單詞,但也可以包括標點符號和空格等。
這項技術是最重要的技術之一,因為它是我們在下一章中學習的許多自然語言處理應用的先決條件,例如詞性(Parts-of-Speech,PoS)標記。這些算法將標記作為輸入,并且不能使用字符串或文本段落作為輸入。
標記化單詞:
# 從nltk中導入word_tokenize和punkt from nltk import word_tokenize # 將單詞存儲在變量中并對其應用word_tokenize(),然后打印結果 s = "hi! my name is john." tokens = word_tokenize(s) print(tokens)
標記化句子:
# 從nltk中導入sent_tokenize from nltk import sent_tokenize # 在變量中存儲兩個句子(我們上一個練習中的句子實際上是兩個句子, # 所以我們可以用相同的句子來查看單詞和句子標記之間的區別)并在其 # 上應用sent_tokenize(),然后打印結果 s = "hi! my name is shubhangi." tokens = sent_tokenize(s) print(tokens)
有幾種方法可以執行文本預處理,包括使用各種Python庫(如BeautifulSoup)去除HTML標記。
刪除停止詞:
# 導入stopwords from nltk.corpus import stopwords from nltk import word_tokenize # 將句子存儲在變量中 s = "the weather is really hot and i want to go for a swim" # 創建一組英文停止詞 stop_words = set(stopwords.words('english')) # 使用word_tokenize標記句子,然后將那些不出現在stop_words中的標記存儲在數組中。然后,打印該數組 tokens = word_tokenize(s) tokens = [word for word in tokens if not word in stop_words] print(tokens)
3、詞嵌入
自然語言處理為機器學習模型和深度學習模型準備了文本數據。當提供數值數據作為輸入時,模型執行效率最高,因此自然語言處理的關鍵作用是將預處理的文本數據轉換為數值數據,數值數據是文本數據的數字表示。
這就是詞嵌入的含義:它們是文本實值向量形式的數值表示。具有相似含義的詞映射到相似的向量,因此具有相似的表示。這有助于機器學習不同單詞的含義和背景。由于詞嵌入是映射到單個單詞的向量,因此只有在語料庫上執行了標記化后才能生成詞嵌入。
詞嵌入包含多種用于創建學習的數值表示的技術,是表示文檔詞匯的最流行方式。
詞嵌入的主要目的——形成與具有相似含義的單詞相對應的相似向量簇。
3.1、詞嵌入的生成
我們已經理解了什么是詞嵌入及其重要性,現在需要了解它們是如何產生的。將單詞轉換成其實值向量的過程稱為矢量化,是通過詞嵌入技術完成的。
有許多可用的詞嵌入技術,但是在本章中,我們將討論兩個主要的技術——Word2Vec和GloVe。
一旦詞嵌入(矢量)被創建,它們組合形成一個矢量空間,這是一個由遵循矢量加法和標量乘法規則的矢量組成的代數模型。如果你不記得你的線性代數,這可能是一個快速復習的好時機。
1、Word2Vec:是用于從單詞生成向量的詞嵌入技術之一
Word2Vec是一個淺層神經網絡,只有兩層,因此不具備深度學習模型的資格。
Word2Vec的功能: Word2Vec針對與輸入語料庫中的單詞相鄰的單詞訓練單詞,有兩種方法: 連續單詞袋(CBOW):該方法基于上下文預測當前單詞。因此,它將單詞的周圍單詞作為輸入來產生單詞作為輸出,并且它基于這個單詞確實是句子的一部分的概率來選擇這個單詞。 Skip-gram:這種方法通過將單詞作為輸入,理解單詞的意思,并將其分配給上下文來預測單詞周圍的單詞。
(1)使用Word2Vec生成詞嵌入
# 1、從gensim導入Word2Vec模型,并從nltk導入word_tokenize from gensim.models import Word2Vec as wtv from nltk import word_tokenize # 2、將包含一些常用單詞的三個字符串存儲到三個獨立的變量中,然后標記每個句子,并將所有標記存儲在一個數組中 s1 = "Ariana Grande is a singer" s2 = "She has been a singer for many years" s3 = "Ariana is a great singer" sentences = [word_tokenize(s1), word_tokenize(s2), word_tokenize(s3)] # 3、訓練模型 Word2Vec的min_count默認值為5 model = wtv(sentences, min_count=1) # 4、總結模型 print("this is the summary of the model: ") print(model) # 5、通過總結來找出詞匯中有哪些單詞 words = list(model.wv.vocab) print("this is the vocabulary for our corpus: ") print(words) # 6、看看‘singer’這個詞的向量(詞嵌入)是什么 print("the vector for the word singer: ") print(model['singer']) # 7、lookup top 6 similar words to great w1 = ["singer"] # “positive”是指在輸出中只描述正矢量值 similar = model.wv.most_similar(positive=w1, topn=6) print(similar) w1 = ["great"] # “positive”是指在輸出中只描述正矢量值 similar = model.wv.most_similar(positive=w1, topn=6) print(similar)
(2)使用GloVe生成詞嵌入
GloVe:顧名思義,可以查看語料庫中的所有單詞
Word2Vec是一種預測模型,學習向量來提高預測能力,而GloVe是一種基于計數的模型。
# 我們需要一個語料庫來生成詞嵌入,幸運的是,gensim.models.word2vec庫有一個名為Text8Corpus的語料庫。將它與GloVe-Python庫中的兩個模塊一起導入 import itertools from gensim.models.word2vec import Text8Corpus from glove import Corpus, Glove # 使用itertools將語料庫轉換成列表形式的句子 sentences = list(itertools.islice(Text8Corpus('text8'), None)) # 啟動Corpus()模型,并將其應用于句子 corpus = Corpus() corpus.fit(sentences, window=10) # 我們已經準備好了語料庫,需要訓練嵌入。啟動GloVe()模型 glove = Glove(no_components=100, learning_rate=0.05) # 基于語料庫生成共現計數矩陣,并將gloVe模型與該矩陣相匹配 訓練模型 glove.fit(corpus.matrix, epochs=30, no_threads=4, verbose=True) # 模型訓練完成 # 添加語料庫的詞典 glove.add_dictionary(corpus.dictionary) # 根據生成的詞嵌入,使用以下命令查看哪些單詞與你選擇的單詞相似 similar = glove.most_similar('man') print(similar) # 你可以試著用幾個不同的詞來看看哪些詞與它們相鄰,哪些詞與它們最相似 glove.most_similar('queen', number = 10)
舉例:使用Word2Vec從語料庫中生成詞嵌入
# 從gensim模型中導入word2vec from gensim.models import word2vec # 將語料庫存儲在變量中 sentences = word2vec.Text8Corpus('text8') # 在語料庫上匹配word2vec模型 model = word2vec.Word2Vec(sentences, size=200) # 找到與“man”最相似的詞 model.most_similar(['man']) # 父親對應女孩,x對應男孩。找出x的前三個單詞 model.most_similar(['girl', 'father'], ['boy'], topn=3)
機器翻譯 自然語言處理基礎
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。