自然語言處理-介紹、入門與應用


自然語言處理-介紹、入門與應用

  

根據工業界的估計,僅僅只有21%的數據是以結構化的形式展現的。數據由說話,發微博,發消息等各種方式產生。數據主要是以文本形式存在,而這種方式卻是高度無結構化的。使用這些文本消息的例子包括:社交網絡上的發言,聊天記錄,新聞,博客,文章等等。

 

盡管我們會有一些高維的數據,但是它所表達的信息我們很難直接獲取到,除非它們已經被我們人工地做了處理(例如:我們閱讀並理解了它們)。或者,我們可以通過自動化系統來對他進行分析。

 

為了從文本數據里得到有意義並且可行的深層信息,我們需要深入理解自然語言的技術與原理。

 

所以,如果你計划去創建一個聊天機器人,或者你想要去使用無結構化文本的力量,這個教程將會是一個較好的起點。這個教程會覆蓋自然語言處理的概念、技術,以及實現。本文的目標是希望在理解自然語言處理的概念后,將它應用到真正的數據集上。

 

1. 自然語言處理(NLP)簡介

NLP是數據科學里的一個分支,它的主要覆蓋的內容是:以一種智能與高效的方式,對文本數據進行系統化分析、理解與信息提取的過程。通過使用NLP以及它的組件,我們可以管理非常大塊的文本數據,或者執行大量的自動化任務,並且解決各式各樣的問題,如自動摘要,機器翻譯,命名實體識別,關系提取,情感分析,語音識別,以及主題分割等等。

 

在我們進入下一步之前,我們先解釋一下將會在此教程里用到的一些術語:

1. Tokenization:將文本轉化為tokens的過程

2. Tokens:在文本里的展示的單詞或實體

3. Text object:一個句子、短語、單詞或文章

 

首先安裝NLTK以及它的數據:

pip3 install nltk

 

python界面里輸入以下代碼,並根據彈出的界面下載所需要的包:

>>> import nltk

>>> nltk.download()

 

2. 文本預處理

因為文本數據在可用的數據中是非常無結構的,它內部會包含很多不同類型的噪點。所以在對文本進行預處理之前,它暫時是不適合被用於做直接分析的。文本預處理過程主要是對 文本數據進行清洗與標准化。這個過程會讓我們的數據沒有噪聲,並可以對它直接做分析。

 

數據預處理的過程主要包括以下三個部分:

1. 噪聲移除

2. 詞匯規范化

3. 對象標准化

 

2.1 噪聲移除

任何與數據上下文無關的文本片段以及end-output均可被認為是噪音。例如,語言停頓詞(一般是在語言里常用的單詞,如:is, am, the, of, in 等等),URL或鏈接,社交媒體里的實體(如@符號,#標簽等),標點符號,以及工業特有詞匯等。這個步驟就是為了移除文本里所有類型的噪音實體。

 

在噪音移除里,一個常見的方法是:准備一個噪音實體的字典,然后對text object進行迭代(以token或單詞),去除掉那些存在於噪音字典里的tokens(單詞或實體)。

 

一個例子如下:


# 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

print(_remove_noise("this is a sample text"))

 

>>>sample text

 

另外一個方法是使用正則表達式處理一些特定模式的噪音。下面是一個使用正則表達式移除噪音的例子:

 

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 =
'#[\w]*'

result = _remove_regex("remove this #hashtag from analytics vidhya", regex_pattern)
print(result)

>>> remove this  from analytics vidhya

 

2.2 詞匯規范化

另外一種文本型的噪音與一個詞語的多種表達形式有關。例如,“play”,“player”,“played”,“plays”和“playing”都是單詞“play”的變種。盡管它們有不同的意思,但是根據上下文來看,它們是意思是相似的。這個步驟是將一個單詞的所有不同形式轉換為它的規范形式(也被稱為詞條(lemma))。規范化在特征工程里,是對文本處理的一個關鍵步驟。因為它將高維的特征(N個不同的特征)轉換到了低維空間(1個特征),這對於機器學習模型來說是非常完美的。

 

最常見的詞匯規范化的實踐有:

1.    詞干提取(Stemming):詞干提取是一個初級的、基於規則的脫去后綴(如“ing”,“ly”,“es”,“s”等等)的過程

2.    詞元化(Lemmatization):另一方面,詞元化,是一個組織好的、一步一步的獲取詞根的過程。並使用了詞匯表(單詞在字典里的重要性)和形態學分析(單詞結構與語法關系)

 

下面是一個示例代碼,它使用了NLTK來做StemmingLemmatization

>>> 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'

 

>>> word2 = 'playing'

>>> stem.stem(word2)

'play'

 
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_words =
' '.join(new_words)
   
return new_words

result = _lookup_words(
'RT this is a retweeted tweet by Shivam Bansal')
print(result)
 

>>>Retweet this is a retweeted tweet by Shivam Bansal

 
除了以上討論的三個步驟以外,其他還有一些文本預處理的技術,如:encoding-decoding噪音,語法檢查,以及拼寫糾正等。
 
3. 將文本轉化為特征(在文本數據上使用特征工程)
為了分析一個已經做了預處理的數據,我們需要將它轉化為特征。根據使用用途不同,文本特征可以根據各種技術建立而成。如:句法分析(Syntactical Parsing),實體(entities/ N元語法(N-grams / 基於單詞(word-based)特征,統計學(Statistical)特征,以及詞向量(word embeddings)。接下來我們會對它們進行逐一介紹。
 
3.1 句法分析(Syntactic Parsing
句法分析包括:分析單詞在句子里的語法,以及,它們在句子中的位置顯示的,在某種程度上,與其他單詞之間的關系 。依賴性文法(Depenency Grammar)和詞性標注(Part of Speech tags),是文本句法里最重要的屬性。
 
依賴關系樹 句子是由一些單詞組成。在句子里,單詞之間的關系是由基本的依賴性文法決定的。依賴性文法是一類句法文本分析,它用於處理兩個詞項(單詞)之間的非對稱二元關系。每個關系可以以一個三元項(relation(關系)governor(管理者)dependent(依賴))來表示。例如:考慮這個句子:“Bills  on ports and immigration were submitted by Senator Brownback, Republican of Kansas”。在這個句子里,單詞之間的關系可以用下面一個樹來表示:

 
從這個樹里我們可以看到,“submitted”是這個句子里的根部,並且它由兩個子樹連接起來(subject-主語子樹和object-賓語子樹)。每個子樹都是它自己的依賴關系樹,它們之間的關系例如:(“Bills<-> ports<by> “介詞(preposition)”關系),(“ports<-> immigration<by> “連詞(conjunction)”關系)
 
這種類型的樹,當以自上到下的方式迭代的進行語法分析時,我們可以得到語法關系三元組作為輸出。這些輸出可以被當作特征應用於非常多的nlp問題中,如實體情感分析,actor & entity identification,以及文本分類。在python中,StanfordCoreNLP以及NLTK依賴性文法,都可以用於生成依賴關系樹。
 
詞性標注 除了語法關系,在句子中,每個單詞還與它的詞性(名次,動詞,形容詞,副詞,等)相關。詞性的標簽定義了一個單詞在句子里的用法以及功能。下面的代碼展示了如何用NLTK對輸入的文本做詞性標注注解。(NLTK提供了多種實現,默認使用的是perceptron tagger
 

>>> from nltk import word_tokenize, pos_tag

>>> text = "Hello, I am Zack, I am learning Natural Language Processing online"

>>> tokens = word_tokenize(text)

>>> tokens

['Hello', ',', 'I', 'am', 'Zack', ',', 'I', 'am', 'learning', 'Natural', 'Language', 'Processing', 'online']

>>> pos_tag(tokens)

[('Hello', 'NNP'), (',', ','), ('I', 'PRP'), ('am', 'VBP'), ('Zack', 'RB'), (',', ','), ('I', 'PRP'), ('am', 'VBP'), ('learning', 'VBG'), ('Natural', 'NNP'), ('Language', 'NNP'), ('Processing', 'NNP'), ('online', 'NN')]

 
詞性標注在NLP里有很多重要的通途:
A.    詞義消歧:一些單詞有多重意思,根據它們的使用不同,會有不同意思。例如,下面兩個句子:
1.“Please book my flight for Delhi”
2.“I am going to read this book in the flight”
 
這里 book的單詞根據上下文的不同,含義也不同。而詞性標注對兩個book的詞性標注也應不同。在句子1里,book單詞是一個動詞,而在句子2里是一個名次。(Lesk算法也可以用於相同的目的)
 
B.    提升基於單詞的特征(Improving word-based features):當單詞被當作特征使用時,一個學習模型會學習到一個單詞的不同上下文。然而如果詞性標注被關聯進去時,上下文即被保護了,這樣便可構造出更優秀的特征。例如:
Sentence – “book my flight, I will read this book”
 
Tokens – (“book”, 2), (“my”, 1), (“flight”, 1), (“I”, 1), (“will”, 1), (“read”, 1), (“this”, 1)
 
Tokens with 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.   標准化與詞元化:在轉換一個詞到它的基本形式時,詞性標簽是詞元化過程的基礎。 
 
D.   高效的停止詞移除(Efficient stopword removal):在高效的停止詞移除中,詞性標注也非常有用
 
3.2 實體抽取(實體作為特征)
實體被定義為一個句子里最重要的部分,它們一般是名詞短語,動詞短語或者兩者均有。實體檢測算法一般是由基於規則的句法分析、詞典查找、詞性標注以及依存句法分析結合起來的組合模型。實體抽取的應用一般可以在自動聊天機器人、上下文分析器以及消費者洞察(consumer insights)里見到。

 
主題建模(topic modelling)和命名實體識別(named entity recognition)在NLP里是兩個非常關鍵的實體抽取方法。
A.    命名實體識別(NER
從一個文本里檢測命名的實體(如:人名、地點名、公司名等)的過程叫做NER,例如:
 
Sentence – Sergey Brin, the manager of Google Inc. is walking in the streets of New York
 
Named Entities – (“person” : “Sergey Brin”), (“org” : “Google Inc.”), (“location” : “New York”)
 
一個典型的NER模型包括以下三個部分:
 
名詞短語識別:這個步驟處理的是,使用依存句法分析和詞性標記的方法,從一個文本里抽取出所有的名詞短語。
 
短語分類:這個步驟是一個分類操作,它將所有提取出來的名詞短語分類到對應的類別中(如地點,名字,等等)。Google Maps API提供了一個很好的辦法消除地點的歧義。然后,一般的開源數據庫,如dbpediaWikipedia等都可以用於識別人名與公司名。除了這以外,我們也可以自己創建一個查找表和字典,將不同來源的數據整合起來。
 
實體消歧:可能有些時候實體會被錯誤的分類,所以在輸出層之上創建一個驗證層將會大有幫助。使用知識圖可以實現這個目標。比較流行的知識圖有:Google Knowledge GraphIBM WatsonWikipedia
 
B.    主題建模
主題建模是一個從文本語料庫里自動化識別主題的過程。它以一種非監督的方式,得到語料庫里單詞中的隱含模式。主題被定義為“a repeating pattern of co-occurring terms in a corpus”。一個好的主題模型可以得到:“heath”, “doctor”, “patient”, “hospital” Healthcare的主題,“farm”, “crops”, “wheat” 對應於“Farming”的主題
 
隱含狄利克雷分布(Latent Dirichlet Allocation)(LDA)是最流行的主題建模技術。下面的代碼使用了LDA實現主題建模。更多與此有關的說明與實現,可以參考這個文檔:
https://www.analyticsvidhya.com/blog/2016/08/beginners-guide-to-topic-modeling-in-python/
 
import gensim
from gensim import corpora

# Creating the term dictionary of our corpus, where every 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 lib
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())
 
[(0, '0.030*"driving" + 0.030*"a" + 0.030*"practice" + 0.030*"dance" + 0.030*"lot" + 0.030*"time" + 0.030*"of" + 0.030*"spends" + 0.030*"around" + 0.030*"consume."'), (1, '0.083*"to" + 0.058*"My" + 0.058*"sister" + 0.058*"my" + 0.058*"father" + 0.033*"is" + 0.033*"not" + 0.033*"Sugar" + 0.033*"likes" + 0.033*"have"'), (2, '0.061*"driving" + 0.061*"and" + 0.061*"suggest" + 0.061*"stress" + 0.061*"pressure" + 0.061*"may" + 0.061*"that" + 0.061*"increase" + 0.061*"Doctors" + 0.061*"blood"')]
 
C.   N元語法(N-Grams)作為特征
N個單詞結合在一起叫做N元語法。在作為特征時,N元語法(N>1)一般會比單元語法提供更多的消息。同樣,二元語法(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

print(generate_ngrams('this is a sample text', 2))
 
[['this', 'is'], ['is', 'a'], ['a', 'sample'], ['sample', 'text']]
 
3.3 統計特征(Statistical Features
通過使用以下提到的幾個技術,文本數據可以被直接量化為數量值:
A.    詞頻 逆文檔頻率(Term Frequency – Inverse Document Frequency)(TF– IDF
TF-IDF是一個有權重的模型,它常被用於信息檢索(information retrieval)問題。它的目的是在於:基於單詞在文檔里出現的頻率(不考慮嚴格的排序),將文檔轉化為向量模型。例如:假設這里有個數據庫,里面有N個文檔。對於每個文檔“D”來說,TFIDF被定義為:
 
Term FrequencyTF):對於一個術語(term)“t”來說,它在“D”里的TF為“t”在“D”里出現的次數
 
Inverse Document FrequencyIDF):IDF對於一個術語(term)來說,它被定義為:在語料庫里所有文檔數,與,包含術語T文檔的數,的一個比率的對數
 
TF . IDFTF IDF的公式(如下所示)給出了一個術語(term)在語料庫(文檔的集合)里的相對重要性。

 
下面的代碼展示了使用pythonscikit learn包將一個文本轉化為tf-idf向量:
 
from sklearn.feature_extraction.text import TfidfVectorizer
obj = TfidfVectorizer()
corpus = [
'This is a sample document.', 'another random document.', 'third sample document text']
X = obj.fit_transform(corpus)
 
(0, 7)  0.58448290102
(0, 2)  0.58448290102
(0, 4)  0.444514311537
(0, 1)  0.345205016865
(1, 1)  0.385371627466
(1, 0)  0.652490884513
(1, 3)  0.652490884513
(2, 4)  0.444514311537
(2, 1)  0.345205016865
(2, 6)  0.58448290102
(2, 5)  0.58448290102
 
這個模型創建了一個詞匯字典,並且給每個單詞分配了一個索引。在輸出結果里,每一行包含一個元祖(i, j),以及indexj的單詞在文檔i里的tf-idf
 
B.    計數 / 密度 / 可讀性特征(Count / Density / Readability Features
基於特征的計數與密度特征也可以被用於模型與分析。這些特征可能看起來是不重要的,但是在訓練模型時顯示出了巨大的影響。其中一些特征包括:單詞數(Word Count),句子數(Sentence Count),標點數(Punctuation Counts)和行業特定詞數(Industry specific word)。其他類型的衡量方法(包括可讀性衡量)如音節數,smog index和易讀性指數。可以參考以下文檔創建這些特征:
https://github.com/shivam5992/textstat
 
3.4 詞向量(Word Embedding)(text vectors
Word embedding是一種非常現代的用向量表示單詞的方式。它的目標是為了將高維的詞特征重新定義為低維的特征向量,主要通過保留語料庫里的上下文相關性完成。它已經被廣泛應用於如卷積神經網絡,循環神經網絡等深度學習模型中
 
Word2Vec  GloVe是兩個非常流行的為文本創建詞向量的模型。這些模型使用文本語料庫作為輸入,並生成詞向量作為輸出。
 
Word2Vec模型由預處理模塊、被稱為連續詞袋(Continuous Bag of Words)的一個淺神經網絡模塊以及另一個名叫skip-gram的淺神經網絡模型組成。這些模型已經被廣泛的用於其他各種nlp問題。它首先從訓練語料庫建立一個詞匯表,然后學習詞向量的表現方式。下面的代碼使用了gensim包實現詞向量:
 
from gensim.models import Word2Vec
sentences = [[
'data', 'science'], ['online', '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.204396587715

print(model['learning'])

[  4.16955026e-03  -2.37376429e-03  -2.78551341e-03   3.92724760e-03
   7.43532903e-04   7.26812170e-04   4.44857636e-03   3.75635154e-03
  -1.43383816e-03   4.24796832e-04  -3.50184389e-03   4.13319934e-03
  -2.44115014e-03   1.11951970e-03   1.82436092e-03  -4.80600866e-03
   4.72195214e-03  -7.03078258e-05   1.24959322e-03  -4.79448866e-03
… ]
 
它們可以作為特征向量使用在機器學習模型中,也可以用於衡量文本相似度(使用余弦相似技術),還可以適用於詞聚類以及文本分類等技術中。
 
4. NLP的重要任務
這個板塊會討論在自然語言處理領域下的不同的應用場景與問題
 
4.1文本分類
文本分類經典的NLP問題之一。眾所周知的例子包括:垃圾郵件識別,新聞主題分類,情感分析,以及搜索引擎的頁面組織。
 
文本分類,簡單來說,它就是一種將文本對象(文檔或句子)分類到一個固定的類別的技術。當數據量非常大時,它在數據的組織、信息過濾,以及數據存儲等方面起到非常大的作用。
 
一個典型的自然語言分類器包含兩部分:1. 訓練;2. 預測。如下圖所示:

 
        
首先,文本在輸入后,它的特征會被創建。然后機器學習算法從這些特征學習一組參數。之后使用學習到的機器學習模型對新文本做預測。
 
下面是一個朴素貝葉斯分類器的例子(使用了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.833
 
 
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)
print(prediction)

>>> ['Class_A' 'Class_A' 'Class_B' 'Class_B' 'Class_A' 'Class_A']



print(classification_report(test_labels, prediction))
>>> 
             precision    recall  f1-score   support
 
    Class_A       0.50      0.67      0.57         3
    Class_B       0.50      0.33      0.40         3
 
avg / total       0.50      0.50      0.49         6
 
 
文本分類很大程度上依賴於特征的質量與數量。當然,在使用任何機器學習訓練模型時,一般來說,引入越多的訓練數據總會是一個比較好的事。
 
4.2 文本匹配 / 相似度(Text Matching / Similarity
NLP中,一個很重要的領域是通過匹配文本對象找到相似體。它的主要應用有:自動拼寫修正,重復數據刪除,以及基因組分析,等等。
 
根據需求,我們有若干個文本匹配技術可供選擇。這個部分會詳細的描述比較重要的技術:
A.    萊文斯坦距離(Levenshtein Distance- 兩個字符串之間的萊文斯坦距離可以被定義為:將一個字符串轉換為另一個字符串時,所需的最小編輯次數。可允許的編輯操作有插入,刪除,或者替換一個單字符。下面是對此算法的一個實現(高效的內存計算):
 
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'))
>>> 1
 
B.    語音匹配(Phonetic Matching- 語音匹配的算法以一個關鍵詞作為輸入(如人名,地名等),然后產生出一個字符串,這個字符串與一組語音上(大致)相似的單詞有關。這個技術在搜索超大文本語料庫、修正拼寫錯誤以及匹配相關名字時非常有幫助。SoundexMetaphone是其中兩個組主要的語音算法。Python里的Fuzzy模塊可以用來為不同的單詞計算soundex字符串,如:
 
import fuzzy
soundex = fuzzy.Soundex(
4)
print(soundex('ankit'))
>>> A523
 
print(soundex('aunkit'))
>>> A523
 
C.   靈活的字符串匹配(Flexible String Matching- 一個完整的文本匹配系統里包括多種不同的算法,它們通過管道的方式組合起來,計算文本變化的種類(compute variety of text variations)。正則表達式對於這個任務也非常有用。其他常見的技術包括:精准字符串匹配,lemmatized matching,以及緊湊匹配(處理空格,標點,俚語等)
 
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 online'
text2 = 'article on analytics online is about natural language processing'

vector1 = text_to_vector(text1)
vector2 = text_to_vector(text2)
cosin = get_cosine(vector1, vector2)

print(cosin)
>>> 0.63
 
 
4.3 指代消解(Coreference Resolution
指代消解是一個在句子里尋找單詞(或短語)之間關系連接的過程。考慮這個句子“Donald went to John’s office to see the new table. He looked at it for an hour.
 
人們可以很快的指出“he”指代的是Donald(而不是John),並且“it”指代的是table(而不是John’s office)。指代消解是NLP的一個組成部分,它會自動的完成這個工作。這個技術常被用於文件摘要,問答系統,以及信息提取。Stanford CoreNLP
提供了一個python wrapper
https://github.com/Wordseer/stanford-corenlp-python
 
 
 
4.4 其他NLP問題 / 任務
1.    文本摘要:給出一個文本文章或段落,自動對它做總結,並根據重要性、相關性的程度,按次序輸出句子(依次輸出最重要並最相關的句子)。
2.    機器翻譯:通過處理語法、語義學以及真實世界的信息,自動將一個文本的語言翻譯為另外一個語言的文本。
3.    自然語言的生成與理解:將計算機數據庫里的信息或語義意圖轉化為人類可讀的語言叫做自然語言生成。為了更方便計算機程序處理,而將文本塊轉換為更邏輯化的結構的操作叫做自然語言理解
4.    視覺字符識別:給出一打印后的文本圖,識別與之對應的文本
5.    文檔信息化:對文檔(網站,文件,pdf和圖片)里文本數據的進行語法分析,將它們處理為干凈、可分析的格式
 
5. NLP相關的重要庫
·      scikit-learnpython里的機器學習庫
·      Natural Language ToolkitNLTK):包含所有NLP技術的完整工具
·      Pattern:一個web mining模塊,用於NLP和機器學習
·      TextBlob:操作簡單的nlp工具API,構建於NLTKPattern
·      spaCyIndustrial strength NLP with Python and Cython
·      Gensim:主題建模
·      Stanford Core NLPStanford NLP group提供的NLP服務包
 
----------------------------------------------------------------------------------------------------

此文為個人翻譯,原文如下: 

https://www.analyticsvidhya.com/blog/2017/01/ultimate-guide-to-understand-implement-natural-language-processing-codes-in-python/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM