---
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)...
* 標註方式可以有很多種,也會有==不同種類的標註集==。
* 不同的詞性標註工具,有==不同的標註方式==,依據不同的應用領域而定。
* 詞性分的細:詞句更精準、切成更小的單位
* 詞性分的粗:句子重組時,歸類可能會混淆

### ==3. Stemmer==
* 將經過變化的字,==簡化到其字根或原型的狀態==。
> Ex: toys -> toy
> [Porter Stemmer](http://textanalysisonline.com/nltk-porter-stemmer)
* 緣起:因為在不同的語言之下,其變形的方式更多種,甚至比英文更複雜(`-s` `-ed`...),不方便用字典的方式將字詞都記錄下來。
* 希望把變形都集合起來 => 利用 `Stemmer`
> 西班牙文:`跑步` 18種變形
> 
* 優點:字詞頻率的統計更正確!
* 缺點:尚未回到原型的狀態。
* Ex: poised -> pois ~~poise~~ ; large -> larg

* 並非所有資料都需要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 舉例

* `股市` `中國`,何種字詞比較重要?
* `中國` 重要!
* 因為`中國` 出現次數多,且沒有出現在所有文章中,故足以代表其與其他文件間的差別。
* `股市`:
* 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向量
---

* 不需要用到AI的技術,`TDIDF + BOW` 仍然有非常好的表現
* 非常好的比較基準點
---
* ##### tags: `NLP技術之文字表示法 - 1 (NLP 技術*3 + BOW)`
* [英文自然語言處理基礎](https://ithelp.ithome.com.tw/articles/10191922)