---
title: Text Classification整理
---
###### tags: `研究所`
[TOC]
## 備註
Messaging passing mechanism = MPM
Graph Convolutional Network = GCN
Pointwise Mutual Information = PMI
Term Frequency-Inverse Document Frequency = TF-IDF
# 摘要
本篇將以==單標籤==和==多標籤==文本分類的類別整理各個模型的應用
# Single Label Text Classification
單一標籤文本資料集
1. Movie Review
2. IMDB
3. Ohsumed
4. 20 news groups
5. R8 and R52 from Reuters dataset
## Graph Convolutional Networks for Text Classification

作者建立word-document的異質圖(整個大圖),之後透過GCN來捲積 ${L^{(1)} = p(\tilde{A}XW_{0})}$
### 特色
1. 透過${L^{(1)} = p(\tilde{A}XW_{0})}$這個公式來捲積
* 代表$W_0$可以決定節點資訊的傳輸量應要多大以及圖構學習
3. 文字向量用one-hot來表示每個字詞對應的位置
4. word-word之間透過sliding window在每個document中建立整個co-occurencence關係
5. document-word edge 用 IDF來建立
6. 輸出層將節點資訊整合到target document node後丟入softmax
$$
A_{ij} =
\begin{cases}
PMI(i,j) & \text{i,j are words, PMI(i,j)>0} \\
TF-IDF_{ij} & \text{i is document, j is word} \\
1 & i=j \\
0 & \text{otherwise}
\end{cases}
-(1)
$$
### 備註
根據式(1)推知,作者強制將應用在同質圖上的GCN強行去吻合異質圖上。如果真是這樣為何不拆分成兩個階段來進行捲機?
github : https://github.com/yao8839836/text_gcn
## Text Level Graph Neural Network for Text Classification

作者首先針對dataset建立一個corpus graph(裡面包含了所有字詞),之後透過MPM來整合周圍資訊的節點,裡面有個重要的參數p來決定字詞可以觸及的範圍。
比如 This is a book 如果 p = 1則 this只能與is有edge的關係;如果 p = 2則 this則能與is跟a有edge的關係。

上式為收集周圍n個節點中的p個節點資訊之後在每個dimension中找出最大的值,之後透過(4)來決定資訊的傳輸量。 e_an則是在訓練過程中讓模型來決定。
### 特色
1. 建立整個corpus graph
2. 根據指定文本所含有的字詞做捲積
3. 讓machine訓練決定edge的權重以及節點資訊傳輸量
4. 輸出層部分將文本內所包含的字詞向量做加總後丟入softmax
## Every Document Owns Its Structure: Inductive Text Classification via Graph Neural Networks
作者認為過去的方法如TextGCN將文本分類的問題轉換成節點分類以及Huang et al.改進了TextGCN引入的Messaging passing mechanism架構並減少的記憶體占用的問題。這兩個方法固然是tranductive的方法。

作者針對每個document建立成一張獨立的graph後透過GGNN的架構來傳遞節點之間的資訊,最後Readout function引入Attention layer後加總後當作Graph representaion來分類。
### 特色
1. 每個document建立成一個獨立的Graph
2. 透過GRU unit配合GCN的方式來做節點資訊的傳遞
3. Readout部分透過Soft Attention來計算每個word的貢獻度應要多高
4. 輸出層整合文本中所有文字的資訊加上maxpooling後進到softmax
### 變體
1. TextING : 原本的TextING架構
2. TextING-M : 建立一張大圖 sample出小圖
### 備註
1. Adjacency Matrix大小不一怎麼辦?透過padding來講matrix拓展到同樣大小
```python=
def preprocess_adj(adj): # 輸入為一整個datset大小的adj matrix
"""Preprocessing of adjacency matrix for simple GCN model and conversion to tuple representation."""
max_length = max([a.shape[0] for a in adj]) #找最大的adj的長度
mask = np.zeros((adj.shape[0], max_length, 1)) # mask for padding
for i in tqdm(range(adj.shape[0])):
adj_normalized = normalize_adj(adj[i]) # no self-loop
pad = max_length - adj_normalized.shape[0] # padding for each epoch
adj_normalized = np.pad(adj_normalized, ((0,pad),(0,pad)), mode='constant')
mask[i,:adj[i].shape[0],:] = 1.
adj[i] = adj_normalized
return np.array(list(adj)), mask # coo_to_tuple(sparse.COO(np.array(list(adj)))), mask
```
2. Soft Attention公式 : $h_{v} = \sigma(f_{1}(h^t_v)) \odot tanh(f_2(h^t_v))$
github : https://github.com/CRIPAC-DIG/TextING
## PTE: Predictive Text Embedding through Large-scale Heterogeneous Text Networks
作者提出過去的方法例如skip-gram的方法可以有效的來學習word embedding,而在往後的方法如用CNN做end-to-end的方法雖然有效但無法拓展到其他領域完成其他領域的任務,作者認為CNN架構有幾項需要改進地方而提出PTE架構。

### 特色
1. PTE架構為一種半監督式學習方法,其目的在於透過Graph結構產出較好的word embedding
2. 建立三種圖分別是 word-word、word-document以及word-label
* word-word $G_{ww} =(V,E_{ww})$ 其中$V$為詞彙庫的字詞,$E_{ww}$為word間的edge set而$w_{ij}$為兩個文字間在固定窗口大小共同出現的次數。
* word-document $G_{wd}=(V\cup D,E_{wd})$ 其中$D$為document set,$E_{wd}$則為word跟document之間的edge set其權重$w_{ij}$則為document中word出現的次數。
* word-label $G_{wl}=(V\cup L,E_{wl})$其中$L$為label set,$E_{wl}$則為word跟label之間的edge set其權重$w_{ij}=\sum_{d:l_{d=j}}n_{di}$其中$n_{di}$為word $v_i$在document $d$的term-frequency而 $l_d$為document $d$所對應的標籤
3. 網路架構啟發於LINE模型他是一種同質圖的模型,因為作者建立為異質圖所以需要修改一下
4. 給定一個Bipartite Graph $G=(V_A \cup V_B, E)$而$V_A$跟$V_B$為兩個Disjoint的節點集合,$E$為這兩個集合之間的edge並定義$v_i \in V_A$ and $v_j \in V_B$所定義的條件機率公式如下
* $$p(v_i|v_j)=\frac{\exp(\overrightarrow{v}_j^T \cdot \overrightarrow{v}_j)}{\sum\nolimits_{i'\in A}\exp(\overrightarrow{v}_{i'}^T \cdot \overrightarrow{v}_j)}-(1)$$
這個公式可以理解為計算兩節點之間在向量空間的距離,而期望鄰近節點之間的特徵越近越好反之越遠越好並藉此讓每個文字在embedding space中有著對應的位置。
5. 目標函式
* $$O=\sum_{j \in B}\lambda_jd(\hat {p}(\cdot|v_j),p(\cdot|v_j))-(2)$$
* $d(\cdot,\cdot)$為KL-divergence
* $\hat p(\cdot|v_j)$為經驗公式被定義為$\hat p(\cdot|v_j)=\frac{w_{ij}}{deg_j}$
* 我們需要最小化這個公式而代表著我希望公式(1)的輸出分布與$\hat p(\cdot|v_j)$越相似越好
* $$O=-\sum_{(i,j) \in E}w_{ij}\log p(v_j|v_i)-(3)$$
* 經過轉換(2)可以得到(3)所以只需要最小化式(3)即可
* 這邊只列出word-word的情況但事實上有三個需要一起被優化
### 備註
作者訓練方面提供兩個策略
1. Joint training
2. Pre-training + Fine-tuning

## Tensor Graph Convolutional Networks for Text Classification
作者認為過去GCN用在Text Classification的方法應該可以加入語意資訊以及上下文資訊。下圖為主要架構建圖分別用三種不同演算法來建立word-word edge關係兩種不同的propagation來整合資訊。

### 特色
1. 作者套用GCN原始模型根據GCN原始公式會決定節點資訊的傳遞量
2. 建圖方式word-document一種edge跟word-word三種edge計算方式
* 使用TF-IDF來計算word-document edge的權重
* Semantic-based graph : 給定一個任務訓練LSTM (e.g. Text classification) 利用以訓練的模型針對每個document做encode,計算document中的所有字詞向量的cosine similarity值,如果該值有超過預先定義的$\rho_{sem}$這代表有semantic關係
* $d_{semantic}(w_i,w_j) \frac {\#N_{semantic(w_i,w_j)}}{\#N_{total}(w_i,w_j)}$
* $\#N_{total}(w_i,w_j)$ 為所有document有共同出現的總數
* $\#N_{semantic(w_i,w_j)}$ 為所有document中cos值大於$\rho_{semantic}的數量$
* Syntactic-based graph : 利用史丹福大學所提供的CoreNLP來解析document中各個文字是否有Syntactic關係並計算數量而計算方法如semantic的公式相似(在此不多加列出)
* Sequential-based graph : 計算兩文字之間的共同出現的關係,演算法為在fixed-size sliding window下共同出現的次數來得出兩文字之間的edge與TextGCN的word-word建立方式一致。
* $d_{sequential}(w_i,w_j)=\log \frac{p(w_i,w_j)}{p(w_i)p(w_j)}$
* $p(w_i,w_j)$代表兩文字共同出現的機率
* $p(w_i,w_j)=\frac{\#N_{co-occurrence}(w_i,w_j)}{\#N_{windows}}$
* $\#N_{windows}$為window的總數
* $\#N_{co-occurrence}(w_i,w_j)$為兩文字共同出現的數量
3. 作者先後在提出了兩個模型架構來解決整合不同面向的graph資訊
* Preliminary + GCN透過一個pooling來整合A,其公式為$pooling(A) = pooling(A_1,A_2,...,A_r)$而最值觀能想到的就是max pooling以及mean pooling兩種運算但這無法被直接使用,因為這兩個運算會使得所整合出來的A異質性太高。所以改用$A_{merge} = pooling(A) =\sum_{i=1}^{r}W^i_{edge} \odot A_i$
* $W^i_{edge}$為element-wise matrix其大小等於$A_i$
* $\odot$為element-wise dot product(matrix dot product)
* TensorGCN 利用GCN propagation傳遞節點資訊的特性來解這樣的問題。將propagation細分成intra跟inter兩種而流程為$H^{(l)} \xrightarrow{f_{intra}}H^{(l)}_{intra} \xrightarrow{f_{inter}} H^{(l+1)}$
* Intra-graph propagation 定義了圖內部的捲積,公式為$$H^{(l)}_{intra}(i,:,:)=\sigma (\hat A(i,:,:)H^{(l)}(i,:,:)W^{(l,i)}_{intra})$$
* $\hat A$為標準化後的$A$
* Inter-graph propagation 定義了虛擬documet-documet的虛擬圖在同一個文本中舉例來說有三種不同graph則document之間會建立為3 by 3的$A$,其公式為$$H^{(l+1)}(:,j,:)=\sigma (A^+(:,:,j)H^{(l)}_{intra}(:,j,:)W^{(l,j)}_{inter}$$
* $A^+(:,:,j)$於上面的公式不同既沒有標準化計算以及加入self-loop 只是單純的將edge weight設為1
### 備註
1. 在重讀的過程中有一個疑問就是為什麼不同面向的graph不共享同一個GCN的$W$來去學習,後來在paper的備註中有提到作者在實驗中有試過但效果並不怎麼樣。下圖為作者的文字。

## Graph Fusion Network for Text Classification
作者認為過去的方法幾乎都是transductive的方法,所以嘗試提出了一個inductive的方法來解這個問題。
### Overview

### Fusion Module

作者在分別建立四張不同的Corpus-level graph 1. 使用Adapt Gate來學習Graph Structure, 2.使用MPM來整合周圍節點資訊 3. 利用fusion機制來整合不同面向的資訊
### 特色
1. 以多個面向來計算edge的權重
* $P_{ml}(w_j \mid w_i) = \frac{\#(w_i,w_j)}{\#(w_i)}$
* $PPMI(w_i,w_j) =\log \frac{\#(w_i,w_j)\cdot {{|D|}}}{\#(w_i)\cdot\#(w_j)}$
* $\cos (x_i,x_j) = \frac{x_i\cdot x_j}{|x_i|\cdot |x_j|}$
* $euc(x_i,x_j)=||x_i - x_j||_2$
2. 使用adapt機制來做graph learning 就是讓模型去調整edge的權重
3. MPM機制來傳遞每個節點,之後將document所包含的字詞做Readout(分別做四個圖)
4. 透過Convolution layer來整合不同面向的資訊
## HeteGCN: Heterogeneous Graph Convolutional Networks for Text Classification
作者的想法啟發於TextGCN跟PTE兩個架構的成功。TextGCN本質上是PTE加上Graph Convolutional Network學習word跟document在graph中的關係,最後學出來的document representation丟入clssifier做分類。為了解釋TextGCN的限制這裡會定義一些符號,模型的參數其實依賴於word跟document的數量,所以當節點總數相當大時TextGCN無法會適用於大型應用。

### 特色
1. 作者將TextGCN拆解成四個不同的資訊傳遞方向,分別是$F$、$X$跟$N$
* $F$代表word-word之間的傳遞方向
* $X$代表document-word之間的傳遞方向 ($X^T$為相反方向)
* $N$代表document-document之間的傳遞方向
2. 作者發現model size其實會影響到結果
* 訓練時間跟調整大量的超參數設定會變得困難
* 當label數量為少數時通常會使用較少參數來達到較好的泛化能力
3. 而是事實上可以將$F$、$X$跟$N$拆分成資訊傳遞的路徑,如HETE_GCN(F-X)代表先做word-to-word資訊傳遞後在做word-to-document資訊傳遞。
* 最後都是要捲到document node來當作node representaion
4. $F$計算方式是使用PMI
5. $X$計算方式則是使用TF-IDF
### 備註
雖然作者有說到他的inductive learning方式是參照Predictive Text Embedding的方式來做,換句話說就是在給定一個任務訓練GCN模型,而在過程中訓練所得出來的word-embedding會存在每個layer,在inference階段把embedding拿出來加以使用。