教程 | 理解和实现自然语言处理终极指南(附Python代码)
教程 | 理解和實(shí)現(xiàn)自然語言處理終極指南(附Python代碼)
機(jī)器之心 原文? http://www.jiqizhixin.com/article/2294 主題 自然語言處理 Python根據(jù)行情,只有21%的數(shù)據(jù)目前是結(jié)構(gòu)化的。談話、發(fā)推文、在 WhatsApp上發(fā)信息以及其他各種各樣的活動,都在持續(xù)不斷的產(chǎn)生數(shù)據(jù)。而大多數(shù)這種數(shù)據(jù)都是以非結(jié)構(gòu)化的文本形式存在的。
最著名的例子有:社交媒體上的推文/帖子、用戶到用戶的聊天記錄、新聞、博客、文章、產(chǎn)品或服務(wù)測評和醫(yī)療行業(yè)的病人記錄。最近的例子有聊天機(jī)器人和其他聲音驅(qū)動的機(jī)器人。
盡管我們有高維數(shù)據(jù),但目前其中的信息并不能直接獲得——除非被人工處理過或被一個(gè)自動化系統(tǒng)分析過。
為了從文本數(shù)據(jù)中產(chǎn)生具有重要意義和可實(shí)踐的領(lǐng)悟,就需要了解自然語言處理的技巧和原理 。
所以,如果你今年打算打造一個(gè)聊天機(jī)器人,或者你想運(yùn)用非結(jié)構(gòu)化的文本數(shù)據(jù)的力量,那么你算看對了文章,這篇指南揭示了自然語言處理的概念以及它的技巧和實(shí)現(xiàn)方法。文章的主要目的是教導(dǎo)自然語言處理的概念以及讓你了解把它運(yùn)用到實(shí)際數(shù)據(jù)集上。
目錄
1.自然語言處理簡介
2.文本處理
-
移除噪聲
-
詞匯規(guī)范化
-
詞形還原
-
詞干提取
-
-
對象標(biāo)準(zhǔn)化
3.文本到特征(文本數(shù)據(jù)上的特征工程)
-
句法分析
-
從屬關(guān)系語法
-
詞性標(biāo)注
-
-
實(shí)體分析
-
短語檢測
-
命名實(shí)體分析
-
主題建模
-
N-grams
-
-
統(tǒng)計(jì)特征
-
TF – IDF算法
-
頻率/密度特征
-
可讀特征
-
-
詞匯嵌入
4.自然語言處理面臨的重要任務(wù)
-
文本分類
-
文本匹配
-
萊文斯坦距離
-
語音匹配
-
柔性字符串匹配
-
-
指代消解
-
其他問題
5.重要的自然語言處理庫
1.自然語言處理簡介
自然語言處理是數(shù)據(jù)科學(xué)中以智能高效的方式對文本進(jìn)行系統(tǒng)的分析、理解和信息提取的一個(gè)分支。通過利用自然語言處理及其成分,一個(gè)人能夠組織起巨大數(shù)量的文本數(shù)據(jù)來執(zhí)行許多自動化任務(wù)和解決例如自動摘要、機(jī)器翻譯、命名實(shí)體識別、關(guān)系提取、情感分析、語音識別和主題分割等等非常廣泛的問題。
開始之前,先解釋一下這篇文章中用到的術(shù)語:
-
標(biāo)記化(tokenization):文本轉(zhuǎn)換為標(biāo)記的過程
-
標(biāo)記(token):文本中出現(xiàn)的詞匯或?qū)嶓w
-
文本對象(text object):句子/短語/詞匯/文章
安裝NTLK及其數(shù)據(jù)的步驟:
安裝Pip:在終端運(yùn)行:
sudo easy_install pip安裝NTLK:在終端運(yùn)行
sudo?pip?install?-U?nltk
下載NTLK數(shù)據(jù):終端python shell下輸入如下代碼:
```?import?nltk?nltk.download()```
遵循屏幕上的指令下載所需包或集。其他庫可直接使用pip安裝。
2.文本處理
現(xiàn)有數(shù)據(jù)中,文本是最非結(jié)構(gòu)化的形式,里面有各種各樣的噪聲;如果沒有預(yù)處理,文本數(shù)據(jù)都不能分析。清理和標(biāo)準(zhǔn)化文本的整個(gè)過程叫做文本預(yù)處理(text preprocessing),其作用是使文本數(shù)據(jù)沒有噪聲并且可以分析。
主要包括三個(gè)步驟:
-
移除噪聲
-
詞匯規(guī)范化
-
對象標(biāo)準(zhǔn)化
下圖展示了文本預(yù)處理流程的結(jié)構(gòu)。
2.1移除噪聲
任何與數(shù)據(jù)上下文和最終輸出無關(guān)的文本都可被判作噪聲。
例如,語言停止詞(stopword,語言中常用的詞匯:系動詞is,am,定冠詞the,介詞of,in)、URL 或鏈接、社交媒體實(shí)體(提及、標(biāo)簽)、標(biāo)點(diǎn)符號和特定行業(yè)詞匯。這一步移除了文本中所有類型的噪聲。
移除噪聲通用的做法是準(zhǔn)備一個(gè)噪聲實(shí)體的詞典,在文本對象上逐個(gè) token(或逐詞)迭代,消除在噪聲詞典中出現(xiàn)的標(biāo)簽。
以下是實(shí)現(xiàn)這一步的 Python 代碼:
```
#?Sample?code?to?remove?noisy?words?from?a?text
noise_list?=?["is",?"a",?"this",?"..."]?
def?_remove_noise(input_text):
words?=?input_text.split()?
noise_free_words?=?[word?for?word?in?words?if?word?not?in?noise_list]?
noise_free_text?=?"?".join(noise_free_words)?
return?noise_free_text
_remove_noise("this?is?a?sample?text")
>>>?"sample?text"
```
另外一種方法是使用正則表達(dá)式,盡管其只能解決特定模式的噪聲。我們在之前的文章中詳細(xì)介紹了正則表達(dá)式:https://www.analyticsvidhya.com/blog/2015/06/regular-expression-python/
以下是從輸入文本中移除正則表達(dá)式的 Python 代碼:
```
#?Sample?code?to?remove?a?regex?pattern?
import?re?
def?_remove_regex(input_text,?regex_pattern):
urls?=?re.finditer(regex_pattern,?input_text)?
for?i?in?urls:?
input_text?=?re.sub(i.group().strip(),?'',?input_text)
return?input_text
regex_pattern?=?"#[A-Za-z0-9\w]*"
_remove_regex("remove?this?#hashtag?from?analytics?vidhya",?regex_pattern)
>>>?"remove?this??from?analytics?vidhya"
```
2.2詞匯規(guī)范化
另外一種文本形式的噪聲是由一個(gè)詞匯所產(chǎn)生的多種表示形式。
例如,“play”,“player”,“played”,“plays”和“playing”,這些詞匯都是由“play”變化而來的。雖然它們意義不一,但根據(jù)上下文都是相似的。詞匯規(guī)范化這一步把一個(gè)詞的不同展現(xiàn)形式轉(zhuǎn)化為了他們規(guī)范化的形式(也叫做引理(lemma))。規(guī)范化是文本上的特征工程起中樞作用的一步,因?yàn)樗迅呔S特征(N個(gè)不同的特征)轉(zhuǎn)化為了對任何機(jī)器學(xué)習(xí)模型都很理想的低維空間(1個(gè)特征)。
最常見的詞匯規(guī)范化是:
-
詞干提取:詞干提取是詞匯后綴(“ing”,“l(fā)y”,“es”,“s”等)去除過程的一個(gè)基本規(guī)則。
-
詞形還原:詞形還原與詞干提取相反,是有組織地逐步獲取詞匯根形式的步驟,它使用到了詞匯(詞匯字典序)和形態(tài)分析(詞的結(jié)構(gòu)和語法關(guān)系)。
下面是實(shí)現(xiàn)詞形還原和詞干提取的代碼,使用了一個(gè)流行的 Python 庫 NLTK:
```
from?nltk.stem.wordnet?import?WordNetLemmatizer?
lem?=?WordNetLemmatizer()
from?nltk.stem.porter?import?PorterStemmer?
stem?=?PorterStemmer()
word?=?"multiplying"?
lem.lemmatize(word,?"v")
>>?"multiply"?
stem.stem(word)
>>?"multipli"
```
2.3對象標(biāo)準(zhǔn)化
文本數(shù)據(jù)經(jīng)常包含不在任何標(biāo)準(zhǔn)詞典里出現(xiàn)的詞匯或短語。搜索引擎和模型都識別不了這些。
比如,首字母縮略詞、詞匯附加標(biāo)簽和通俗俚語。通過正則表達(dá)式和人工準(zhǔn)備的數(shù)據(jù)詞典,這種類型的噪聲可以被修復(fù)。以下代碼使用了詞典查找方法來替代文本中的社交俚語。
```?
lookup_dict?=?{'rt':'Retweet',?'dm':'direct?message',?"awsm"?:?"awesome",?"luv"?:"love",?"..."}
def?_lookup_words(input_text):
words?=?input_text.split()?
new_words?=?[]?
for?word?in?words:
if?word.lower()?in?lookup_dict:
word?=?lookup_dict[word.lower()]
new_words.append(word)?new_text?=?"?".join(new_words)?
return?new_text
_lookup_words("RT?this?is?a?retweeted?tweet?by?Shivam?Bansal")
>>?"Retweet?this?is?a?retweeted?tweet?by?Shivam?Bansal"
```
除了目前為止討論過的三個(gè)步驟,其他類型的文本預(yù)處理有編碼-解碼噪聲,語法檢查器和拼寫改正等。我之前的一篇文章給出了預(yù)處理及其方法的細(xì)節(jié)。
3.文本到特征(文本數(shù)據(jù)上的特征工程)
為了分析已經(jīng)預(yù)處理過的數(shù)據(jù),需要將數(shù)據(jù)轉(zhuǎn)化成特征(feature)。取決于用途,文本特征可通過句法分析、實(shí)體/N元模型/基于詞匯的特征、統(tǒng)計(jì)特征和詞匯嵌入等方法來構(gòu)建。下面來詳細(xì)理解這些技巧。
3.1句法分析
句法分析涉及到對句中詞的語法分析和位置與詞匯的關(guān)系的分析。依存語法(Dependency Grammar)和詞性標(biāo)注(Part of Speech tags)是重要的文本句法屬性。
依賴樹(Dependency Trees)——由一些詞匯共同組成的句子。句中詞與詞之間的聯(lián)系是由基本的依存語法決定的。從屬關(guān)系語法是一類解決(已標(biāo)簽)兩個(gè)詞匯項(xiàng)(字詞)間二元不對稱關(guān)系的句法文本分析。每一種關(guān)系都可用三元組(關(guān)系、支配成分、從屬成分)來表示。例如:考慮下面這個(gè)句子:“Bills on ports and immigration were submitted by Senator Brownback, Republican of Kansas.”詞匯間的關(guān)系可由如下所示的樹的形式觀察得到
觀察樹的形狀可得:“submitted”是該句的根詞(root word),由兩顆子樹所連接(主語和賓語子樹)。每一顆子樹本身又是一顆依存關(guān)系樹(dependency tree ),其中的關(guān)系比如有 - (“Bills” <-> “ports” <by> “proposition” 關(guān)系),(“ports” <-> “immigration” <by> “conjugation” 關(guān)系)
這種類型的樹,當(dāng)從上至下迭代分析時(shí)可以得到語法關(guān)系三元組。對于很多自然語言處理問題,比如實(shí)體性情感分析,執(zhí)行者(actor)與實(shí)體識別和文本分類等,語法關(guān)系三元組都可以用作特征。Python wrapper 的StanfordCoreNLP( http://stanfordnlp.github.io/CoreNLP/ 來自斯坦福自然語言處理組,只允許商業(yè)許可證)和NTLK從屬關(guān)系語法可以用來生成依賴樹。
詞性標(biāo)注(PoS/Part of speech tagging)——除了語法關(guān)系外,句中每個(gè)詞都與詞性(名詞、動詞、形容詞、副詞等等)聯(lián)系起來。詞性標(biāo)注標(biāo)簽決定了句中該詞的用法和作用。這里有賓夕法尼亞大學(xué)定義的所有可能的詞性標(biāo)簽表。以下代碼使用了NTLK包對輸入文本執(zhí)行詞性標(biāo)簽注釋。(NTLK提供了不同的實(shí)現(xiàn)方式,默認(rèn)是感知器標(biāo)簽)
```
from?nltk?import?word_tokenize,?pos_tag
text?=?"I?am?learning?Natural?Language?Processing?on?Analytics?Vidhya"
tokens?=?word_tokenize(text)
print?pos_tag(tokens)
>>>?[('I',?'PRP'),?('am',?'VBP'),?('learning',?'VBG'),?('Natural',?'NNP'),('Language',?'NNP'),
('Processing',?'NNP'),?('on',?'IN'),?('Analytics',?'NNP'),
詞性標(biāo)注被用在許多重要的自然語言處理目的上:
A. 詞義消歧:一些詞匯根據(jù)用法有很多種意思。例如,下面的兩個(gè)句子:
-
I.“Please book my flight for Delhi”
-
II. “I am going to read this book in the flight”
“Book”在不同的上下文中出現(xiàn),然而這兩種情況的詞性標(biāo)簽卻不一樣。在第一句中,“book”被用作動詞,而在第二句中,它被用作名詞。(Lesk算法也可被用于相同的目的)
B. 提高基于詞匯的特征:當(dāng)詞匯作為特征時(shí),一個(gè)學(xué)習(xí)模型可以學(xué)習(xí)到不同的詞匯上下文,然而特征與詞性連接起來,上下文就被保留了,因此得到了很強(qiáng)的特征。例如:
-
句 - “book my flight, I will read this book”
-
標(biāo)簽 – (“book”, 2), (“my”, 1), (“flight”, 1), (“I”, 1), (“will”, 1), (“read”, 1), (“this”, 1)帶有POS的標(biāo)簽 – (“book_VB”, 1), (“my_PRP$”, 1), (“flight_NN”, 1), (“I_PRP”, 1), (“will_MD”, 1), (“read_VB”, 1), (“this_DT”, 1), (“book_NN”, 1)
C. 規(guī)范化和詞形歸并(Lemmatizatio):詞性標(biāo)簽是將詞轉(zhuǎn)化為其基本形式(引理)的基礎(chǔ)
D. 高效移除停止詞:詞性標(biāo)簽在移除停止詞方面也非常有用。
例如,有一些標(biāo)簽總是定義低頻/較低重要性的詞匯。
例如:(IN – “within”, “upon”, “except”), (CD – “one”,”two”, “hundred”), (MD – “may”, “must” 等)
3.2 實(shí)體提取(實(shí)體作為特征)
實(shí)體(entity)被定義為句中最重要的部分——名詞短語、動詞短語或兩者都有。實(shí)體檢測算法通常是由基于規(guī)則的解析、詞典查詢、詞性標(biāo)簽和依存分析組合起來的模型。實(shí)體檢測的適用性很廣泛,在自動聊天機(jī)器人、內(nèi)容分析器和消費(fèi)者見解中都有應(yīng)用。
主題建模和命名實(shí)體識別是自然語言處理領(lǐng)域中兩種關(guān)鍵的實(shí)體檢測方法。
A. 命名實(shí)體識別(NER/Named Entity Recognition)
從文本中檢測命名實(shí)體比如人名、位置、公司名稱等的過程叫做命名實(shí)體識別(NER)。例如:
句 - Sergey Brin, the manager of Google Inc. is walking in the streets of New York.命名實(shí)體 - ( “人” : “Sergey Brin” ), (“公司名” : “Google Inc.”), (“位置” : “New York”)典型NER模型包含三個(gè)模塊:
-
名詞短語識別:使用從屬關(guān)系分析和詞性分析將所有名詞性短語從文本中提取出來。
-
短語分類:將提取出的名詞短語分類到各自的目錄(位置,名稱等)中。谷歌地圖API提供了通往消除歧義位置的很好路徑。然后,dbpedia,維基百科的開源數(shù)據(jù)庫可以用來識別人名或公司名。除了這個(gè),我們能通過結(jié)合不同來源的信息精確的查找表和詞典。
-
實(shí)體消歧:有些時(shí)候?qū)嶓w可能會誤分類,因此在結(jié)果層上建一層交叉驗(yàn)證層非常有用。知識圖譜就可以用來使用。目前流行的知識圖譜有:谷歌知識圖譜、IBM Watson 和維基百科。
B.主題建模
主題建模是自動識別文本集中主題的過程,它以無監(jiān)督的方式從語料庫中的詞匯里提取隱藏的模式。主題(topic)被定義為“文本集中共同出現(xiàn)術(shù)語的重復(fù)模式”。一個(gè)好的主題模型能對“健康”、“醫(yī)生”、“病人”、“醫(yī)院”建模為“健康保健”,“農(nóng)場”、“作物”、“小麥”建模為“耕作”。
隱含狄利克雷分布(LDA)是最流行的主題建模技術(shù),以下是在Python環(huán)境下使用LDA技術(shù)實(shí)現(xiàn)主題建模的代碼。若想查看更詳細(xì)的細(xì)節(jié),請參看:https://www.analyticsvidhya.com/blog/2016/08/beginners-guide-to-topic-modeling-in-python/
```
doc1?=?"Sugar?is?bad?to?consume.?My?sister?likes?to?have?sugar,?but?not?my?father."?
doc2?=?"My?father?spends?a?lot?of?time?driving?my?sister?around?to?dance?practice."
doc3?=?"Doctors?suggest?that?driving?may?cause?increased?stress?and?blood?pressure."
doc_complete?=?[doc1,?doc2,?doc3]
doc_clean?=?[doc.split()?for?doc?in?doc_complete]
import?gensim?from?gensim
import?corpora
#?Creating?the?term?dictionary?of?our?corpus,?where?every?unique?term?is?assigned?an?index.??
dictionary?=?corpora.Dictionary(doc_clean)
#?Converting?list?of?documents?(corpus)?into?Document?Term?Matrix?using?dictionary?prepared?above.?
doc_term_matrix?=?[dictionary.doc2bow(doc)?for?doc?in?doc_clean]
#?Creating?the?object?for?LDA?model?using?gensim?library
Lda?=?gensim.models.ldamodel.LdaModel
#?Running?and?Training?LDA?model?on?the?document?term?matrix
ldamodel?=?Lda(doc_term_matrix,?num_topics=3,?id2word?=?dictionary,?passes=50)
#?Results?
print(ldamodel.print_topics())
```
C.N-Grams 特征
N-Grams是指N個(gè)詞匯的結(jié)合體。N-Grams(N>1)作為特征與詞匯(Unigrams)作為特征相比,通常會更加富含信息。同時(shí),bigrams(N=2)被認(rèn)為是最重要的特征。以下代碼生成了文本的 bigrams。
```?
def?generate_ngrams(text,?n):
words?=?text.split()
output?=?[]??
for?i?in?range(len(words)-n+1):
output.append(words[i:i+n])
return?output
>>>?generate_ngrams('this?is?a?sample?text',?2)
#?[['this',?'is'],?['is',?'a'],?['a',?'sample'],?,?['sample',?'text']]?
```
3.3 統(tǒng)計(jì)特征
文本數(shù)據(jù)使用該節(jié)所講的幾種技術(shù)可直接量化成數(shù)字。
A. 術(shù)語頻率 - 逆文獻(xiàn)頻率(TF – IDF)
TF-IDF 是經(jīng)常被使用在信息檢索問題上的權(quán)重模型。TF-IDF在不考慮文獻(xiàn)中詞的具體位置情況下,基于文獻(xiàn)中出現(xiàn)的詞匯將文本文獻(xiàn)轉(zhuǎn)化成向量模型。例如,假設(shè)有一個(gè)N 個(gè)文本文獻(xiàn)的數(shù)據(jù)集,在任何一個(gè)文獻(xiàn)“D”中,TF和IDF會被定義為 - 術(shù)語頻率(TF) - 術(shù)語“t”的術(shù)語頻率被定義為“t”在文獻(xiàn)“D”中的數(shù)量。
逆文獻(xiàn)頻率(IDF)- 術(shù)語的逆文獻(xiàn)頻率被定義為文本集中可用文獻(xiàn)的數(shù)量與包含術(shù)語“t”的文獻(xiàn)的數(shù)量的比例的對數(shù)。
TF-IDF公式給出了文本集中術(shù)語的相對重要性,以下為TF-IDF公式和使用Python的scikit學(xué)習(xí)包將文本轉(zhuǎn)換為tf-idf向量。
```
from?sklearn.feature_extraction.text?import?TfidfVectorizer
obj?=?TfidfVectorizer()
corpus?=?['This?is?sample?document.',?'another?random?document.',?'third?sample?document?text']
X?=?obj.fit_transform(corpus)
print?X
>>>
(0,?1)?0.345205016865
(0,?4)?...?0.444514311537
(2,?1)?0.345205016865
(2,?4)?0.444514311537
```
模型創(chuàng)建了一個(gè)詞典并給每一個(gè)詞匯賦了一個(gè)索引。輸出的每一行包含了一個(gè)元組(i,j)和在第i篇文獻(xiàn)索引j處詞匯的tf-idf值。
B. 數(shù)量/密度/可讀性特征
基于數(shù)量或密度的特征同樣也能被用于模型和分析中。這些特征可能看起來比較繁瑣但是對學(xué)習(xí)模型有非常大的影響。一些特征有:詞數(shù)、句數(shù)、標(biāo)點(diǎn)符號數(shù)和特定行業(yè)詞匯的數(shù)量。其他類型的測量還包括可讀性測量(比如音節(jié)數(shù)量、smog index 和易讀性指數(shù))。參考 Textstat 庫創(chuàng)建這樣的特征:https://github.com/shivam5992/textstat
3.4詞嵌入(文本向量)
詞嵌入是將詞表示為向量的方法,在盡量保存文本相似性的基礎(chǔ)上將高維的詞特征向量映射為低維特征向量。詞嵌入廣泛用于深度學(xué)習(xí)領(lǐng)域,例如卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)。Word2Vec和GloVe是目前非常流行的兩種做詞嵌入的開源工具包,都是將文本轉(zhuǎn)化為對應(yīng)的向量。
-
Word2Vec: https://code.google.com/archive/p/word2vec/
-
GloVe: http://nlp.stanford.edu/projects/glove/
Word2Vec是由預(yù)處理模塊和兩個(gè)淺層神經(jīng)網(wǎng)絡(luò)(CBOW/Continuous Bag of Words和Skip-gram)組成,這些模型廣泛用于自然語言處理問題。Word2Vec首先從訓(xùn)練語料庫中組織詞匯,然后將詞匯做詞嵌入,得到對應(yīng)的文本向量。下面的代碼是利用gensim包實(shí)現(xiàn)詞嵌入表示。
```
from?gensim.models?import?Word2Vec
sentences?=?[['data',?'science'],?['vidhya',?'science',?'data',?'analytics'],['machine',?'learning'],?['deep',?'learning']]
#?train?the?model?on?your?corpus??
model?=?Word2Vec(sentences,?min_count?=?1)
print?model.similarity('data',?'science')
>>>?0.11222489293
print?model['learning']??
>>>?array([?0.00459356??0.00303564?-0.00467622??0.00209638,?...])
```
這些向量作為機(jī)器學(xué)習(xí)的特征向量,然后利用余弦相似性、單詞聚類、文本分類等方法來衡量文本的相似性。
4.自然語言處理(NLP)的重要任務(wù)
本節(jié)討論NLP的不同案例和問題。
4.1文本分類
文本分類是NLP的經(jīng)典問題之一。例如垃圾郵件識別、新聞主題分類、搜索引擎的網(wǎng)頁組織和情感分類。
通俗來講,文本分類就是系統(tǒng)地將文本對象(文件和句子)按照一定的分類體系或標(biāo)準(zhǔn)進(jìn)行自動分類標(biāo)記。尤其是當(dāng)數(shù)據(jù)量太大時(shí),文本分類對于組織、信息過濾、儲存非常有幫助。典型的自然語言分類包括兩部分:a)訓(xùn)練(b)預(yù)測。首先,文本輸入是創(chuàng)建特征過程,機(jī)器學(xué)習(xí)從這些特征中學(xué)習(xí),然后對新文本進(jìn)行預(yù)測。
下面的代碼利用了Python的TextBlob文本處理庫中的樸素貝葉斯模型。
```
from?textblob.classifiers?import?NaiveBayesClassifier?as?NBC
from?textblob?import?TextBlob
training_corpus?=?[
('I?am?exhausted?of?this?work.',?'Class_B'),
("I?can't?cooperate?with?this",?'Class_B'),
('He?is?my?badest?enemy!',?'Class_B'),
('My?management?is?poor.',?'Class_B'),
('I?love?this?burger.',?'Class_A'),
('This?is?an?brilliant?place!',?'Class_A'),
('I?feel?very?good?about?these?dates.',?'Class_A'),
('This?is?my?best?work.',?'Class_A'),
("What?an?awesome?view",?'Class_A'),
('I?do?not?like?this?dish',?'Class_B')]
test_corpus?=?[
("I?am?not?feeling?well?today.",?'Class_B'),?
("I?feel?brilliant!",?'Class_A'),?
('Gary?is?a?friend?of?mine.',?'Class_A'),?
("I?can't?believe?I'm?doing?this.",?'Class_B'),?
('The?date?was?good.',?'Class_A'),?('I?do?not?enjoy?my?job',?'Class_B')]
model?=?NBC(training_corpus)?
print(model.classify("Their?codes?are?amazing."))
>>>?"Class_A"?
print(model.classify("I?don't?like?their?computer."))
>>>?"Class_B"
print(model.accuracy(test_corpus))
>>>?0.83?
```
Scikit.Learn為文本分類提供了另一種途徑:
```?
from?sklearn.feature_extraction.text
import?TfidfVectorizer?from?sklearn.metrics
import?classification_report
from?sklearn?import?svm?
#?preparing?data?for?SVM?model?(using?the?same?training_corpus,?test_corpus?from?naive?bayes?example)
train_data?=?[]
train_labels?=?[]
for?row?in?training_corpus:
train_data.append(row[0])
train_labels.append(row[1])
test_data?=?[]?
test_labels?=?[]?
for?row?in?test_corpus:
test_data.append(row[0])?
test_labels.append(row[1])
#?Create?feature?vectors?
vectorizer?=?TfidfVectorizer(min_df=4,?max_df=0.9)
#?Train?the?feature?vectors
train_vectors?=?vectorizer.fit_transform(train_data)
#?Apply?model?on?test?data?
test_vectors?=?vectorizer.transform(test_data)
#?Perform?classification?with?SVM,?kernel=linear?
model?=?svm.SVC(kernel='linear')?
model.fit(train_vectors,?train_labels)?
prediction?=?model.predict(test_vectors)
>>>?['Class_A'?'Class_A'?'Class_B'?'Class_B'?'Class_A'?'Class_A']
print?(classification_report(test_labels,?prediction))
```
文本分類的效果在很大程度上依賴于特征的選擇,在機(jī)器學(xué)習(xí)中,使用越來越多的訓(xùn)練數(shù)據(jù)總是一個(gè)好的選擇。
4.2 文本匹配/相似性
NLP的一個(gè)重要應(yīng)用是對文本對象進(jìn)行匹配以找到相似性。文本匹配的重要應(yīng)用包括自動拼寫校正、刪除重復(fù)數(shù)據(jù)和基因組分析等。目前有許多文本分類方法,本節(jié)對一些重要的分類方法進(jìn)行詳細(xì)介紹。
A. Levenshtein距離 —— 兩個(gè)字符串之間的Levenshtein距離被定義為將一個(gè)字符串轉(zhuǎn)換為另一個(gè)字符串所需的最小編輯次數(shù),允許的編輯操作包括單個(gè)字符的插入、刪除或替換。以下代碼是高效內(nèi)存計(jì)算的具體實(shí)現(xiàn)。
```?
def?levenshtein(s1,s2):?
if?len(s1)?>?len(s2):
s1,s2?=?s2,s1?
distances?=?range(len(s1)?+?1)?
for?index2,char2?in?enumerate(s2):
newDistances?=?[index2+1]
for?index1,char1?in?enumerate(s1):
if?char1?==?char2:
newDistances.append(distances[index1])?
else:
newDistances.append(1?+?min((distances[index1],?distances[index1+1],?newDistances[-1])))?
distances?=?newDistances?
return?distances[-1]
print(levenshtein("analyze","analyse"))
```
B.音素匹配 ——音素匹配算法以關(guān)鍵詞作為輸入(人的姓名、位置名稱等),然后產(chǎn)生一個(gè)字符串來標(biāo)識一組音素相似的單詞。音素匹配對于搜索大文本語料庫、更正拼寫錯誤和匹配相關(guān)名稱非常有用。 Soundex和Metaphone是目前兩種主要音素匹配算法。 Python的Fuzzy模塊用來計(jì)算不同單詞的soundex字符串,例如:
```?
import?fuzzy?
soundex?=?fuzzy.Soundex(4)?
print?soundex('ankit')
>>>?“A523”
print?soundex('aunkit')
>>>?“A523”?
```
C.靈活的字符串匹配 —— 一個(gè)完整的文本匹配系統(tǒng)包括不同的算法,這些算法計(jì)算各種文本差異。正則表達(dá)式對字符串匹配非常有幫助。另一些常見的字符串匹配技術(shù)有精確串匹配,lemmatized匹配和緊湊匹配(考慮空格、標(biāo)點(diǎn)符號、俚語等)。
D.余弦相似性 —— 當(dāng)文本以向量表示時(shí),也可以應(yīng)用余弦相似性來表征矢量的相似性。下面的代碼將文本轉(zhuǎn)換為向量(使用術(shù)語頻率),并應(yīng)用余弦相似性來衡量文本之間的相近性。
```?
import?math
from?collections?import?Counter
def?get_cosine(vec1,?vec2):
common?=?set(vec1.keys())?&?set(vec2.keys())
numerator?=?sum([vec1[x]?*?vec2[x]?for?x?in?common])
sum1?=?sum([vec1[x]**2?for?x?in?vec1.keys()])?
sum2?=?sum([vec2[x]**2?for?x?in?vec2.keys()])?
denominator?=?math.sqrt(sum1)?*?math.sqrt(sum2)
if?not?denominator:
return?0.0?
else:
return?float(numerator)?/?denominator
def?text_to_vector(text):?
words?=?text.split()?
return?Counter(words)
text1?=?'This?is?an?article?on?analytics?vidhya'?
text2?=?'article?on?analytics?vidhya?is?about?natural?language?processing'
vector1?=?text_to_vector(text1)?
vector2?=?text_to_vector(text2)?
cosine?=?get_cosine(vector1,?vector2)
>>>?0.62?
```
4.3指代消解
指代消解是指找出句子中相對應(yīng)的詞或短語。考慮如下例子“Donald went to John’s office to see the new table. He looked at it for an hour.”,人類很容易識別出“He”表示的是Donald而不是John’s office,“it”是指new table而不是John’s office。指代消解是自然語言處理的重要內(nèi)容,它被用于自動摘要、問答系統(tǒng)和信息采集等方面。 Stanford CoreNLP提供了一個(gè)商用Python wrapper:
https://github.com/Wordseer/stanford-corenlp-python
4.4其它NLP問題/任務(wù)
-
自動摘要 ——給定文章或段落,系統(tǒng)按一定順序生成最重要和最相關(guān)的句子。
-
機(jī)器翻譯 ——通過處理語法、語義和現(xiàn)實(shí)世界的信息等,系統(tǒng)自動地將文本從一種語言翻譯成另一種語言。
-
自然語言生成和理解 —— 將計(jì)算機(jī)數(shù)據(jù)庫中的信息轉(zhuǎn)換為人類易于理解的語言被稱為語言生成; 將文本塊轉(zhuǎn)換為計(jì)算機(jī)程序易于操作的更富邏輯的結(jié)構(gòu)稱為語言理解。
-
光學(xué)字符識別(OCR)——給定要打印的文本圖像,計(jì)算機(jī)識別出相應(yīng)的文本。
-
文檔轉(zhuǎn)化成信息 ——將文檔(網(wǎng)站、文件、PDF 和圖像)中的文本數(shù)據(jù)解析為可分析的、整齊的格式。
5.重要的自然語言處理庫(Python)
-
Scikit-learn:Python中的機(jī)器學(xué)習(xí)庫。
-
Natural Language Toolkit (NLTK):NLP的完整工具包。
-
Pattern:用于NLP和機(jī)器學(xué)習(xí)的Web挖掘模塊。
-
TextBlob:易于使用的NLP的API,構(gòu)建在NLTK和Pattern之上。
-
spaCy:具有工業(yè)級強(qiáng)度的Python和Cython工具包。
-
Gensim:Python的主題模型工具包。
-
Stanford Core NLP:Stanford NLP Group提供的NLP服務(wù)和包。
-
-
??????????
已發(fā)表評論數(shù)(0)
沒有更多評論了^^ 更多評論 評論加載失敗,重新加載相關(guān)站點(diǎn)
機(jī)器之心 +訂閱 熱門文章- 1. 斯坦福 CS229 機(jī)器學(xué)習(xí)講義翻譯計(jì)劃
- 2. 語音識別技術(shù)科普
- 3. 一篇文章教你用隱馬爾科夫模型實(shí)現(xiàn)中文分詞
- 4. 才辦了五年的 ICLR,為何被譽(yù)為“深度學(xué)習(xí)的頂級會議”?| ICLR 2017
- 5. 七步讓你實(shí)踐深度學(xué)習(xí)
總結(jié)
以上是生活随笔為你收集整理的教程 | 理解和实现自然语言处理终极指南(附Python代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用深度学习解决大规模文本分类问题
- 下一篇: 如何用 Python 和机器学习帮你决策