「言葉」を操るエンジニアになろう! 自然言語処理(NLP)の基本とPython実装を、実体験を交えて解説

目次

「日本語ってマジでめんどくさい…」とヘトヘトになった日の話

20年前、まだ駆け出しだったころ、あるECサイトの商品検索システムを作ってたんだ。
お客さんの要望はシンプル。「『デジカメ』って検索されたら、デジタルカメラもヒットするようにして!」。

当時は今みたいに便利なライブラリなんてなくて(あったのかもだけど、若造の私には情報が届かなかった)。
そこで、MySQLの LIKE 検索と、ひたすら手打ちした「類義語辞書」で何とかしようとしたんだ。

「デジカメ」=「デジタルカメラ」
「スマホ」=「スマートフォン」
「iPhone」=「アイフォーン」…

毎日毎日、辞書登録だよ。でも、ユーザーの検索ワードは想像をはるかに超えてくる。「写メ」とか「パシャリ」とか、商品名じゃない言葉で検索してくるんだ。「ヒットしません」ってログ見るたびに、マジで胃が痛かった。

「日本語、マジ勘弁…」

夜中のオフィスで本気でそう思ったね。スペースがない日本語って、マジでコンピュータ泣かせなんだよ。

でも、あれから20年。時代は変わった。
Pythonと優秀なライブラリのおかげで、昔の私が1ヶ月かかってもできなかったことが、今なら数行のコードでできちゃうんだ。
「自然言語処理(NLP)」は、もう研究者だけのものじゃない。Webエンジニアが、明日の仕事でサクッと稼ぐための「使える武器」だよ。

この記事は、昔の私みたいに「テキストデータ、マジ無理…」ってなった人や、「AI案件に興味あるけど、何からやればいいかわかんない」って人に向けて、NLPの基本からPythonでの実装まで、現場のリアルな話を混ぜながら説明していくよ。

難しい数式は使わない。代わりに、現場で使えるコードと、地雷を踏まないためのコツを覚えて帰ってほしい。

深夜のオフィスで辞書登録にてんてこ舞い。大量の類義語リストを見て、心が折れかけている若いエンジニアのイラスト

なんで今、NLPが副業で最強の武器になるのか?データはあるけど、「読める人」がいないんだよね

最近、副業の相談に乗ってて感じるのが、「テキストデータの分析」についての相談が多いってこと。
企業はデータを持ってる。売上データとかの数字データは、ExcelとかBIツールで分析してる。でも、実はスルーされてるお宝がある。

それが「テキストデータ」なんだ。

  • お客さんからの問い合わせメール
  • ECサイトの商品レビュー
  • SNSでの製品に関するコメント
  • 日報とか営業メモ

これらは「非構造化データ」と呼ばれてて、そのままじゃ集計もなにもできない。社長とか担当者が、大量のデータをひたすら目で見て、「なんか評判悪そう」みたいな雰囲気で判断してるのが現状なんだ。

そこに、NLPができるエンジニアが入るとどうなるか?
「今月は『使いにくい』って意見が先月より20%増えてます。原因を見てみると『ログイン画面』って単語と一緒に出てくることが多いです」
みたいに、具体的な根拠を出せる。

これだけで、お客さんはめっちゃ喜ぶ。マジで。「魔法使いだ!」みたいな扱いを受けることもあるよ。
Web制作とかアプリ開発はライバルが多いけど、「テキストデータからビジネスのヒントを見つけられるエンジニア」は、まだまだ全然足りてない。だから、稼げるんだ。

生成AIの時代だからこそ「基本」が大事

「ChatGPTがあるから、NLPの勉強なんていらないんじゃない?」
って思うかもしれない。確かに、APIを使えば、高度な分析はできる。でも、仕事で使うってなると、そう簡単じゃないんだ。

  • 秘密のデータをAPIに送れない場合は?
  • APIの利用料金が高すぎて予算オーバーしたら?
  • LLM(大規模言語モデル)がウソっぽいことを言ってきたら、どうやってチェックする?

基本的なNLPの技術(形態素解析とかTF-IDFとか)を知ってれば、タダで自分のパソコンで分析したり、LLMを使う前にデータを整理したりできる。
「AIを使う側」になるためにも、「言葉を計算する仕組み」を知っておくことは、エンジニアとしての寿命を伸ばすことになるよ。

NLPの基本:コンピュータに言葉を教えるってどんな感じ?

コンピュータは、残念ながら「言葉」がわからない。わかるのは「数字」だけ。
だから、NLPの最初の一歩は、「言葉を数字に変換すること」になる。

この変換のことを、ちょっとカッコつけて「ベクトル化」とか「分散表現」って言うけど、簡単に言うと「言葉の翻訳」みたいなもんだと思えばOK。

日本語を扱う場合、英語と違ってめんどくさい問題がある。「分かち書き」ってやつだ。

英語:I have a pen. (スペースで単語が分かれてる)
日本語:私はペンを持っています。 (どこで分けるの?)

この「どこで分けるんだよ!」を解決するのが、「形態素解析」ってやつ。
まずはここからPythonで攻略していこう。

実践ステップ1:日本語をバラバラにしてみよう(形態素解析)

Pythonで形態素解析をするなら、いくつか選択肢がある。

  • MeCab(メカブ): 古くからある定番。マジ速い。みんな使ってる。
  • Janome(ジャノメ): インストールが簡単。Pythonだけで動く。ちょっと遅い。
  • Sudachi(スダチ): 最近人気が出てきた。新しい言葉に強い。
  • GiNZA(ギンザ): 企業向け。spaCyっていうのを使ってて使いやすい。

ここでは、初心者でも始めやすくて、仕事でもよく使う GiNZA と、基本の MeCab の使い方を見ていこう。

Google Colabの準備

環境構築でつまづかないように、Google Colabを使うのがおすすめだよ。

# GiNZAをインストール(これだけで必要なものも全部入る)
!pip install -U ginza ja_ginza

GiNZAで文章を分解!

import spacy

# モデルを読み込む
nlp = spacy.load('ja_ginza')

text = エンジニアの副業で月50万円稼ぐのは夢じゃない。
doc = nlp(text)

for token in doc:
    print(f{token.text} \t {token.pos_} \t {token.tag_})

実行結果:

エンジニア      NOUN    名詞-普通名詞-一般
の      ADP     助詞-格助詞
副業      NOUN    名詞-普通名詞-一般
で      ADP     助詞-格助詞
月      NOUN    名詞-普通名詞-助数詞可能
50      NUM     名詞-数詞
万      NUM     名詞-数詞
円      NOUN    名詞-普通名詞-助数詞可能
稼ぐ      VERB    動詞-一般
の      SCONJ   助詞-準体助詞
は      ADP     助詞-係助詞
夢      NOUN    名詞-普通名詞-一般
じゃ      AUX     助動詞
ない      AUX     助動詞
。      PUNCT   補助記号-句点

見てみて。「エンジニア」とか「副業」とか「稼ぐ」みたいな大事な単語がちゃんと切り出されてるよね。
品詞(名詞とか動詞とか)も教えてくれるから、「名詞だけ抜き出して分析したい!」って時にも使えるんだ。

これがNLPの基本、「分かち書き」。これができないと何も始まらないよ。

現実世界の「前処理」について

ここで、仕事でよくある話をしておくね。
さっきみたいなキレイな文章ならいいんだけど、実際のデータ(SNSとか口コミ)はもっと汚いことが多いんだ。

「マジwヤバいww ???? #エンジニア」

これをそのまま解析すると、絵文字とか記号が邪魔になる。
だから、形態素解析の前に「クリーニング(前処理)」っていう、地味な作業が必要になるんだ。

  • URLの削除(https://...
  • 絵文字・記号の削除
  • 全角・半角を統一
  • 「w」みたいなネットスラングをどうするか決める

私の経験だと、NLPの仕事の7割はこの前処理と辞書作りで終わる。「最新AIでスゴイ分析!」みたいなのは、ほんの一瞬。あとはひたすら、正規表現(Regex)と戦って、ゴミを取り除く作業。
でも、ここをちゃんとやらないと、分析結果が全部ゴミになっちゃうんだよね(Garbage In, Garbage Out)。

カフェでPCに向かい、汚いテキストデータの前処理コードを書いて、うんうん唸っているエンジニアのイラスト

実践ステップ2:単語を「数字」にしてみよう(BoWとTF-IDF)

文章をバラバラにできたら、次は「数値化」だ。
ここでは、定番だけど今でもよく使う2つの方法を紹介するよ。

1. Bag of Words (BoW)

「単語が入った袋」って名前の通り、「どの単語が何回出てきたか」を数えるだけ。順番は気にしない。

  • 文A: 「私は 猫 が 好き」
  • 文B: 「私は 犬 が 好き」

| 単語 | 私 | は | 猫 | 犬 | が | 好き |
| :--- | :-: | :-: | :-: | :-: | :-: | :-: |
| 文A | 1 | 1 | 1 | 0 | 1 | 1 |
| 文B | 1 | 1 | 0 | 1 | 1 | 1 |

これで、文Aは [1, 1, 1, 0, 1, 1] っていう数字の列になった。
シンプルでわかりやすい。でも、欠点がある。「私」とか「は」みたいな、どの文章にも出てくる単語(ストップワード)の影響が大きくなっちゃうんだ。

2. TF-IDF(レアキャラを探せ!)

そこで出てくるのが TF-IDF だ。
これは「その文章によく出てくる単語(TF)」で、かつ「他の文章にはあんまり出てこない珍しい単語(IDF)」を重要視する計算方法。

これを使うと、「私」「は」「です」みたいな普通の単語の重要度を下げて、「自然言語処理」とか「Python」みたいな特徴的な単語をピックアップできるんだ。

Pythonの機械学習ライブラリ scikit-learn を使えば、すぐに計算できる。

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

# サンプルの文章
docs = [
    Pythonで自然言語処理を学ぶ,
    自然言語処理は面白い,
    Pythonはプログラミング言語です
]

# 分かち書き関数(簡単に作ったバージョン)
def tokenize(text):
    return [token.text for token in nlp(text)]

# TF-IDFを計算
vectorizer = TfidfVectorizer(tokenizer=tokenize)
X = vectorizer.fit_transform(docs)

# 結果を見やすく表示
df = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names_out())
print(df)

これで、文章ごとの「単語の重要度」が数字になった。
この数字を使えば、「似てる文章を探す(類似度計算)」とか「文章の種類分け(分類)」ができるようになる。

昔受けた案件で、「何万件ものニュース記事を自動で種類分けする」っていうのがあったんだけど、このTF-IDFと簡単な分類器(ロジスティック回帰とか)だけで、90%以上の精度が出たんだ。
最新の重たいモデルを使わなくても、昔からある技術で十分戦えることは多いんだよね。

ホワイトボードにTF-IDFの図を書いて、お客さんに熱心に説明している講師のイラスト

実践ステップ3:言葉の意味を理解させてみよう(Word2Vec)

BoWとかTF-IDFは便利だけど、「言葉の意味」まではわかってないんだ。
例えば、「王様」と「皇帝」は違う言葉だけど、意味は近いよね?でも、これまでのやり方だと「全然違う単語」として扱われちゃう。

そこで登場したのが Word2Vec だ。
これは「同じような文章で使われる単語は、似たような意味を持つはず」っていう考え方に基づいている。

有名な計算式がある。
「王様」 - 「男」 + 「女」 = 「女王」

単語をベクトル空間の座標として表すことで、単語同士の足し算とか引き算ができるようになったんだ。

Pythonでは Gensim っていうライブラリを使うのが定番。

from gensim.models import word2vec

# ※実際には大量の分かち書きされたテキストデータが必要
# model = word2vec.Word2Vec(sentences, vector_size=100, window=5, min_count=1)

# 学習済みのモデルを使った例
# print(model.wv.most_similar(エンジニア))

結果例:

[('プログラマー', 0.85), ('デザイナー', 0.72), ('ディレクター', 0.68)...]

「エンジニア」と似てる言葉を出して、って言うと、「プログラマー」とかが出てくる。
これを使えば、言い方が違っても検索にヒットさせたり(「デジカメ」で検索して「デジタルカメラ」を出す!)、おすすめ機能を作ったりできる。
20年前の私がマジで欲しかったのは、これなんだよ。

そしてすごい時代へ… BERTとLLMの世界

ここ数年で、NLPの世界はさらに大きく変わった。
BERT とか GPT みたいな「Transformer」っていうモデルが出てきたんだ。

これらは、文章をいろんな方向から読んだり、大量のテキストデータを学習することで、人間並み(もしくはそれ以上)の読解力を持ってるんだ。

Pythonでこれらを使うなら、Hugging FaceTransformers ライブラリが定番だ。

from transformers import pipeline

# 感情分析の機能を作る(日本語モデルを指定)
classifier = pipeline(sentiment-analysis, model=koheiduck/bert-japanese-finetuned-sentiment)

result = classifier(このプログラミングスクールは最高だった!)
print(result)

実行結果:

[{'label': 'POSITIVE', 'score': 0.98...}]

これだけで、すごい感情分析ができるんだよ。
仕事では、これらの「学習済みのモデル」を持ってきて、自分のやりたいことに合わせてちょっとだけ学習させる「ファインチューニング」っていう方法をよく使う。ゼロから学習させる必要はないんだ。

モニターに表示された感情分析の結果を見て、あまりの精度にビックリしているエンジニアのイラスト

副業とか仕事でうまくいくためのコツ

さて、技術的な話はここまでにして、これらをどうやって仕事につなげるか、相談に乗ってきた経験から話していくね。
初心者がNLPスキルで稼ぐための、おすすめの道はいくつかある。

1. スクレイピング × 感情分析 × レポート

これが一番手堅いよ。
「Amazonの御社製品のレビューを全部集めて、良い意見と悪い意見に分けて、悪い意見の中でよく出てくる単語を調べて、改善レポートを作ります」
っていう提案だ。

Pythonでスクレイピングして、GiNZAで形態素解析して、良いか悪いかを判断する。
技術的には難しくないけど、お客さんにとっては「マジで欲しい情報」なんだ。5万~10万円くらいで受けやすいよ。

2. 社内ドキュメントの検索エンジンを作る

社内のWikiとか日報がバラバラになってて検索できない、っていう悩みは多いんだ。
Elasticsearchみたいな検索エンジンに、形態素解析の辞書を組み込んで、言い方が違っても検索できるシステムを作る。
これはサーバーとかネットワークの知識も必要になるけど、毎月お金をもらう契約を取りやすく、安定収入につながる。

3. チャットボットのログを分析する

とりあえず導入したけど、放置されてるチャットボットは多いんだ。
「ユーザーがどんな質問をして、どこで使うのをやめたか」をNLPで分析して、FAQを改善する提案をする。
これもコンサルみたいになるから、単価が高くなるよ。

大事なのは「精度」よりも「納得感」

初心者がよくやっちゃうのが、「モデルの精度(Accuracy)」を気にしすぎること。
「精度が92%から上がりません…」って悩む人が多いんだけど、お客さんはそんなこと気にしてないんだよね。

それよりも、
「なぜその結果になったのか」
「間違えた8%はどういうデータなのか」
を説明できることの方が大事。

「このモデルは、若い人が使うスラングが苦手です。だから、スラングが多いSNSデータの分析には向いてないです」
って正直に言えるエンジニアの方が、信頼されるし、また仕事を頼まれるよ。

分析レポートを見せながら、クライアントにロジカルに説明しているエンジニアのイラスト

よくある質問 (FAQ)

Q: 数学(線形代数とか確率統計)が苦手だけど、NLPってできる?
A: コードを書くだけなら、中学校の数学レベルでもなんとかなるよ。
ライブラリの中身を知ろうとすると行列計算が出てくるけど、最初は「入力」と「出力」の関係だけわかってればOK。必要になったら勉強すればいい。私も数学は赤点ギリギリだったけど、なんとかなってるから。

Q: どのライブラリから勉強すればいい?
A: まずは MeCabGiNZA で形態素解析をマスターするのがおすすめ。次に scikit-learn でTF-IDF。そのあとに Transformers (BERTとか) に進むと、挫折しにくいよ。最初からBERTに入ると、基本ができてないから応用が利かないんだ。

Q: ChatGPTのAPIを使えば、PythonでNLPをやる必要ないんじゃない?
A: お金とセキュリティの問題があるんだ。
大量のデータをAPIに送ると、結構な値段になるし、個人情報が入ってるデータを外に出せない会社も多い。自分のパソコン(とか会社のサーバー)で動かせるNLP技術を持ってることは、これからもっと強みになるよ。

Q: パソコンの性能ってどれくらい必要?
A: モデルを学習させるならGPUが必要だけど、学習済みのモデルを使うだけなら、普通のノートPCでも動くよ。Google Colabを使えば、タダでGPUが使えるから、最初はそれで十分だよ。

まとめ:言葉を扱えるエンジニアは、仕事で有利になる!

長々と話してきたけど、NLPはマジで面白い。
人間が普段使ってる「言葉」っていう曖昧なものを、コンピュータで解き明かそうとするんだから。

そして、ビジネスの現場には、まだ使われてないテキストデータがたくさん眠ってる。
それを掘り起こして、価値ある情報に変えられるのは、私らエンジニアだけなんだ。

「難しそう…」って思ってたらもったいない。
まずは pip install ginza から試してみてほしい。
自分で書いたコードが、言葉の意味を理解した(ように見えた)瞬間、きっと感動するはずだよ。

昔、辞書登録で心が折れかけてた私が、今こうしてNLPを楽しんでるように、あなたにも「言葉を操る楽しさ」を知ってほしいな。
さあ、エディタを開いて、最初の分析を始めよう!

朝日が差し込む部屋で、PC画面に表示された分析成功のログを見て、静かにガッツポーズを決めているエンジニアのイラスト
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いたエンジニア

大城 修平のアバター 大城 修平 PHPエンジニア

PHPを中心としたバックエンド開発のスペシャリスト。レガシー改善やリファクタリングを得意とし、システムを整えることに喜びを感じるタイプ。実は料理上手で、休日は凝った料理を作るのが趣味。誠実で着実な仕事ぶりが光る。

目次