自然言語処理におけるトークン
定義
自然言語処理においてコーパスcorpusあるいは言語資料とは、特定の目的のために収集/整備された自然言語テキストデータの集合をいう。
テキストを構成する最小の単位、例えばハングルの音節、ローマ字、数字、句読点、空白などを文字characterと呼ぶことにする。我々が扱う文字全体を集めた有限集合を$\Sigma$とおき、文字集合character setと呼ぶことにする。すなわち一つの文字は$a \in \Sigma$である。文字を順に並べた有限数列あるいは順序組を文字列stringという。文字列$s$は、各$a_{i} \in \Sigma$である文字の数列として次のように書く。
$$ s = (a_{1}, a_{2}, \dots, a_{N}), \qquad a_{i} \in \Sigma $$
このとき$N$を文字列の長さといい、$|s| = N$と表記する。文字列を特定の基準に従って先頭から連続した断片に分割し、文字列の有限数列へ送る関数をトークナイザーtokenizerという。トークナイザー$\tau$は文字列$s$を次のように写す。
$$ \tau : s = (a_{1}, \dots, a_{N}) \mapsto (\mathbf{t}_{1}, \mathbf{t}_{2}, \dots, \mathbf{t}_{M}) $$
ここで各$\mathbf{t}_{j}$は$s$の連続した部分文字列であり、順につなぎ合わせると再び$s$になる。すなわち、切断点$0 = k_{0} < k_{1} < \cdots < k_{M} = N$が存在して次を満たす。
$$ \mathbf{t}_{j} = (a_{k_{j-1}+1}, \dots, a_{k_{j}}), \qquad \sum_{j=1}^{M} |\mathbf{t}_{j}| = N $$
こうして得られたトークン列の各$\mathbf{t}_{j}$をトークンtokenという。そして文字列にトークナイザーを適用してトークン列$(\mathbf{t}_{1}, \dots, \mathbf{t}_{M})$を得ることをトークン化tokenizationという。
説明1
トークン化は自然言語処理において非常に重要なデータ前処理の過程である。上の定義はトークン化を数式的に表すための形式的な定義にすぎず、簡単に文字列を分割することだと理解すればよい。
さまざまなトークン化を、韓国語の文「그 학생은 도서관에서 책을 빌렸다.」と英語の文「The student borrowed a book from the library.」を例に見てみよう。
単語トークン化
最も単純に、空白を基準に文字列を分けることを単語トークン化word tokenizationという。空白を基準に分けると、先の二つの例文はそれぞれ次のようにトークン化される。このように最も単純な単語トークン化では句読点を切り離さないため、ピリオドが前の単語にそのまま付く。
- 韓国語:
그학생은도서관에서책을빌렸다. - 英語:
Thestudentborrowedabookfromthelibrary.
韓国語は助詞が付くため、학생은、학생이、학생을などが互いに異なるトークンとして認識される。また빌렸다.、빌렸다?、빌렸다!なども異なるトークンとして認識される。もし도서관が도사관と誤字になっている文があれば、この二つも異なるトークンとして認識される。そのため単語トークン化は韓国語の接辞、誤字や分かち書きの誤りなどに弱い。
文字トークン化
文字単位でトークン化することを文字トークン化character tokenizationという。文字単位で分けると、先の二つの例文はそれぞれ次のようにトークン化される。空白やピリオドのような句読点も一つのトークンである。
- 韓国語:
그학생은도서관에서책을빌렸다. - 英語:
Thestudent… (以下省略)
英語は各文字が一つのトークンであるため、トークン列が非常に長くなる。このように文字トークン化は文字集合、すなわち語彙のサイズが非常に小さく、未登録語や誤字にも強いが、トークン一つが単語レベルの意味を持てず、シーケンスが長くなるという欠点がある。韓国語なら音節を子音と母音、すなわち字母にさらに分解して、もう一段階細分化することもできる。
形態素トークン化
意味を持つ最小単位である形態素morphemeを基準に分けることを形態素トークン化morpheme tokenizationという。形態素を基準に分けると、先の二つの例文はそれぞれ次のようにトークン化される。
- 韓国語:
그학생은도서관에서책을빌리었다. - 英語:
Thestudentborrowedabookfromthelibrary.
助詞と語尾が別々に切り出されるため、単語トークン化で指摘した問題、すなわち학생은、학생이、학생을がすべて異なるトークンになっていた問題が、학생という一つの形態素と助詞に分割されることで緩和される。助詞と語尾が発達した膠着語である韓国語には特によく合う方式である。ただし形態素トークン化には言語ごとの形態素解析器morphological analyzerが必要である。一方、韓国語の形態素解析は解析器によって境界が分かれることがある。
特殊トークン
自然言語処理では入力トークン列の長さがまちまちであるため、データが始まる地点と終わる地点を区別する特殊なトークンを用いる。このように文の境界を示したり、未登録語を置き換えたり、複数の文の長さを揃えたりするなど、テキストそのものではなく処理を助けるために人為的に付け加えるトークンを特殊トークンspecial tokenという。よく使われる特殊トークンは次の通りである。
| 種類 | 説明 |
|---|---|
<SOS> | start of sentenceの略で、入力または出力トークン列の始まりを表す。<BOS>(beginning of sentence)ともいう。 |
<EOS> | end of sentenceの略で、入力または出力トークン列の終わりを表す。 |
<UNK> | unknownの略で、あらかじめ定めた語彙にない単語を置き換えるトークンである。 |
<PAD> | paddingの略で、複数のトークン列の長さを同じに揃えるために、短い方の後ろに詰めるトークンである。 |
名前には文(sentence)が入っているが、<SOS>と<EOS>が実際に示すのは一つの文ではなく、モデルに入り、モデルから出る入力・出力トークン列全体の始まりと終わりである。一つの入力や出力が複数の文からなっていても、例えば入力が三つの文で出力が四つの文であっても、各トークン列の先頭と末尾に一度ずつだけ付く。
先の二つの例文を単語トークン化した後、各トークン列の前後に<SOS>と<EOS>を付け、二つのトークン列の長さを揃えるために短い方を<PAD>で埋めると次のようになる。
- 韓国語:
<SOS>그학생은도서관에서책을빌렸다.<EOS><PAD><PAD><PAD> - 英語:
<SOS>Thestudentborrowedabookfromthelibrary.<EOS>
윤대희·김동화·송종민·진현두. 자연어 처리와 컴퓨터비전 심층학습, p230-263. ↩︎
