okpy

Pythonエンジニア兼テックリーダーが、多くのプロジェクトとチーム運営から得た実践的な知識を共有するブログです。

Pythonで多言語NLP、まだ言語ごとにライブラリを使い分けて消耗してる?

Pythonで多言語NLP、まだ言語ごとにライブラリを使い分けて消耗してる?

📝 TL;DR (3行要約)

  • Polyglotは、世界100以上の多様な言語に対応するPython自然言語処理(NLP)ライブラリです。
  • 単語分割から固有表現抽出、感情分析まで、多くのタスクを統一的なコードで実行できます。
  • グローバルなデータを扱う際、言語ごとにツールを使い分ける手間を劇的に削減したい時に真価を発揮します。

1. 🤔 一体Polyglotとは何?(核心的な役割と主な使用例)

プログラミングの世界に足を踏み入れたばかりの皆さん、こんにちは!Pythonのコードで人間の「言葉」を扱えたら、面白いことができそうだと思いませんか?例えば、SNSの投稿から評判を分析したり、ニュース記事から重要なキーワードを自動で抜き出したり…。こうした技術は自然言語処理 (Natural Language Processing, NLP) と呼ばれ、現代のITサービスに欠かせないものとなっています。

ただ、このNLPには一つ、大きな壁があります。それは「言語の壁」です。英語のテキストを分析するのに便利なライブラリ、日本語の解析が得意なライブラリ…というように、言語ごとに最適なツールが異なることが多いのです。もし世界中のニュース記事を分析したいと思ったら、言語の数だけ新しいライブラリの使い方を学ばなければならないのでしょうか?想像しただけで気が遠くなりそうですよね。

そんな悩みを解決するために生まれたのが、今回ご紹介するPolyglotです。

  • 核心的な役割 🌍

Polyglotという名前は、英語で「多言語を話す人(多言語話者)」を意味します。その名の通り、このライブラリの最大の特徴は、圧倒的に多くの言語を、まるで一つの言語であるかのように扱える点にあります。

Polyglotを例えるなら、NLP界の万能翻訳機」 のような存在です。ドラえもんひみつ道具「翻訳コンニャク」を食べればどんな言語でも話せるようになるように、Polyglotを使えば、あなたの書いたPythonコードが、日本語、英語、中国語、スペイン語、さらにはアラビア語スワヒリ語まで、様々な言語を理解できるようになります。

多くのNLPライブラリが、まず英語で高い性能を出すことを目指して開発され、その後、他の言語へ対応を広げていくという歴史を辿ってきました。しかしPolyglotは、設計当初から「多言語を平等に扱う」 という思想で作られています。そのため、他のライブラリではサポートが手薄になりがちな、いわゆるマイナー言語にも幅広く対応しているのが強みです。

このライブラリが解決してくれるのは、「言語ごとに異なるツールや前処理方法を学び、実装を切り替えるという途方もない手間」 です。Polyglotを使えば、分析したいテキストの言語が変わっても、あなたの書くコードの基本的な構造はほとんど変わりません。これは、グローバルなデータを扱う開発者にとって、まさに救世主と言えるでしょう。

  • 主な使用例 💡

では、具体的にどのような場面でPolyglotは輝くのでしょうか?代表的な例を3つ見てみましょう。

  1. グローバルな製品レビューの感情分析 📈 あなたが開発したアプリが世界中でリリースされたとします。App StoreGoogle Playには、世界中のユーザーから様々な言語でレビューが投稿されるでしょう。「この新機能は最高だ!」「バグが多い…」「使い方がわからない」といった意見を、言語の壁を越えて集計・分析したいはずです。Polyglotを使えば、英語のレビューも、フランス語のレビューも、日本語のレビューも、同じコードで「ポジティブ」「ネガティブ」「ニュートラル」といった感情を判定できます。これにより、製品に対する世界的な反応を素早く、統一的な指標で把握することが可能になります。

  2. 多言語ニュース記事からの情報抽出 📰 国際情勢を分析するジャーナリストや研究者を想像してみてください。彼らは世界各国のニュースメディアから、特定の企業や人物に関する情報を集める必要があります。例えば、「X社」がどの国で、どのような活動をしているかを追跡したい場合、Polyglotを使って様々な言語のニュース記事から「組織名」「地名」「人名」といった固有表現を自動で抽出できます。これにより、手作業では到底不可能な規模の情報を効率的に収集し、データベース化することができるのです。

  3. マイナー言語のテキストデータ処理基盤 📚 世界には7,000以上もの言語があると言われています。NLP研究の世界では、英語のようなメジャーな言語にリソースが集中しがちで、話者人口が少ない言語の研究は遅れがちです。Polyglotは、こうしたメジャーでない言語(例えば、フィリピンのタガログ語や、アフリカのスワヒリ語など)に対しても、単語分割や品詞タグ付けといった基本的なNLP機能を提供します。これは、これまで計算言語学的なアプローチが難しかった言語の研究や、その言語圏に向けた地域特化型サービスを開発する上で、非常に貴重な基盤となります。

このように、Polyglotは「たくさんの言語を、同じやり方で、効率よく扱いたい」というニーズがある場面で、絶大なパワーを発揮するライブラリなのです。


2. 💻 インストール方法

Polyglotのインストールは、Pythonのパッケージ管理ツールであるpipを使えばとても簡単です。ターミナル(WindowsならコマンドプロンプトPowerShell)を開いて、以下のコマンドを実行してください。

pip install polyglot

ただし、Polyglotはいくつかの外部ライブラリに依存しています。もし上のコマンドでエラーが出る場合は、先に以下のライブラリをインストールすると解決することが多いです。

pip install numpy pycld2 morfessor pyicu

(環境によってはpyicuのインストールに少し手間がかかる場合があります。その際はOS名とエラーメッセージで検索してみてください。)

さらに、Polyglotは非常に重要な特徴として、ライブラリ本体とは別に、言語ごと・タスクごとのモデルデータをダウンロードする必要があります。 これを忘れるとコードが動かないので注意してください。

例えば、これから試す日本語の「固有表現抽出(ner)」と「品詞タグ付け(pos)」のモデルをダウンロードするには、以下のコマンドをターミナルで実行します。

polyglot download ner2.ja pos2.ja

ner2.jaが日本語の固有表現抽出モデル、pos2.jaが日本語の品詞タグ付けモデルを意味します。使いたい言語や機能が増えたら、その都度このコマンドで必要なモデルを追加していく、という流れになります。どんなモデルが利用可能かは、polyglot download --helpで確認できますよ。


3. 🛠️ 実際に動作するサンプルコード

お待たせしました!それでは、実際にPolyglotを動かしてみましょう。 ここでは、日本語のテキストから「固有表現(人名、組織名、地名など)」を抽出し、さらに「単語分割(分かち書き)」「品詞タグ付け」を行うコードをご紹介します。

以下のコードをコピーして、polyglot_test.pyのような名前で保存し、実行してみてください。先ほどのモデルダウンロードが完了していれば、すぐに動作するはずです。

# -*- coding: utf-8 -*-
from polyglot.text import Text

# 分析対象の日本語テキスト
# このテキストには、組織名(I-ORG), 人物名(I-PER), 地名(I-LOC)が意図的に含まれています。
text_ja = """
AppleのCEOであるティム・クックは、来週東京で岸田総理と会談する予定だ。
この会談は日本のギガファクトリー設立に関するものと見られている。
会議の場所は港区のホテルオークラ東京が有力視されている。
"""

print("--- 処理対象のテキスト ---")
print(text_ja)

# --- Polyglotの魔法がここから始まります ---

# 1. PolyglotのTextオブジェクトを作成します。
# 'hint_language_code'で言語を指定すると、言語検出のステップをスキップでき、
# 処理が高速かつ正確になります。
text = Text(text_ja, hint_language_code='ja')


# 2. 固有表現を抽出して表示します。
print("\n✅ === 固有表現抽出 (Named Entity Recognition) ===")
# text.entities にアクセスするだけで、抽出結果のリストが返ってきます。
for entity in text.entities:
    # entity.tag には 'I-PER' (人名), 'I-ORG' (組織名), 'I-LOC' (地名) などのラベルが入っています。
    # ' '.join(entity) で、抽出されたエンティティのテキストを取得できます。
    print(f"エンティティ: {' '.join(entity):<20} | タグ: {entity.tag}")


# 3. 単語分割(分かち書き)と品詞タグ付けも試してみましょう。
print("\n✅ === 単語分割と品詞タグ付け (Tokenization & POS Tagging) ===")
# text.pos_tags にアクセスすると、(単語, 品詞) のタプルのリストが返ってきます。
# forループで一つずつ取り出して表示します。
for word, tag in text.pos_tags:
    print(f"単語: {word:<10} | 品詞: {tag}")

実行結果の例:

--- 処理対象のテキスト ---

AppleのCEOであるティム・クックは、来週東京で岸田総理と会談する予定だ。
この会談は日本のギガファクトリー設立に関するものと見られている。
会議の場所は港区のホテルオークラ東京が有力視されている。


✅ === 固有表現抽出 (Named Entity Recognition) ===
エンティティ: Apple               | タグ: I-ORG
エンティティ: ティム・クック          | タグ: I-PER
エンティティ: 東京                 | タグ: I-LOC
エンティティ: 岸田                 | タグ: I-PER
エンティティ: 日本                 | タグ: I-LOC
エンティティ: 港区                 | タグ: I-LOC
エンティティ: ホテルオークラ東京        | タグ: I-LOC

✅ === 単語分割と品詞タグ付け (Tokenization & POS Tagging) ===
単語: Apple      | 品詞: PROPN
単語: の          | 品詞: ADP
単語: CEO        | 品詞: NOUN
単語: で          | 品詞: ADP
単語: ある         | 品詞: VERB
単語: ティム・クック | 品詞: PROPN
単語: は          | 品詞: ADP
... (以下略) ...

どうでしょうか?たった数行のコードで、文章の中から組織名、人名、地名が綺麗に抜き出せているのがわかりますね!同時に、文章が単語単位に分割され、それぞれに品詞(名詞、動詞など)のラベルが付与されているのも確認できます。これがPolyglotの力です。


4. 🔍 コードの詳細説明

サンプルコードが魔法のように動くことは分かりましたが、初心者の方がつまずかないように、各ブロックが何をしているのかをもう少し詳しく見ていきましょう。

  1. from polyglot.text import Text これは、Polyglotライブラリの中から、中核となるTextという部品(クラス)を使いますよ、という宣言です。テキスト処理に関するほとんどの操作は、このTextクラスを通して行われます。

  2. text_ja = """...""" ここでは分析したい日本語の文章を、text_jaという名前の変数に格納しています。三重クォート """ で囲むと、複数行にわたる文字列をそのまま書けるので便利です。

  3. text = Text(text_ja, hint_language_code='ja') ここがPolyglotの処理の出発点であり、最も重要な一行です。

    • Text(...) の部分で、先ほど用意した日本語の文字列 text_ja を、Polyglotが分析できる特別なデータ形式Textオブジェクト)に変換しています。
    • このオブジェクトが作られた瞬間に、Polyglotは背後で言語の検出や文章の分割など、様々な下準備を自動的に行ってくれます。
    • hint_language_code='ja' は、「このテキストはたぶん日本語(ja)だよ」とPolyglotにヒントを与えています。これにより、Polyglotが自分で言語を推測する手間が省け、処理が速く、そして正確になります。短い文章を扱う時や、言語が初めから分かっている場合は、必ず指定することをおすすめします。
  4. for entity in text.entities: このブロックが固有表現抽出を行っている部分です。

    • text.entities にアクセスするだけで、Polyglotは自動的にテキスト内の固有表現を分析し、結果をリスト形式で返してくれます。私たちは複雑なアルゴリズムを一切知らなくても、このプロパティ(オブジェクトが持っている情報)を呼び出すだけで良いのです。
    • forループを使って、見つかった固有表現(entity)を一つずつ取り出しています。
    • ' '.join(entity) は、固有表現が複数の単語(例: ['ティム', '・', 'クック'])で構成されている場合に、それらをスペースで連結して一つの文字列にしています。
    • entity.tag には、その固有表現の種類を示すタグ(I-PER=人、I-ORG=組織、I-LOC=場所)が格納されています。
  5. for word, tag in text.pos_tags: こちらは単語分割と品詞タグ付けを行うブロックです。

    • 仕組みは固有表現抽出とよく似ています。text.pos_tags にアクセスすると、(単語, 品詞タグ) というペアのリストが返ってきます。
    • for word, tag in ... という書き方で、リストの中のペアをwordtagという2つの変数に一度に受け取り、それぞれを表示しています。

このように、Polyglotでは Textオブジェクトを作って、あとは.entities.pos_tagsのような目的のプロパティにアクセスするだけ」 という非常にシンプルで直感的な手順で、高度なNLP処理が実現できるのです。


5. ⚠️ 注意点またはヒント

Polyglotは非常に強力ですが、初心者が使う際に陥りやすい罠や、知っておくと便利なヒントがあります。ここでは特に重要なものを2つだけ厳選してお伝えします。

  • ⚠️ 注意点: 必須!モデルデータの事前ダウンロードを忘れずに 初心者がPolyglotで遭遇するエラーの9割は、これが原因です。「インストールしたはずなのに、Model not foundみたいなエラーが出て動かない!」という時は、ほぼ間違いなくモデルデータのダウンロードを忘れています。

    なぜダウンロードが必要なの? Polyglotのライブラリ本体は、あくまで多言語を扱うための「骨格」や「操作方法」を提供するだけです。実際に各言語の単語や文法を解析するための知識(辞書や統計モデル)は、巨大なデータなので別パッケージになっています。これを「モデルデータ」と呼びます。 この仕組みにより、ライブラリ本体は軽量なまま、ユーザーは自分が必要な言語・機能のデータだけを追加でダウンロードできるのです。 コードを実行する前には、必ず polyglot download ner2.ja のように、使う機能と言語に対応するモデルをダウンロードしたか、再度確認する癖をつけましょう。

  • 💡 ヒント: hint_language_codeは最高の相棒 Textオブジェクトを作成する際に hint_language_code='ja' を指定するテクニックは、単なるおまけではありません。これはPolyglotを快適に使うための最重要テクニックの一つです。

    なぜヒントが重要? Polyglotには言語の自動検出機能が備わっていますが、万能ではありません。特に、

    • 「こんにちは」のような短いテキスト
    • 専門用語や固有名詞が多いテキスト
    • 複数の言語が少しずつ混じっているテキスト などは、言語の判定を間違えてしまうことがあります。間違った言語モデルで分析を始めてしまうと、当然ながら結果はチンプンカンプンになります。 あらかじめ言語が分かっているデータを処理する場合は、このヒントを必ず指定しましょう。処理の正確性が担保されるだけでなく、言語検出の処理を丸ごとスキップできるため、実行速度も目に見えて向上しますよ!

6. 🔗 一緒に見ておくと良いライブラリ

Polyglotで多言語NLPの世界に興味を持ったなら、次の一歩としてぜひ触ってみてほしいライブラリがあります。それは spaCy (スペイシー) です。

  • spaCy (https://spacy.io/) spaCyもPolyglotと同様に、多言語をサポートする非常に人気のあるNLPライブラリです。しかし、その思想は少し異なります。

    • Polyglot: 対応言語の「広さ」を重視。学術的な研究から生まれた背景を持ち、とにかく多くの言語で基本的なNLPタスクを実行できることを目指しています。
    • spaCy: 主要言語における「性能・速度・実用性」を重視。ビジネスの現場や本番のWebサービスで使うことを強く意識して設計されており、特に英語やドイツ語、スペイン語、そして日本語などの主要言語において、非常に高速かつ高精度な処理を実現します。また、豊富な拡張機能や洗練されたドキュメントなど、開発者にとっての使いやすさ(エコシステム)も大きな魅力です。

    学習のステップとしては…

    1. まずPolyglotで、「言語が違っても同じコードで処理できるんだ!」という多言語NLPの面白さと全体像を掴む。
    2. 次に、特定の主要言語(例えば日本語や英語)の処理を、より高速・高精度に行う必要があるプロジェクトが出てきたら、spaCyを使ってみる。

    このように使い分けることで、あなたは状況に応じて最適なツールを選べる、より引き出しの多い開発者になることができるでしょう。PolyglotとspaCyは競合するというより、互いに補い合う素晴らしい関係なのです。


7. 🎉 まとめ

今日はお疲れ様でした!今回は、多言語NLPの強力な味方「Polyglot」について、その魅力と使い方を学びました。最後に、今日のポイントを振り返っておきましょう。

  • Polyglotは「多言語話者」: 100以上の言語を、統一的でシンプルなコードで扱えるのが最大の強みです。
  • 基本的な使い方は簡単: Textオブジェクトを作り、.entities.pos_tagsのようなプロパティにアクセスするだけで、高度な分析が可能です。
  • 2つの重要ポイント: 実行前のモデルダウンロード (polyglot download) と、処理の精度と速度を上げる hint_language_code の指定を忘れないようにしましょう。

理論を学んだだけでは、知識はなかなか身につきません。スポーツと同じで、実際に手を動かしてこそ、プログラミングは上達します。そこで、最後にあなたへの「挑戦課題」を2つ用意しました。ぜひチャレンジしてみてください!

🔥 挑戦課題 🔥

  1. 世界のニュースで固有表現を抜き出そう! BBC News (英語) や、あなたの好きな海外のニュースサイトの記事を一つ選び、そのテキストをコピーしてサンプルコードのtext_jaと入れ替えてみましょう。言語コードhint_language_code='en'などに変更し、必要なモデルをダウンロードすれば、その言語のニュースから人名や地名が抽出できるはずです。どんな単語が抽出されるか、観察してみましょう!

  2. 固有表現カウンターを作ろう! 今日のサンプルコードを改造して、抽出した固有表現を種類ごと(I-PER, I-LOC, I-ORG)にカウントし、「人名はO個、地名はX個、組織名はY個見つかりました」のように集計結果を表示するプログラムを作成してみてください。Pythonの辞書(dictionary)を使うと、うまく実装できますよ。

この一歩が、あなたをNLPの世界のさらに奥深くへと導いてくれるはずです。楽しんでコーディングしてくださいね!