python3 機械学習・ディープラーニング

Flaskで始める固有表現抽出!SpaCyとGiNZAを使った固有表現抽出(ner)の作り方!

記事内に広告が含まれています。

はるか
今日はFlaskで固有表現抽出をやるよ。SpaCyとGiNZAを使う。

固有表現抽出とは

固有表現抽出(Named Entity Recognition, NER)は、自然言語処理(NLP)の一分野で、テキストから特定の種類の固有名詞を識別し、分類する技術です。具体的には、以下のようなカテゴリーに分類されることが多いです。

  • 人名(Person): 例:「アインシュタイン」「ジョン・スミス」
  • 地名(Location): 例:「東京」「ニューヨーク」
  • 組織名(Organization): 例:「グーグル」「国連」
  • 日付(Date): 例:「2023年6月21日」「昨日」
  • 時間(Time): 例:「午後3時」「2時間後」
  • 金額(Money): 例:「100ドル」「1,000円」
  • パーセンテージ(Percent): 例:「50%」「3分の1」

ふゅか
固有表現抽出(NER)は、テキストから特定の種類の固有名詞を識別し、分類する技術ね。例えば、人名や地名、組織名、日付などがあるわ。

はるか
そう。アインシュタインとか、東京とか、グーグルなんかが例だね。

Flaskでアプリケーションの作成

ふゅか
Flaskで機械学習アプリケーションを作成してみましょう!

Flaskの基本的な使い方は次のページで解説しています。

必要なライブラリのインストール

まず、FlaskとSpaCy、およびGiNZAモデルをインストールします。

pip install flask spacy
pip install ginza ja-ginza

ディレクトリ構造

ふゅか
次に、ディレクトリ構造を確認しましょう。以下のように設定するわ。
ja-ner/
    app.py
    templates/
        index.html

app.py ファイルの内容

ふゅか
続いて、`app.py`ファイルの内容を見てみましょう。Flaskアプリケーションのメイン部分ね。
はるか
そう、GiNZAモデルをロードして、テキストを処理する部分が重要だね。
ふゅか
それに、POSTリクエストでテキストを受け取り、エンティティを抽出して表示しよう!
from flask import Flask, request, jsonify, render_template
import spacy

app = Flask(__name__)

# GiNZAモデルをロード
nlp = spacy.load("ja_ginza")

@app.route('/', methods=['GET', 'POST'])
def index():
    entities = []
    if request.method == 'POST':
        text = request.form.get("text")
        if text:
            doc = nlp(text)
            entities = [{"text": ent.text, "label": ent.label_} for ent in doc.ents]

    return render_template('index.html', entities=entities)

if __name__ == '__main__':
    app.run(debug=True)

index.html ファイルの内容

はるか
次に、`index.html`ファイルの内容だよ。ユーザーがテキストを入力するフォームが含まれている。
ふゅか
送信ボタンを押すと、入力されたテキストがFlaskアプリに送られて処理されるのね。エンティティ認識結果も表示されるわ。
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>NER App</title>
</head>
<body>
    <h1>日本語NERアプリケーション</h1>
    <form method="post">
        <label for="text">テキストを入力してください:</label><br>
        <textarea id="text" name="text" rows="4" cols="50"></textarea><br>
        <input type="submit" value="送信">
    </form>

    {% if entities %}
        <h2>エンティティ認識結果:</h2>
        <ul>
            {% for entity in entities %}
                <li>{{ entity.text }}: {{ entity.label }}</li>
            {% endfor %}
        </ul>
    {% endif %}
</body>
</html>

アプリケーションの起動とテスト

Flaskアプリケーションを起動し、ブラウザからフォームを送信してNERを実行します。

python app.py

ブラウザで http://127.0.0.1:5000 にアクセスし、テキストを入力して「送信」ボタンを押します。認識されたエンティティがページに表示されるはずです。

 * Serving Flask app 'app'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with watchdog (windowsapi)
 * Debugger is active!
 * Debugger PIN: 691-256-788

以上で、Flaskを使用して日本語のNERを実行するためのフォームの送信処理を追加しました。これにより、ユーザーが入力したテキストに対してNERを実行し、その結果をブラウザに表示することができます。

入力内容

皇帝カリグラは、異常な行動で知られていました。彼は愛馬インキタトゥスを執政官(ローマの重要な官職)に任命しようとしました。実際には任命されませんでしたが、この出来事は彼の狂気を象徴する逸話として語り継がれています。

ふゅか
エンティティ認識結果は次の通りね。
  • 皇帝カリグラ: Person
  • 愛馬インキタトゥス: Character
  • 執政官: Doctrine_Method_Other
  • ローマ: City

Flaskに関連する書籍

動かして学ぶ! Pythonサーバレスアプリ開発入門
Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方
Flask Webアプリ開発実装ハンドブック

-python3, 機械学習・ディープラーニング
-, , , ,