--- title: 'NLP技術之文字表示法 - 1 (NLP 技術*3 + BOW)' tags: NLP --- NLP技術之文字表示法 - 1 (NLP 技術*3 + BOW) === ## Table of Contents [TOC] ## 學習目標 * NLP 技術: * Word segmentation (斷詞) * Part of speech tagging (POS)(詞性標註) * Stemming --- 自然語言處理技術 --- 1. ==Word segmentation (斷詞)== 2. Part of speech tagging (POS)(詞性標註) 3. ==Stemming== 4. Syntactic Parsing (句法分析) 5. Named entity recognition (命名實體識別) 6. Co-reference resolution (共同引用解析) 7. Text categorization (文本分類) ### ==1. Word segmentation (斷詞)== * 中文、日文...等少數語言才需要 * 字與字之間沒有明顯的分界 * 中文的斷詞工具 1. [Jieba](https://github.com/fxsjy/jieba) * 中國研發,支援繁體分詞 2. [CKIP(Sinica)](http://ckipsvr.iis.sinica.edu.tw) * 台灣中研院研發,目前沒有可大量使用的API 3. 其他相關的統計方法 * 較不會被斷詞工具裡的詞彙綁住 ### ==2. POS tagging (詞性標註)== * 透過文本分析,幫每個詞做詞性標註。 * `名詞`(N)、`形容詞`(A)、`動詞`(V)、`URL`(U)... * 標註方式可以有很多種,也會有==不同種類的標註集==。 * 不同的詞性標註工具,有==不同的標註方式==,依據不同的應用領域而定。 * 詞性分的細:詞句更精準、切成更小的單位 * 詞性分的粗:句子重組時,歸類可能會混淆 ![](https://i.imgur.com/NP9pb4H.png) ### ==3. Stemmer== * 將經過變化的字,==簡化到其字根或原型的狀態==。 > Ex: toys -> toy > [Porter Stemmer](http://textanalysisonline.com/nltk-porter-stemmer) * 緣起:因為在不同的語言之下,其變形的方式更多種,甚至比英文更複雜(`-s` `-ed`...),不方便用字典的方式將字詞都記錄下來。 * 希望把變形都集合起來 => 利用 `Stemmer` > 西班牙文:`跑步` 18種變形 > ![](https://i.imgur.com/R1m2oBj.png =160x300) * 優點:字詞頻率的統計更正確! * 缺點:尚未回到原型的狀態。 * Ex: poised -> pois ~~poise~~ ; large -> larg ![](https://i.imgur.com/CwkVk9F.png) * 並非所有資料都需要Porter Stemming。 * Ex: 醫學,因為差了一個`s`意義可能完全不同。 :::info ## ==1 & 2 & 3 為了知道NLP的`字詞如何表示`!== * NLP最常見的表示法: * 向量表示法 (Bag of Words, BOW) ::: --- 向量表示法 (Bag of Words, BOW) --- * 用`字詞向量`來表示文章 * `字詞`:基本概念 -> 描述事物的關鍵字。 * Ex: `Bag` `Word`... * 每一個字詞都是向量中的其中一個維度 * 向量裡的每一個維度,都是一個Bag of Words(一袋的字)。 * `Bag of Words (一袋的字)` 想像成裡面可能有 `一個字`、`兩個字`... ==N-gram== 放進袋子裡。 * 向量中的每一個數值代表:該字詞在向量中的==重要程度== ```gherkin= > 字詞的順序並不重要 # 維度 "我" "欠" "你" "一個人情" -> 4個維度 # 每一個字詞,都只出現一次 "我 欠 你 一個人情" = "你 欠 我 一個人情" [1, 1, 1, 1] = [ 1, 1, 1, 1] > 通常每個向量可能會有多個字詞組成(N-gram features) # N = 1 "我" "欠" "你" "一" "個" "人" "情" # N = 2 "我欠" "欠你" "你一" "一個" "個人" "人情" # N = 3 "我欠你" "欠你一" "你一個" "一個人" "個人情" ``` * 一個句子,可以有多種字詞組合。 * ==這些`字詞組合`,都要`放在向量裡面`嗎?== 並不是! * 我們只需要取`重要的字詞`即可! --- 詞頻以及反向文件頻率(TFIDF) --- * 目的: * ==取出重要的字詞!== * `字詞的重要性`可以 ==從該字詞在`文本中的頻率推估`==。 * 詞頻(Term frequency):`TF(d,t)` * 該字詞在 文件`d` 中出現的 次數`t` * 反向文件頻率(TFIDF):`IDF(t)` * 將常常在大部份的文件都出現過的字詞扣分 * Ex: `的` `是`... :::info ### TFIDF 舉例 ![](https://i.imgur.com/AbOSyxN.png) * `股市` `中國`,何種字詞比較重要? * `中國` 重要! * 因為`中國` 出現次數多,且沒有出現在所有文章中,故足以代表其與其他文件間的差別。 * `股市`: * TF = 4 (3篇文章內,共出現4次) * DF = 3 (出現在3篇文章內) * `中國`: * TF = 5 (3篇文章內,共出現5次) * DF = 2 (出現在2篇文章內) * ==$idf_{i} = { log\left( \frac{N}{df_{i}} \ + 1 \right) }$== ::: ### 詞頻(TF) 正規化 * 目的: * ==確保詞頻不會因為`文本的長短`,而`影響字詞的重要性`。== * 問題: * 當文本數量愈來愈多時,有些代表詞可能會出現非常多次,有些則很少次。若今天有兩種不同的文本,一個文本很長,另一個文本很短。 * 對於長文本而言,其字詞可能會比較重要,因為其字詞出現的次數必定比短文本還要多。 => 我們不希望此情況發生! * `詞頻正規化` 基本原則:讓 $tf_{ij}$ 是介於 0 和 1 之間的數值 * $n_{ij}$ 代表 `詞`$t_{i}$ 出現在 `文件`$d_{j}$ 的次數 * $tf_{ij}$ 是經過正規化後的數字 * $tf_{ij} = {n_{ij} \over NormalizedValue}$ * $NormalizedValue$ 的選擇,與應用領域、資料集有關。$NormalizedValue$ 可以是: 1. 所有字詞出現的總次數 2. 最大的字詞出現次數 3. 其他可以讓 $tf_{ij}$ 介於 0 和 1 之間的數值 * 方法:$BM25^*: tf_{ij} = { n_{ij} \times (k + 1) \over n_{ij} + k }$ -> 效果不錯! ### 反向文件頻率(IDF) * 目的: * ==IDF將常常在`大部分的文件都出現過`的字詞扣分。== * 舉例: * 冠詞或連接詞(the, a, of, to, and...)可能會大量出現在文本中,但在大部分的情況下並不重要。 * ==Stop words(停用詞)== * ==$idf_{i} = { log\left( \frac{N}{df_{i}} \ + 1 \right) }$== * $df_{i}$:`字詞` $t_{i}$ 出現的文件頻率 * 使用 $log$ 來轉換`出現次數非常高的情況` * 線性轉換,希望差距變小。(為了將數值==收斂==,方便比較) * IDF可以被反向分類頻率替換,或是其他的概念 * TFIDF是從`Information Retrieval`的Search Engine概念而來。 * `IDF`的使用時機: * 找文件 * 不希望把`所有`文件找出來,而是希望找出`最重要的幾個文件`。 * `IPF`的使用時機: * 找段落 * 反向段落頻率(IPF)替換之。 * 理論上,TF 和 IDF 應具有相等的效力。 * 若TF的數值極多,IDF的數值極少,效果不好。 --- BOW向量 --- ![](https://i.imgur.com/yRb5F6h.png) * 不需要用到AI的技術,`TDIDF + BOW` 仍然有非常好的表現 * 非常好的比較基準點 --- * ##### tags: `NLP技術之文字表示法 - 1 (NLP 技術*3 + BOW)` * [英文自然語言處理基礎](https://ithelp.ithome.com.tw/articles/10191922)