自然言語処理の基礎

NLP — テキストをコンピュータに理解させる技術
🔰 初心者

自然言語処理って、どういう流れでテキストを処理するんですか?

🎓 上級者

人間が書いた文章をコンピュータが扱えるようにするには、段階的な処理が必要なんだ。まずは全体の流れを見てみよう。

🗂️ 自然言語処理の4つの解析レベル
自然言語処理の4つの解析レベル ① 形態素解析 文を最小単位(形態素)に分割し、品詞を特定する 「吾輩は猫である」→「吾輩/名詞」「は/助詞」「猫/名詞」「で/助動詞」「ある/動詞」 ② 構文解析 形態素間の係り受けを解析し、文の構造(構文木)を明らかにする 「吾輩は」→「猫である」に係る ③ 意味解析 各単語や文全体の意味を解釈する 「bank」は「銀行」か「土手」か?多義語の解消など ④ 文脈解析 前後の文脈を考慮して、文をまたいだ指示語や省略の解決を行う 「太郎は走った。彼は疲れた」→「彼」=「太郎」
解析レベルの覚え方

形態素解析(単語に分ける)→ 構文解析(文の構造を見る)→ 意味解析(意味を理解する)→ 文脈解析(文脈を読む)

下に行くほど高度で難しい。現在のAIでも文脈解析は完全にはできていない。

✂️ 形態素解析
🔰 初心者

形態素解析って具体的に何をするんですか?

🎓 上級者

文章を意味のある最小単位(形態素)に分割して、それぞれの品詞を判定するんだ。英語はスペースで単語が分かれているけど、日本語は分かち書きがないから、この処理が特に重要なんだよ。

形態素解析の例 「すもももももももものうち」 分割 すもも 名詞 助詞 もも 名詞 助詞 もも 名詞 助詞 うち 名詞 日本語は分かち書きがないため、形態素解析が自然言語処理の第一歩になる
🔰 初心者

形態素解析のツールにはどんなものがありますか?

🎓 上級者

日本語の形態素解析には代表的なツールが3つあるよ。G検定ではそれぞれの特徴を押さえておこう。

ツール開発元特徴辞書
MeCab京都大学・NTT高速・高精度。最も広く使われているIPAdic、NEologd等の外部辞書
JUMAN京都大学意味情報も付与できる。研究用途に強い独自辞書(JUMAN辞書)
Janome個人開発(OSS)Pythonのみで動作し導入が簡単。辞書内蔵IPAdic内蔵
G検定のポイント

MeCabが最もよく使われる日本語形態素解析エンジン。名前と「日本語の形態素解析ツール」であることを覚えておこう。

🔤 N-gram
🔰 初心者

N-gramって何ですか?形態素解析とどう違うんですか?

🎓 上級者

N-gramは文を連続するN個の単位で機械的に切り出す手法だよ。形態素解析のように「意味のある単位」で分けるのではなく、文字やテキストを一定の長さで区切るのが特徴なんだ。

N名前例(「自然言語」を文字N-gram)
1ユニグラム「自」「然」「言」「語」
2バイグラム「自然」「然言」「言語」
3トライグラム「自然言」「然言語」

形態素解析

意味のある単位で分割
  • 辞書に基づいて分割
  • 品詞情報も取得できる
  • 未知語(辞書にない語)に弱い
  • 言語依存(日本語用ツールが必要)

N-gram

機械的にN文字ずつ切り出し
  • 辞書不要で単純
  • 未知語にも対応できる
  • 意味のない分割が生まれる
  • 言語に依存しない
🌳 構文解析・意味解析・文脈解析
🔰 初心者

形態素解析の次のステップについて教えてください。

🎓 上級者

形態素解析で単語に分けたあと、さらに深い理解をするために3つの解析があるよ。

構文解析(Syntactic Analysis)

文の構造(どの語がどの語に係るか)を明らかにする

形態素解析で分割した単語間の係り受け関係を解析し、構文木(Parse Tree)を作成する。

例:「大きな犬が走った」
→「大きな」は「犬」に係る(修飾)
→「犬が」は「走った」に係る(主語-述語)

意味解析(Semantic Analysis)

単語や文の意味を解釈する

構文構造がわかっても、意味を正しく理解するには追加の解析が必要。

多義語の解消が代表的な課題。
例:「bank」→「銀行」か「土手」か?文脈から判断する
例:「crane」→「鶴」か「クレーン」か?

文脈解析(Contextual Analysis)

文をまたいだ指示語・省略を解決する

1つの文だけでなく、前後の文脈を考慮して理解する。最も高度な解析レベル。

照応解析:「太郎は走った。は疲れた。」→「彼」=「太郎」
省略の補完:「太郎はカレー、花子はパスタ(を食べた)」→ 省略された述語を補う

🧹 自然言語処理のデータ前処理
🔰 初心者

テキストデータって、そのまま機械学習に使えるんですか?

🎓 上級者

そのままでは使えないよ。テキストをコンピュータが扱える数値に変換する必要があるんだ。その前に、まずデータをきれいにする前処理が大事なんだよ。

テキスト前処理の流れ データクレンジング HTMLタグ除去 記号・ノイズ除去 形態素解析 単語に分割 品詞を判定 ストップワード除去 「は」「の」「です」 等を除去 数値ベクトル化 BoW / TF-IDF で数値に変換 機械学習 分類・クラスタ リング等 テキストは「文字列のまま」では学習できない → 数値ベクトルに変換する必要がある

データクレンジング

テキストからノイズを取り除いてきれいにする処理

生のテキストデータには不要な情報が含まれていることが多い。分析の精度を上げるために事前に除去する。

  • HTMLタグの除去: Webから取得したテキストの<p>、<div>等
  • 記号・特殊文字の除去: 「★」「♪」「!!!」など
  • 大文字→小文字の統一: 英語の場合(Apple → apple)
  • 正規化: 表記ゆれの統一(「AI」→「AI」、「サーバー」→「サーバー」)

ストップワード除去

頻出するが意味のない語を除去する処理

ストップワードとは、文章中に頻繁に出現するが、文の意味を判別する上であまり役に立たない語のこと。

日本語の例: 「は」「の」「が」「を」「に」「です」「ます」
英語の例: 「the」「is」「a」「in」「of」「and」

これらを除去することで、本当に重要な単語だけを残し、分析の精度を向上させる。

🔢 テキストの数値化(BoW・TF-IDF)
🔰 初心者

前処理が終わったら、次はどうするんですか?

🎓 上級者

機械学習はテキストを直接扱えないから、数値ベクトルに変換する必要があるんだ。代表的な方法がBoWTF-IDFだよ。

BoW(Bag of Words / 袋詰め表現)

文書に各単語が何回出現したかを数えてベクトル化する

文章を「単語の袋」とみなし、語順を無視して、各単語の出現回数だけでベクトルを作る。

文書好き嫌い走る
「猫が好き」10100
「犬が嫌い」01010
「猫も犬も好き」11100
BoWの特徴

メリット: シンプルで実装が簡単
デメリット: 語順の情報が失われる(「犬が猫を追う」と「猫が犬を追う」が同じベクトルになる)
また、どの文書にも頻出する語(「する」「ある」等)の影響が大きくなりすぎる → TF-IDFで改善

TF-IDF

「その文書で重要な単語」を重み付けする手法

BoWの出現回数をそのまま使うのではなく、「どれだけ特徴的な単語か」を考慮して重み付けする。

TF(Term Frequency)

単語の出現頻度
  • その文書内での単語の出現回数
  • 多く出現するほどTF値が高い
  • TF単体だと「は」「の」等の頻出語が高くなる

IDF(Inverse Document Frequency)

逆文書頻度
  • 全文書のうち、その単語を含む文書が少ないほどIDF値が高い
  • 多くの文書に出現する語(ストップワード等)のIDF値は低くなる
  • 特定の文書にしか出ない語は重要と判定
TF-IDF = TF × IDF TF(出現頻度) その文書で何回出たか × IDF(逆文書頻度) レアな語ほど値が高い TF-IDF値 重要度スコア TF-IDF が高い語 その文書で頻出+他の文書には少ない → 重要! TF-IDF が低い語 どの文書にも出る(「は」「の」等)→ 重要でない
BoW vs TF-IDF の使い分け

BoW: 単純に出現回数を数える。シンプルだが頻出語の影響が大きい
TF-IDF: BoWに「レアさ」の重み付けを加えたもの。文書の特徴語を見つけるのに有効

どちらも語順の情報は失われる。語順を考慮するにはRNNやTransformer等が必要。

📝 まとめ
G検定で押さえるべきポイント