教程 | 理解和实现自然语言处理终极指南(附Python代码)
教程 | 理解和實現自然語言處理終極指南(附Python代碼)
機器之心 原文? http://www.jiqizhixin.com/article/2294 主題 自然語言處理 Python根據行情,只有21%的數據目前是結構化的。談話、發推文、在 WhatsApp上發信息以及其他各種各樣的活動,都在持續不斷的產生數據。而大多數這種數據都是以非結構化的文本形式存在的。
最著名的例子有:社交媒體上的推文/帖子、用戶到用戶的聊天記錄、新聞、博客、文章、產品或服務測評和醫療行業的病人記錄。最近的例子有聊天機器人和其他聲音驅動的機器人。
盡管我們有高維數據,但目前其中的信息并不能直接獲得——除非被人工處理過或被一個自動化系統分析過。
為了從文本數據中產生具有重要意義和可實踐的領悟,就需要了解自然語言處理的技巧和原理 。
所以,如果你今年打算打造一個聊天機器人,或者你想運用非結構化的文本數據的力量,那么你算看對了文章,這篇指南揭示了自然語言處理的概念以及它的技巧和實現方法。文章的主要目的是教導自然語言處理的概念以及讓你了解把它運用到實際數據集上。
目錄
1.自然語言處理簡介
2.文本處理
-
移除噪聲
-
詞匯規范化
-
詞形還原
-
詞干提取
-
-
對象標準化
3.文本到特征(文本數據上的特征工程)
-
句法分析
-
從屬關系語法
-
詞性標注
-
-
實體分析
-
短語檢測
-
命名實體分析
-
主題建模
-
N-grams
-
-
統計特征
-
TF – IDF算法
-
頻率/密度特征
-
可讀特征
-
-
詞匯嵌入
4.自然語言處理面臨的重要任務
-
文本分類
-
文本匹配
-
萊文斯坦距離
-
語音匹配
-
柔性字符串匹配
-
-
指代消解
-
其他問題
5.重要的自然語言處理庫
1.自然語言處理簡介
自然語言處理是數據科學中以智能高效的方式對文本進行系統的分析、理解和信息提取的一個分支。通過利用自然語言處理及其成分,一個人能夠組織起巨大數量的文本數據來執行許多自動化任務和解決例如自動摘要、機器翻譯、命名實體識別、關系提取、情感分析、語音識別和主題分割等等非常廣泛的問題。
開始之前,先解釋一下這篇文章中用到的術語:
-
標記化(tokenization):文本轉換為標記的過程
-
標記(token):文本中出現的詞匯或實體
-
文本對象(text object):句子/短語/詞匯/文章
安裝NTLK及其數據的步驟:
安裝Pip:在終端運行:
sudo easy_install pip安裝NTLK:在終端運行
sudo?pip?install?-U?nltk
下載NTLK數據:終端python shell下輸入如下代碼:
```?import?nltk?nltk.download()```
遵循屏幕上的指令下載所需包或集。其他庫可直接使用pip安裝。
2.文本處理
現有數據中,文本是最非結構化的形式,里面有各種各樣的噪聲;如果沒有預處理,文本數據都不能分析。清理和標準化文本的整個過程叫做文本預處理(text preprocessing),其作用是使文本數據沒有噪聲并且可以分析。
主要包括三個步驟:
-
移除噪聲
-
詞匯規范化
-
對象標準化
下圖展示了文本預處理流程的結構。
2.1移除噪聲
任何與數據上下文和最終輸出無關的文本都可被判作噪聲。
例如,語言停止詞(stopword,語言中常用的詞匯:系動詞is,am,定冠詞the,介詞of,in)、URL 或鏈接、社交媒體實體(提及、標簽)、標點符號和特定行業詞匯。這一步移除了文本中所有類型的噪聲。
移除噪聲通用的做法是準備一個噪聲實體的詞典,在文本對象上逐個 token(或逐詞)迭代,消除在噪聲詞典中出現的標簽。
以下是實現這一步的 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"
```
另外一種方法是使用正則表達式,盡管其只能解決特定模式的噪聲。我們在之前的文章中詳細介紹了正則表達式:https://www.analyticsvidhya.com/blog/2015/06/regular-expression-python/
以下是從輸入文本中移除正則表達式的 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詞匯規范化
另外一種文本形式的噪聲是由一個詞匯所產生的多種表示形式。
例如,“play”,“player”,“played”,“plays”和“playing”,這些詞匯都是由“play”變化而來的。雖然它們意義不一,但根據上下文都是相似的。詞匯規范化這一步把一個詞的不同展現形式轉化為了他們規范化的形式(也叫做引理(lemma))。規范化是文本上的特征工程起中樞作用的一步,因為它把高維特征(N個不同的特征)轉化為了對任何機器學習模型都很理想的低維空間(1個特征)。
最常見的詞匯規范化是:
-
詞干提取:詞干提取是詞匯后綴(“ing”,“ly”,“es”,“s”等)去除過程的一個基本規則。
-
詞形還原:詞形還原與詞干提取相反,是有組織地逐步獲取詞匯根形式的步驟,它使用到了詞匯(詞匯字典序)和形態分析(詞的結構和語法關系)。
下面是實現詞形還原和詞干提取的代碼,使用了一個流行的 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對象標準化
文本數據經常包含不在任何標準詞典里出現的詞匯或短語。搜索引擎和模型都識別不了這些。
比如,首字母縮略詞、詞匯附加標簽和通俗俚語。通過正則表達式和人工準備的數據詞典,這種類型的噪聲可以被修復。以下代碼使用了詞典查找方法來替代文本中的社交俚語。
```?
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"
```
除了目前為止討論過的三個步驟,其他類型的文本預處理有編碼-解碼噪聲,語法檢查器和拼寫改正等。我之前的一篇文章給出了預處理及其方法的細節。
3.文本到特征(文本數據上的特征工程)
為了分析已經預處理過的數據,需要將數據轉化成特征(feature)。取決于用途,文本特征可通過句法分析、實體/N元模型/基于詞匯的特征、統計特征和詞匯嵌入等方法來構建。下面來詳細理解這些技巧。
3.1句法分析
句法分析涉及到對句中詞的語法分析和位置與詞匯的關系的分析。依存語法(Dependency Grammar)和詞性標注(Part of Speech tags)是重要的文本句法屬性。
依賴樹(Dependency Trees)——由一些詞匯共同組成的句子。句中詞與詞之間的聯系是由基本的依存語法決定的。從屬關系語法是一類解決(已標簽)兩個詞匯項(字詞)間二元不對稱關系的句法文本分析。每一種關系都可用三元組(關系、支配成分、從屬成分)來表示。例如:考慮下面這個句子:“Bills on ports and immigration were submitted by Senator Brownback, Republican of Kansas.”詞匯間的關系可由如下所示的樹的形式觀察得到
觀察樹的形狀可得:“submitted”是該句的根詞(root word),由兩顆子樹所連接(主語和賓語子樹)。每一顆子樹本身又是一顆依存關系樹(dependency tree ),其中的關系比如有 - (“Bills” <-> “ports” <by> “proposition” 關系),(“ports” <-> “immigration” <by> “conjugation” 關系)
這種類型的樹,當從上至下迭代分析時可以得到語法關系三元組。對于很多自然語言處理問題,比如實體性情感分析,執行者(actor)與實體識別和文本分類等,語法關系三元組都可以用作特征。Python wrapper 的StanfordCoreNLP( http://stanfordnlp.github.io/CoreNLP/ 來自斯坦福自然語言處理組,只允許商業許可證)和NTLK從屬關系語法可以用來生成依賴樹。
詞性標注(PoS/Part of speech tagging)——除了語法關系外,句中每個詞都與詞性(名詞、動詞、形容詞、副詞等等)聯系起來。詞性標注標簽決定了句中該詞的用法和作用。這里有賓夕法尼亞大學定義的所有可能的詞性標簽表。以下代碼使用了NTLK包對輸入文本執行詞性標簽注釋。(NTLK提供了不同的實現方式,默認是感知器標簽)
```
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'),
詞性標注被用在許多重要的自然語言處理目的上:
A. 詞義消歧:一些詞匯根據用法有很多種意思。例如,下面的兩個句子:
-
I.“Please book my flight for Delhi”
-
II. “I am going to read this book in the flight”
“Book”在不同的上下文中出現,然而這兩種情況的詞性標簽卻不一樣。在第一句中,“book”被用作動詞,而在第二句中,它被用作名詞。(Lesk算法也可被用于相同的目的)
B. 提高基于詞匯的特征:當詞匯作為特征時,一個學習模型可以學習到不同的詞匯上下文,然而特征與詞性連接起來,上下文就被保留了,因此得到了很強的特征。例如:
-
句 - “book my flight, I will read this book”
-
標簽 – (“book”, 2), (“my”, 1), (“flight”, 1), (“I”, 1), (“will”, 1), (“read”, 1), (“this”, 1)帶有POS的標簽 – (“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. 規范化和詞形歸并(Lemmatizatio):詞性標簽是將詞轉化為其基本形式(引理)的基礎
D. 高效移除停止詞:詞性標簽在移除停止詞方面也非常有用。
例如,有一些標簽總是定義低頻/較低重要性的詞匯。
例如:(IN – “within”, “upon”, “except”), (CD – “one”,”two”, “hundred”), (MD – “may”, “must” 等)
3.2 實體提取(實體作為特征)
實體(entity)被定義為句中最重要的部分——名詞短語、動詞短語或兩者都有。實體檢測算法通常是由基于規則的解析、詞典查詢、詞性標簽和依存分析組合起來的模型。實體檢測的適用性很廣泛,在自動聊天機器人、內容分析器和消費者見解中都有應用。
主題建模和命名實體識別是自然語言處理領域中兩種關鍵的實體檢測方法。
A. 命名實體識別(NER/Named Entity Recognition)
從文本中檢測命名實體比如人名、位置、公司名稱等的過程叫做命名實體識別(NER)。例如:
句 - Sergey Brin, the manager of Google Inc. is walking in the streets of New York.命名實體 - ( “人” : “Sergey Brin” ), (“公司名” : “Google Inc.”), (“位置” : “New York”)典型NER模型包含三個模塊:
-
名詞短語識別:使用從屬關系分析和詞性分析將所有名詞性短語從文本中提取出來。
-
短語分類:將提取出的名詞短語分類到各自的目錄(位置,名稱等)中。谷歌地圖API提供了通往消除歧義位置的很好路徑。然后,dbpedia,維基百科的開源數據庫可以用來識別人名或公司名。除了這個,我們能通過結合不同來源的信息精確的查找表和詞典。
-
實體消歧:有些時候實體可能會誤分類,因此在結果層上建一層交叉驗證層非常有用。知識圖譜就可以用來使用。目前流行的知識圖譜有:谷歌知識圖譜、IBM Watson 和維基百科。
B.主題建模
主題建模是自動識別文本集中主題的過程,它以無監督的方式從語料庫中的詞匯里提取隱藏的模式。主題(topic)被定義為“文本集中共同出現術語的重復模式”。一個好的主題模型能對“健康”、“醫生”、“病人”、“醫院”建模為“健康保健”,“農場”、“作物”、“小麥”建模為“耕作”。
隱含狄利克雷分布(LDA)是最流行的主題建模技術,以下是在Python環境下使用LDA技術實現主題建模的代碼。若想查看更詳細的細節,請參看: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個詞匯的結合體。N-Grams(N>1)作為特征與詞匯(Unigrams)作為特征相比,通常會更加富含信息。同時,bigrams(N=2)被認為是最重要的特征。以下代碼生成了文本的 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 統計特征
文本數據使用該節所講的幾種技術可直接量化成數字。
A. 術語頻率 - 逆文獻頻率(TF – IDF)
TF-IDF 是經常被使用在信息檢索問題上的權重模型。TF-IDF在不考慮文獻中詞的具體位置情況下,基于文獻中出現的詞匯將文本文獻轉化成向量模型。例如,假設有一個N 個文本文獻的數據集,在任何一個文獻“D”中,TF和IDF會被定義為 - 術語頻率(TF) - 術語“t”的術語頻率被定義為“t”在文獻“D”中的數量。
逆文獻頻率(IDF)- 術語的逆文獻頻率被定義為文本集中可用文獻的數量與包含術語“t”的文獻的數量的比例的對數。
TF-IDF公式給出了文本集中術語的相對重要性,以下為TF-IDF公式和使用Python的scikit學習包將文本轉換為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
```
模型創建了一個詞典并給每一個詞匯賦了一個索引。輸出的每一行包含了一個元組(i,j)和在第i篇文獻索引j處詞匯的tf-idf值。
B. 數量/密度/可讀性特征
基于數量或密度的特征同樣也能被用于模型和分析中。這些特征可能看起來比較繁瑣但是對學習模型有非常大的影響。一些特征有:詞數、句數、標點符號數和特定行業詞匯的數量。其他類型的測量還包括可讀性測量(比如音節數量、smog index 和易讀性指數)。參考 Textstat 庫創建這樣的特征:https://github.com/shivam5992/textstat
3.4詞嵌入(文本向量)
詞嵌入是將詞表示為向量的方法,在盡量保存文本相似性的基礎上將高維的詞特征向量映射為低維特征向量。詞嵌入廣泛用于深度學習領域,例如卷積神經網絡和循環神經網絡。Word2Vec和GloVe是目前非常流行的兩種做詞嵌入的開源工具包,都是將文本轉化為對應的向量。
-
Word2Vec: https://code.google.com/archive/p/word2vec/
-
GloVe: http://nlp.stanford.edu/projects/glove/
Word2Vec是由預處理模塊和兩個淺層神經網絡(CBOW/Continuous Bag of Words和Skip-gram)組成,這些模型廣泛用于自然語言處理問題。Word2Vec首先從訓練語料庫中組織詞匯,然后將詞匯做詞嵌入,得到對應的文本向量。下面的代碼是利用gensim包實現詞嵌入表示。
```
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,?...])
```
這些向量作為機器學習的特征向量,然后利用余弦相似性、單詞聚類、文本分類等方法來衡量文本的相似性。
4.自然語言處理(NLP)的重要任務
本節討論NLP的不同案例和問題。
4.1文本分類
文本分類是NLP的經典問題之一。例如垃圾郵件識別、新聞主題分類、搜索引擎的網頁組織和情感分類。
通俗來講,文本分類就是系統地將文本對象(文件和句子)按照一定的分類體系或標準進行自動分類標記。尤其是當數據量太大時,文本分類對于組織、信息過濾、儲存非常有幫助。典型的自然語言分類包括兩部分:a)訓練(b)預測。首先,文本輸入是創建特征過程,機器學習從這些特征中學習,然后對新文本進行預測。
下面的代碼利用了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))
```
文本分類的效果在很大程度上依賴于特征的選擇,在機器學習中,使用越來越多的訓練數據總是一個好的選擇。
4.2 文本匹配/相似性
NLP的一個重要應用是對文本對象進行匹配以找到相似性。文本匹配的重要應用包括自動拼寫校正、刪除重復數據和基因組分析等。目前有許多文本分類方法,本節對一些重要的分類方法進行詳細介紹。
A. Levenshtein距離 —— 兩個字符串之間的Levenshtein距離被定義為將一個字符串轉換為另一個字符串所需的最小編輯次數,允許的編輯操作包括單個字符的插入、刪除或替換。以下代碼是高效內存計算的具體實現。
```?
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.音素匹配 ——音素匹配算法以關鍵詞作為輸入(人的姓名、位置名稱等),然后產生一個字符串來標識一組音素相似的單詞。音素匹配對于搜索大文本語料庫、更正拼寫錯誤和匹配相關名稱非常有用。 Soundex和Metaphone是目前兩種主要音素匹配算法。 Python的Fuzzy模塊用來計算不同單詞的soundex字符串,例如:
```?
import?fuzzy?
soundex?=?fuzzy.Soundex(4)?
print?soundex('ankit')
>>>?“A523”
print?soundex('aunkit')
>>>?“A523”?
```
C.靈活的字符串匹配 —— 一個完整的文本匹配系統包括不同的算法,這些算法計算各種文本差異。正則表達式對字符串匹配非常有幫助。另一些常見的字符串匹配技術有精確串匹配,lemmatized匹配和緊湊匹配(考慮空格、標點符號、俚語等)。
D.余弦相似性 —— 當文本以向量表示時,也可以應用余弦相似性來表征矢量的相似性。下面的代碼將文本轉換為向量(使用術語頻率),并應用余弦相似性來衡量文本之間的相近性。
```?
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指代消解
指代消解是指找出句子中相對應的詞或短語。考慮如下例子“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。指代消解是自然語言處理的重要內容,它被用于自動摘要、問答系統和信息采集等方面。 Stanford CoreNLP提供了一個商用Python wrapper:
https://github.com/Wordseer/stanford-corenlp-python
4.4其它NLP問題/任務
-
自動摘要 ——給定文章或段落,系統按一定順序生成最重要和最相關的句子。
-
機器翻譯 ——通過處理語法、語義和現實世界的信息等,系統自動地將文本從一種語言翻譯成另一種語言。
-
自然語言生成和理解 —— 將計算機數據庫中的信息轉換為人類易于理解的語言被稱為語言生成; 將文本塊轉換為計算機程序易于操作的更富邏輯的結構稱為語言理解。
-
光學字符識別(OCR)——給定要打印的文本圖像,計算機識別出相應的文本。
-
文檔轉化成信息 ——將文檔(網站、文件、PDF 和圖像)中的文本數據解析為可分析的、整齊的格式。
5.重要的自然語言處理庫(Python)
-
Scikit-learn:Python中的機器學習庫。
-
Natural Language Toolkit (NLTK):NLP的完整工具包。
-
Pattern:用于NLP和機器學習的Web挖掘模塊。
-
TextBlob:易于使用的NLP的API,構建在NLTK和Pattern之上。
-
spaCy:具有工業級強度的Python和Cython工具包。
-
Gensim:Python的主題模型工具包。
-
Stanford Core NLP:Stanford NLP Group提供的NLP服務和包。
-
-
??????????
已發表評論數(0)
沒有更多評論了^^ 更多評論 評論加載失敗,重新加載相關站點
機器之心 +訂閱 熱門文章- 1. 斯坦福 CS229 機器學習講義翻譯計劃
- 2. 語音識別技術科普
- 3. 一篇文章教你用隱馬爾科夫模型實現中文分詞
- 4. 才辦了五年的 ICLR,為何被譽為“深度學習的頂級會議”?| ICLR 2017
- 5. 七步讓你實踐深度學習
總結
以上是生活随笔為你收集整理的教程 | 理解和实现自然语言处理终极指南(附Python代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用深度学习解决大规模文本分类问题
- 下一篇: Yann LeCun:掌舵Faceboo