自然言語処理(NLP)入門【テキスト分類を実装してみた】

自然言語処理(NLP)入門【テキスト分類を実装してみた】 AI資格・学習

はじめに

自然言語処理(NLP:Natural Language Processing)は、コンピュータが人間の言葉を理解・処理する技術です。ChatGPTやClaudeなどの生成AIもNLPの技術が土台になっています。

僕がE資格の勉強をする中で「NLPは難しそう」という印象を持っていましたが、実際に実装してみると意外と取っつきやすい部分も多いです。この記事では、テキスト分類の基本的な実装を通じてNLPの入門を解説します。

自然言語処理の基本的な流れ

テキストデータを機械学習で扱うには、文字列を数値に変換するステップが必要です。基本的な流れは次のとおりです。

  1. テキストのクリーニング(不要な文字の除去)
  2. トークナイズ(単語に分割)
  3. ベクトル化(数値に変換)
  4. モデルで学習・予測

日本語テキストの前処理

日本語は英語と違い、単語間にスペースがないため、形態素解析が必要です。

pip install mecab-python3 unidic-lite
import MeCab

mecab = MeCab.Tagger()

def tokenize_japanese(text):
    """日本語テキストを単語リストに分割"""
    node = mecab.parseToNode(text)
    words = []
    while node:
        if node.feature.split(',')[0] not in ['BOS/EOS']:
            words.append(node.surface)
        node = node.next
    return words

text = "機械学習は楽しいです"
print(tokenize_japanese(text))
# ['機械', '学習', 'は', '楽しい', 'です']

TF-IDFベクトル化

TF-IDFは文書中の単語の重要度を数値化する手法です。よく出てくる単語は重要度が低く、珍しい単語は高くなります。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# サンプルデータ(ポジティブ・ネガティブ分類)
texts = [
    "この商品は素晴らしいです",
    "品質がとても良い",
    "最悪の商品でした",
    "全然使えない",
    "とても満足しています",
    "二度と買わない"
]
labels = [1, 1, 0, 0, 1, 0]  # 1=ポジティブ, 0=ネガティブ

# TF-IDFベクトル化
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(texts)

# 学習・予測
clf = LogisticRegression()
clf.fit(X, labels)

# 新しいテキストで予測
new_text = ["この商品は良かったです"]
new_vec = vectorizer.transform(new_text)
print(clf.predict(new_vec))  # [1]

Word2Vecで単語をベクトル化

TF-IDFは単語の出現頻度を見るだけですが、Word2Vecは単語の意味を考慮したベクトルを作ります。「犬」と「猫」は意味が近いため、似たベクトルになります。

from gensim.models import Word2Vec

# 単語リストのリスト
sentences = [
    ['機械', '学習', '楽しい'],
    ['深層', '学習', '難しい'],
    ['Python', '便利']
]

# Word2Vecの学習
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1)

# 単語ベクトルの取得
vector = model.wv['機械']
print(vector.shape)  # (100,)

# 類似単語の検索
similar = model.wv.most_similar('学習')
print(similar)

BERTを使った高精度分類

近年のNLPで主流なのがTransformerベースのモデルです。日本語に対応したBERTモデルを使えば、高精度なテキスト分類が実現できます。

from transformers import BertJapaneseTokenizer, BertForSequenceClassification
import torch

# 日本語BERTのトークナイザー
tokenizer = BertJapaneseTokenizer.from_pretrained(
    'cl-tohoku/bert-base-japanese'
)

# テキストのトークナイズ
text = "機械学習の勉強が楽しいです"
inputs = tokenizer(
    text,
    return_tensors='pt',
    max_length=128,
    truncation=True,
    padding=True
)
print(inputs)

BERTはファインチューニング(事前学習済みモデルを特定タスクに合わせて再学習)することで、少ないデータでも高い精度が出ます。

NLPの主な応用例

  • 感情分析:レビューや口コミのポジネガ判定
  • 文書分類:メールのスパム判定、ニュースカテゴリ分類
  • 固有表現抽出:人名・地名・組織名の抽出
  • 機械翻訳:日英翻訳など
  • 質問応答:ChatGPT・Claudeなどの基盤技術

まとめ

NLPの入門として押さえるべきポイントをまとめます。

  • 日本語テキストは形態素解析(MeCab)で単語に分割する
  • シンプルなタスクはTF-IDF + ロジスティック回帰から始める
  • Word2Vecで単語の意味を考慮したベクトル化が可能
  • 高精度を求めるならBERT系のモデルを使う

NLPは機械学習の中でも応用範囲が広く、ビジネスへの貢献度も高い分野です。まずはTF-IDFを使ったシンプルな分類から試してみてください。

📌 プログラミング・AI学習のおすすめスクール

※本記事にはアフィリエイトリンクが含まれます。

コメント

タイトルとURLをコピーしました