iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
AI & Data

從機器學習到深度學習 - 30天搞懂常見演算法的基礎理論系列 第 24

【Day 24】自然語言處理-BOW & TF-IDF Natural Language Processing-BOW & TF-IDF

  • 分享至 

  • xImage
  •  

今日大綱

  • 自然語言處理步驟
  • Bag of Words( BOW)
  • TF-IDF(Term frequency-Inverse document frequency)

自然語言處理步驟

電腦無法像人一樣馬上理解文字與語音的意思,需要將非結構化的資料向量化,才能夠進一步作訓練。將文字向量化之前需要預先處理文字,首先需要做斷詞,將每個單字切開,英文較方便處理,因為都是以空格隔開,而中文必須套用中文斷詞的套件,如簡體字的jieba、中研院所提供的繁體中文套件CKIP等。以下以英文為範例,進行斷詞。

import nltk
nltk.download('punkt')
text = "You will improve your reading comprehension and develop your vocabulary on a diverse range of international events, celebrations and topics."

words = nltk.word_tokenize(text)
words

https://ithelp.ithome.com.tw/upload/images/20221007/20145688yfXpu6pM6S.png
從結果可看出,英文斷詞就是將每個字以空格切開。

接著,如果是英文字需要先將文字還原,例如walks轉成walk,而中文則不需要這個步驟。
還原方式有分兩種:

  1. Stemming: 依據字根將詞還原,雖然速度快但是正確性較低,例如his會變成hi、daily會變成daili。
  2. Lemmatization: 依據字典規則作詞性還原,雖然速度慢但是準確度較高。

以下為stemming的實作

ps = nltk.porter.PorterStemmer()
ps_text = [ps.stem(word) for word in words
' '.join(ps_text)

https://ithelp.ithome.com.tw/upload/images/20221007/20145688kVFsiehFYb.png

從結果可以看出improve變成improv,vocabulary變成vocabulari,有些字會變得很奇怪。

以下為lemmatization實作

lem = nltk.WordNetLemmatizer()
lem_text = [lem.lemmatize(word) for word in words]
' '.join(lem_text)

https://ithelp.ithome.com.tw/upload/images/20221007/20145688BRZIG6LyVw.png
可以看出僅有複數的單字 events、celebrations、topics這幾個字變成單數形式。

最後,將停用詞以及標點符號去除,在英文裡如the、a都是沒有語意的單字,而中文如那個、這個等,沒有任何實質意義的詞。

import string 
nltk.download('stopwords')
stopword_list = set(nltk.corpus.stopwords.words('english')+ list(string.punctuation))
filter_tokens = [token for token in words if token not in stopword_list]
filter_text = ' '.join(filter_tokens)
filter_tokens

https://ithelp.ithome.com.tw/upload/images/20221007/20145688kqylVfL5NV.png

Bag of Words (BOW)

詞袋(BOW)計算每個單字出現的次數,由最常出現的單字猜測大意。

## BOW
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

corpus = ["Today is a good day.",
         "Yesterday was a cloudy day.",
         "Hope tommrow will be a good day."]

vectorizer = CountVectorizer()
x = vectorizer.fit_transform(corpus)

word = vectorizer.get_feature_names()
print("Vocabulary: \n", word)
print("BOW: \n", x.toarray())

get_feature_names()儲存詞袋裡有哪些詞彙,將轉換過後的詞會變成array時,輸出每個句子對應出現的詞彙。
https://ithelp.ithome.com.tw/upload/images/20221007/201456885LCX0P9srU.png
第一個句子Today is a good day. 在詞典裡day在第三個位置,因此第2個index數值為1,以此類推。

TF-IDF(Term frequency-Inverse document frequency)

Tf就是詞會出現的次數,IDF就是逆向檔案頻率,這兩個數字相成即為TF-IDF,如果一個詞出現在第n個檔案很高,但是出現在所有檔案的次數也很高的話,其代表性降低,TF-IDF值就會很小,例如the、a,就會常出現在文件裡。反之,出現在所有檔案的次數低的話,這個詞就比較重要。
詞頻(Term frequency)
https://ithelp.ithome.com.tw/upload/images/20221007/20145688kmRdaPDaD9.png

逆向檔案頻率(Inverse document frequency)
https://ithelp.ithome.com.tw/upload/images/20221007/20145688jenzQpFfFR.png

## TF-IDF
import numpy as np
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(x)
print("TF-IDF: \n", np.around(tfidf.toarray(),2))

https://ithelp.ithome.com.tw/upload/images/20221007/20145688G93V2yQY1J.png
TF-IDF所產生的值介於0-1之間,數值越大代表重要性越高。

謝謝您的瀏覽,程式碼已上傳Github
/images/emoticon/emoticon41.gif


上一篇
【Day 23】卷積神經網路 (Convolutional neural network)
下一篇
【Day 25】循環神經網路 Recurrent neural network
系列文
從機器學習到深度學習 - 30天搞懂常見演算法的基礎理論30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言