「日本語ってマジでめんどくさい…」とヘトヘトになった日の話
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)。

実践ステップ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%以上の精度が出たんだ。
最新の重たいモデルを使わなくても、昔からある技術で十分戦えることは多いんだよね。

実践ステップ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 Face の Transformers ライブラリが定番だ。
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: まずは MeCab か GiNZA で形態素解析をマスターするのがおすすめ。次に 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を楽しんでるように、あなたにも「言葉を操る楽しさ」を知ってほしいな。
さあ、エディタを開いて、最初の分析を始めよう!

