🐍

Pythonで人物の名寄せをしてみる

2023/12/26に公開

はじめに

自然言語処理をしていたら、人物の名寄せをしないといけなくなりました。
ただ、全部の名寄せをしたいわけではなく、特定の漫画のあらすじテキストの一部分のみを名寄せをしたいだけです。
その方法をメモしておきます。

実行環境

spacyを用いたコード

import spacy
# spaCyの日本語モデルをロードします
nlp = spacy.load('ja_ginza')
# フルネームのリストを定義します
full_names = ["工藤新一", "毛利蘭", "怪盗キッド","江戸川コナン"]
# 名前のマッピングを定義します
name_mapping = {"新一": "工藤新一", "蘭": "毛利蘭", "キッド": "怪盗キッド"}
# 形態素解析を行いたいテキストのリストを定義します
texts = ["新一は探偵だ", "蘭は空手が得意だ", "キッドは怪盗だ"]
# 完全一致で名前を名寄せする関数
def resolve_names(text):
    doc = nlp(text)
    result_tokens = []

    for token in doc:
        # 名前が名寄せ対象であれば、完全一致で名寄せを行う
        if token.text in name_mapping and name_mapping[token.text] not in text:
            full_name = name_mapping[token.text]
            result_tokens.append(full_name)
        else:
            result_tokens.append(token.text)

    return ''.join(result_tokens)
# 各テキストに対して名前の名寄せを行う
for text in texts:
    resolved_text = resolve_names(text)
    print(resolved_text)

名寄せがうまくいかない場合

新一(コナン)など、記号が入っている場合、うまくいきませんでした。
うまくいく方法を知っている方がいれば、コメントまでお願いします。

Discussion