werry-chanの日記.料理とエンジニアリング

料理!コーディング!研究!日常!飯!うんち!睡眠!人間の全て!

spacy GINZA固有表現抽出をjupyterなしでprintする

spacy GINZAを使った固有表現抽出の記事を色々見ていると, jupyterのdisplay使ったコードばかりでした。

筆者は普段リモートワークでLinuxCUIで開発しており, jupyter使うと面倒になるため, なるべくやりたくないのです。

リモートでCUIマシンでjupyter使う場合, jupyter用にport開けて暗号化かけて, 毎回サーバ立てて使い終わったら落としたり面倒です。


今回は, spacy GINZA entityのprintをjupyterなしでやります。

まずはセットアップです。

自然言語処理Libのspacyです。

pip install spacy

spacyだけでも形態要素解析が可能です。


次に日本語対応のモデルが使えるようにします。

pip install -U ginza ja_ginza_electra

ginza-electraは今のところ公開されている中では, 日本語の対応が一番良かった感じがします。


実際のコードは以下になります。

内容としては単純な文字列処理になります。

import spacy

#model loading
nlp = spacy.load('ja_ginza_electra')

in_text = '猫次郎は5月18日の朝9時にタヌキ商店へタヌ吉に会いに行った。'
doc     = nlp(in_text)

hidden_text = copy.deepcopy(in_text)
for ent in doc.ents:
    hidden_text = ( hidden_text[:ent.start_char] +
                    '*' * int(ent.end_char - ent.start_char) +
                    hidden_text[ent.end_char:]
                   )

labeled_text = copy.deepcopy(in_text)
num_diff_word = 0
for ent in doc.ents:
    labeled_text = ( labeled_text[:ent.start_char + num_diff_word] +
                     '"' + ent.text + '[' + ent.label_ + ']' + '"' +
                     labeled_text[ent.end_char + num_diff_word:]
                    )
    num_diff_word += len(ent.label_) + 4
print(in_text)
print(hidden_text)
print(labeled_text)

出力は以下のようになります。

        in_text: 猫次郎は5月18日の朝9時にタヌキ商店へタヌ吉に会いに行った。
hidden_text: ***は*****の***に*****へ***に会いに行った。
labeled_text:"猫次郎[Person]"は"5月18日[Date]"の"朝9時[Time]"に"タヌキ商店[Dish]"へ"タヌ吉[Person]"に会いに行った。

以上でJupyterなしでentity出力できました。