如何用 Python,寫出 Siri 和 Alexa 的自然語言處理演算法?

【為什麼我們要挑選這篇文章】人類講的語言是自然語言,但電腦使用的是機器語言,而自然語言處理(NLP)則讓電腦理解人類的語言,並做出相對應的回答,它是 Google 搜尋的基本技術,也是 Alexa、Siri 等語音助理背後的關鍵技術。

下文,我們將藉由 Python 程式碼,認識 NLP 的基本功能。(責任編輯:郭家宏)

自然語言處理(NLP)是電腦科學和人工智慧範疇內的一門學科。

NLP 是人與機器之間的溝通,使得機器既可以解釋我們的語言,也可以就此作出有效回答。自 20 世紀 50 年代以來,這個領域一直存在,你可能聽說過 Alan Turing 開創的「圖靈測試」。圖靈測試測量電腦對人類所提出問題做出反應的好壞程度。

如果第三方的人不能分辨出人和該電腦之間的區別,那麼該電腦系統就是智慧的。20 世紀 50 年代以來,人類為此努力了很多年,如今終於在數據科學和語言學領域取得了許多進展。

本文將詳細介紹自然語言處理領域的一些演算法的基本功能,包含一些 Python 程式碼範例。

標記化:將文本解構成基本單字

開始自然語言處理之前,我們看幾個非常簡單的文本解析。標記化是將文本流(如一句話)分解為構成它的最基本的單字的過程。例如,下面一句話:「紅狐狸跳過月球」有 7 個單字。

使用 python 標記句子:

myText =’The red fox jumps over the moon.’
myLowerText = myText.lower()
myTextList = myLowerText.split()
print(myTextList)
OUTPUT:
[‘the’,’red’,’fox’,’jumps’,’over’,’the’,’moon’]

詞性歸類:推斷單字的涵義

詞性用於確定句法功能。英語中的主要詞性有:形容詞、代名詞、名詞、動詞、副詞、介系詞、連接詞和感嘆詞。這用於根據其用法推斷單字的含義。例如,permit 可以是名詞和動詞。作為動詞:「I permit you to go to dance.」作名詞:「Did you get the permit from the country.」

使用 Python 判斷詞性:(使用 NLTK 庫)

你必須安裝 NLTK,這是一個用於自然語言處理的 Python 庫。
關於 NLTK 的 說明

import nltkmyText = nltk.word_tokenize(’the red fox jumps over the moon.’)print(’Parts of Speech:’,nltk.pos_tag(myText))OUTPUT:Parts of Speech:[(’the’,’DT’),(’red’,’JJ’),(’fox’,’NN’),(’jumps’,’NNS’),(’over’,’IN’),(’the’,’DT’),(’moon’,’NN’),(’.’,’.’)]

你能看出 NLTK 是如何將句子分解為單個單字並說明其詞性,如(’fox’、’NN’):NN noun, sigular ‘fox’

冠詞刪除:刪除意義不大的單字

許多句子和段落都包含一些幾乎無實際意義的單字,包括 a、and、an 和 the。冠詞過濾是指從句子或單字流中刪除這些單字。

使用 Python 和 NLTK 實現冠詞過濾:

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

example_sent =“a red fox is an animal that is able to jump over the moon.”
stop_words = set(stopwords.words(‘english’))
word_tokens = word_tokenize(example_sent)
filtered_sentence = [w for w in word_tokens if not w in stop_words]
filtered_sentence = [] for w in word_tokens: if w not in stop_words:filtered_sentence.append(w)print(filtered_sentence)
OUTPUT:
[‘red’,’fox’,’animal’,’able’,’jump’,’moon’,’.’]

詞幹提取:將單字簡化到基本含意

詞幹化是減少單字雜訊的過程,也被稱為詞典歸一化。它減少了單字的變化。例如,單字 fishing 的詞幹為 fish。

詞幹化用於將單字簡化到其基本含義。另一個很好的例子是「喜歡」這個詞,它是許多單字的詞幹,如:likes、liked 和 likely。

搜尋引擎也是使用詞幹的。在許多情況下,用這種方法來搜索其中一個單字以返回包含該集合中另一個單字的文檔可能是非常有用的。

需要使用 Python 和 NLTK 庫實現詞幹化:

from nltk.stem import PorterStemmer
From nltk.tokenize import word_tokenize

ps = PorterStemmer()
words = [“likes”,“possible”,“likes”,“liking”]

for w in words:
print(w,“:”,ps.stem(w))

OUTPUT:
(‘likes’, ‘:’, u’like’)
(‘likely’, ‘:’, u’like’)
(‘likes’, ‘:’, u’like’)
(‘liking’, ‘:’, u’like’)

詞形還原:可找到字根,並了解單字詞性

詞幹化和詞形歸併非常相似,它們都使你能夠找到字根。這被稱為單字字歸一化,兩者可以生成相同的輸出。但是,它們的工作原理非常不同。詞幹試圖切分單字,而詞形歸併讓你能夠看清單字是名詞,動詞還是其他詞性。

例如單字 saw,詞幹化返回 saw,詞形歸併返回 see 和 saw。詞形歸併通常會返回一個可讀的單字,而詞幹化可能不會。可以看下面的一個範例以了解差異。

from nltk.stem import PorterStemmer
From nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()
ps = PorterStemmer()
words = [“corpora”,“constructing”,“better”,“done”,“worst”,“pony”]

for w in words:
print(w,“STEMMING:”,ps.stem(w),“LEMMATIZATION”,lemmatizer.lemmatize(w,pos = ‘v’))

OUTPUT:
corpora STEMMING:corpora LEMMATIZATION corpora
constructing STEMMING:construct LEMMATIZATION constructing
better STEMMING:better LEMMATIZATION good
done STEMMING:done LEMMATIZATION done
worst STEMMING:worst LEMMATIZATION bad
pony STEMMING:poni LEMMATIZATION pony

以上,是 Google、Alexa 分析語意的最基本演算法

語言學是對語言、形態、句法、語音和語義的研究。包括數據科學和計算在內的這三個領域在過去 60 年中已經興起爆發。我們剛剛只是探索了在 NLP 中一些非常簡單的文本分析。Google、Bing 和其他搜尋引擎利用此技術幫助你在世界範圍網路中尋找訊息。

想想讓 Alexa 播放你最喜歡的歌曲是多麼容易,或者 Siri 如何幫助你確定方向。這完全是因為 NLP。電腦系統中的自然語言不是噱頭或玩具,而是我們生活中無縫對接電腦系統的未來。

Arcadia Data 剛剛發佈了 5.0 版,其中包括我們稱之為 Search Based BI 的自然語言查詢功能。它使用了上面描述的一些數據科學和文本分析功能。

用我們的 Search Based BI 工具查看 此影片
原文 報導

(本文經 大數據文摘 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈 自然语言处理背后的数据科学 〉 。首圖來源:Pxhere CC Licensed)

更多程式語言的技巧

【內附程式碼】工程師技能大全:如何用 Python 寫出所有的演算法?
寫程式不再崩潰!介紹 5 個 Google 工程師都在用的好習慣
機器學習成效開到最大!介紹 4 個超好用的 Shell 程式技巧


我們正在找夥伴!

2019 年我們的團隊正在大舉擴張,需要你的加入跟我們一起找出台灣創新原動力! 我們正在徵 《採訪社群編輯》、《助理編輯》,詳細職缺與應徵辦法 請點我

點關鍵字看更多相關文章: