更新:2024/06/26
Flaskで始める固有表現抽出!SpaCyとGiNZAを使った固有表現抽出(ner)の作り方!


はるか
今日はFlaskで固有表現抽出をやるよ。SpaCyとGiNZAを使う。
目次
1. 固有表現抽出とは
固有表現抽出(Named Entity Recognition, NER)は、自然言語処理(NLP)の一分野で、テキストから特定の種類の固有名詞を識別し、分類する技術です。具体的には、以下のようなカテゴリーに分類されることが多いです。
- 人名(Person): 例:「アインシュタイン」「ジョン・スミス」
- 地名(Location): 例:「東京」「ニューヨーク」
- 組織名(Organization): 例:「グーグル」「国連」
- 日付(Date): 例:「2023年6月21日」「昨日」
- 時間(Time): 例:「午後3時」「2時間後」
- 金額(Money): 例:「100ドル」「1,000円」
- パーセンテージ(Percent): 例:「50%」「3分の1」

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

はるか
そう。アインシュタインとか、東京とか、グーグルなんかが例だね。
2. Flaskでアプリケーションの作成

ふゅか
Flaskで機械学習アプリケーションを作成してみましょう!
Flaskの基本的な使い方は次のページで解説しています。
2.1. 必要なライブラリのインストール
まず、FlaskとSpaCy、およびGiNZAモデルをインストールします。
pip install flask spacy
pip install ginza ja-ginza
2.2. ディレクトリ構造

ふゅか
次に、ディレクトリ構造を確認しましょう。以下のように設定するわ。
ja-ner/
app.py
templates/
index.html
2.3. 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)
2.4. 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>
2.5. アプリケーションの起動とテスト
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を実行し、その結果をブラウザに表示することができます。
2.6. 入力内容
皇帝カリグラは、異常な行動で知られていました。彼は愛馬インキタトゥスを執政官(ローマの重要な官職)に任命しようとしました。実際には任命されませんでしたが、この出来事は彼の狂気を象徴する逸話として語り継がれています。

ふゅか
エンティティ認識結果は次の通りね。
- 皇帝カリグラ: Person
- 愛馬インキタトゥス: Character
- 執政官: Doctrine_Method_Other
- ローマ: City
3. Flaskに関連する書籍
bookfanプレミアム
bookfanプレミアム
PR