tft每日頭條

 > 科技

 > 基于深度學習的自然語言處理

基于深度學習的自然語言處理

科技 更新时间:2024-05-15 18:28:28

今天,小叮當繼續為大家分享自然語言處理的幹貨~

一、什麼是自然語言處理?

我們來回顧下,什麼是是自然語言處理?

基于深度學習的自然語言處理(真IT小叮當深度學習)1

簡單來說,自然語言處理就是使字符串通過特征工程等方法變成計算機可以理解的0,1數據。

基于深度學習的自然語言處理(真IT小叮當深度學習)2

上次,我們簡單了解了文本預處理。那麼文本預處理使我們得到了什麼呢?我們以啊甘名言“生活就像一塊巧克力”為例,進行舉例。

基于深度學習的自然語言處理(真IT小叮當深度學習)3

那麼将預處理後的文本變成特征,我們該怎麼做呢?這就要用到我們自然語言處理中的以下應用了。

二、NLTK在NLP上的經典應用

1.情感分析

最簡單的例子就是,來分析微博評論對一條微博持支持或反對的态度。例如分析“花

基于深度學習的自然語言處理(真IT小叮當深度學習)4

情感分析可以通過建立sentiment dictionary(情感字典)來實現。例如:like-(1),good-(2),bad-(-2),terrible-(-3) 這代表着like的情感正面程度分值為1,good的情感正面程度為2,bad的情感正面程度為-2,terrible的情感正面程度為-3。

當然,這些情感字典的分值是由一群語言學家共同讨論給出。我們可以看到這種方法類似于關鍵詞打分機制

例如,AFINN-111就是一個典型的情感字典。

基于深度學習的自然語言處理(真IT小叮當深度學習)5

我們在對應網站上可以将其下載下來

基于深度學習的自然語言處理(真IT小叮當深度學習)6

使用NLTK完成簡單的情感分析如下:

#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'IT小叮當' __time__ = '2019-03-25 14:24' #NLTK進行情感分析 #建立情感字典 sentiment_dictionary ={} for line in open('E:\\自然語言處理學習\\情感分析字典AFINN\\AFINN\\AFINN-111.txt'): word,score = line.split('\t') sentiment_dictionary[word] = int(score) sentence_1 ='i love you!' sentence_2 ='i hate you!' import nltk word_list1 = nltk.word_tokenize(sentence_1) word_list2 = nltk.word_tokenize(sentence_2) #遍曆每個句子,把每個詞的情感得分相加,不在情感字典中的詞分數全部置0 s1_score = sum(sentiment_dictionary.get(word,0) for word in word_list1) s2_score = sum(sentiment_dictionary.get(word,0) for word in word_list2) print('我是句子' sentence_1 '的正面情感得分:',s1_score) print('我是句子' sentence_2 '的正面情感得分:',s2_score)

運行結果如下

基于深度學習的自然語言處理(真IT小叮當深度學習)7

可以看到,使用這種方法,我們已經可以對句子進行簡單的情感分析。

但是這種方法存在以下問題:

(1)出現網絡新詞不在字典裡怎麼辦?

(2)出現特殊詞彙怎麼辦?

(3)更深層的語義怎麼理解?

為了解決這些問題,我們可以結合機器學習來進行情感分析。通過自己訓練語料來使用機器學習進行預測。

以簡單的貝葉斯訓練示例,代碼如下:

from nltk.classify import NaiveBayesClassifier from nltk import word_tokenize #簡單手造的訓練集 s1 = 'i am a good boy' s2 = 'i am a handsome boy' s3 = 'he is a bad boy' s4 = 'he is a terrible boy' # #建立詞庫,尋找所有句子中出現的不同的詞 # s = list(set(word_tokenize(s1) word_tokenize(s2) word_tokenize(s3) word_tokenize(s4))) #預處理,對出現的單詞記錄為True def preprocess(sentence): return {word: True for word in sentence.lower().split()} #預處理後得到字典類型,key表示fname對應句子中出現的單詞 #value表示每個文本單詞對應的值 #給訓練集加标簽 training_data = [[preprocess(s1),'pos'], [preprocess(s2),'pos'], [preprocess(s3),'neg'], [preprocess(s4),'neg'] ] #将訓練數據喂給貝葉斯分類器 model = NaiveBayesClassifier.train(training_data) new_s1 = 'i am a good girl' new_s2 = 'she is a terrible girl' #輸出預測結果 print('我在預測 ' new_s1 ' 結果是:',model.classify(preprocess(new_s1))) print('我在預測 ' new_s2 ' 結果是:',model.classify(preprocess(new_s2)))

運行結果為

基于深度學習的自然語言處理(真IT小叮當深度學習)8

2.文本相似度

文本相似度都應用在哪裡呢?舉個簡單的例子,大家在百度中搜索“IT小叮當”時,搜索頁面會會根據我們的關鍵詞,返回一系列的頁面内容。

基于深度學習的自然語言處理(真IT小叮當深度學習)9

這時,網頁會根據我們的搜索結果和關鍵詞的相似度和其它的一些算法,對搜索的結果進行排序。

在NLP中處理句子時,句子的文本特征還可以用詞元素的頻率來進行表示。

基于深度學習的自然語言處理(真IT小叮當深度學習)10

s1表示sentence1,句子1。表中的數值代表了單詞出現的頻率,根據這個我們可以猜測出句子内容如下:

句子1(s1):ha ha ha we are happy

句子2(s2): ha ha we are happy

句子3 (s3): you work

如此以來,句子1便可被向量[1,0,3,0,1,1]進行表示。句子2便可以被向量[1,0,2,0,1,1]表示,句子3可以被向量[0,1,0,1,0,0]表示。

用頻率表示句子的好處是:

(1)所有句子的向量長度都是一樣的,便于後期的機器學習

(2)向量的長度就是處理文本中不同的詞的個數

在句子被向量化後,我們根據餘弦定理便可計算出句子的相似度。

基于深度學習的自然語言處理(真IT小叮當深度學習)11

在NLTK中進行頻率統計

import nltk from nltk import FreqDist #随手自己做的詞庫 corpus = 'i am a good boy ' 'i enjoy my life ' 'i am a beautiful girl' #文本預處理 分詞、停用詞、詞幹提取、詞形歸一 tokens = nltk.word_tokenize(corpus) print('分詞',tokens) #頻率統計 fdist = FreqDist(tokens) #選擇最常用的50個單詞 standard_freq_vector = fdist.most_common(50) #記錄向量長度 size = len(standard_freq_vector) print('選擇最常用的50個詞',standard_freq_vector) #定義函數根據出現的頻率大小記錄下每個單詞的位置 def position_record(v): res = {} counter = 0 for word in v: res[word[0]] = counter counter =1 return res #把标準的單詞位置記錄下來,得到一個位置的對照表 standard_position_dict = position_record(standard_freq_vector) print('得到位置的對照表',standard_position_dict) #構造一個新的測試句子 test_s = 'he is a children' #構建于标準向量同樣大小的零向量 freq_vector = [0] * size #簡單的預處理 進行分詞 test_s_tokens = nltk.word_tokenize(test_s) #測試句子中的每一個單詞,如果在詞庫中出現過,就在标準位置上 1 for word in test_s_tokens: try : freq_vector[standard_position_dict[word]] = 1 except KeyError: #如果是新詞就pass continue print('測試句子的表示',freq_vector)

運行結果如下:

基于深度學習的自然語言處理(真IT小叮當深度學習)12

3.文本分類

文本分類的概念比較廣,例如判斷某句話是否是某人說的,一則新聞是屬于政治、軍事、還是其它的類别等等。

今天,我們就來了解一種常見的文本分類方法TF-IDF

TF : Term Frequency,衡量一個term在文檔中出現的多麼頻繁。

TF(t) =( t出現在文檔中的次數)/(文檔中term的總數)

IDF: Inverse Document Frequency,衡量一個term有多重要。

有些詞在文章中可能出現的次數很多,但卻不一定對文章的語義理解有用。例如‘is’,'the','a'等。

為了平衡這一現象,我們适當的降低這些無用的高頻詞的權重,把有用的詞的權重(weight)提高。

IDF(t)=log_e(文檔總數/含有t的文檔總數)

這樣一來,如果一個詞在很多的文本中出現,那麼它的IDF值會很低,反過來,如果一個詞在比較少的文本中出現,那麼它的IDF值會很高

TF-IDF = TF*IDF

可見TF-IDF,不僅考慮了詞頻,而且考慮了詞對整個文檔的貢獻度(權重)。這要比單純地考慮詞的頻率要好很多,在語義理解方面。

我們可以舉個例子來進一步理解這個公式

基于深度學習的自然語言處理(真IT小叮當深度學習)13

例如:一篇文檔中有100個單詞,其中單詞life出現了5次。

TF(life)= (5/100)=0.05

文檔總共有10M,life出現在其中的1000個文檔中

IDF(life) = log(10000000/1000)=4

TF-IDF(life) = TF(life)*IDF(life)=0.05*4=0.2

NLTK實現TF-IDF

代碼如下

import nltk from nltk.text import TextCollection #将所有文檔放到TextCollection類中,進行自動斷句,統計,計算 corpus = TextCollection(['i am a good boy', 'i am a handsome boy', 'i enjoy my life ']) #計算出一句話中某個詞的TF-IDF print('boy在第一句話中的TF-IDF值',corpus.tf_idf('boy','i am a good boy')) #獲得标準大小的句子來表示句子 #分詞 tokens = nltk.word_tokenize('i am a good boy ' 'i am a handsome boy ' 'i enjoy my life ') #建立标準詞庫 standard_vocab = list(set(tokens)) print('标準詞庫為:',standard_vocab) #新句子 new_sentence = 'she is a beautiful girl' #獲得新句子的TF-IDF向量 new_sentence_vector=[] #遍曆所有vocabulary中的詞 for word in standard_vocab: new_sentence_vector.append(corpus.tf_idf(word,new_sentence)) print('新句子的向量表示',new_sentence_vector)

運行結果如下

基于深度學習的自然語言處理(真IT小叮當深度學習)14

可以看到,經過如上的TF-IDF操作,我們可以得到每個句子的TF-IDF相同長度的向量表示。

之後根據這些向量,我們便可以使用機器學習來為我們愉快地分類了。

基于深度學習的自然語言處理(真IT小叮當深度學習)15

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved