• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

固有名詞・組織名の抽出方法

date: 2022-02-13 excerpt: 固有名詞・組織名の抽出方法について

tag: 分析analytics


固有名詞の抽出方法について

概要

  • テキスト生成の文脈などで固有名詞・組織名の一覧を知りたい場合がある
  • 固有名詞は必ずしも商標登録されたような単語と同じではない

一般名詞ではないだろう固有名詞を取り出す

  • mecab-ipadic-neologdのgithubプロジェクトでビルドされる辞書に含まれる固有名詞を利用する
  • neologd固有の表現を取り出すには、mecab-ipadicとの差分を利用する

pythonによる固有名詞の抽出

import glob
import pandas as pd
import mojimoji



def get_noun(globbing, output_name, encoding="utf8"):
    data = []
    for filename in glob.glob(globbing):
        x = pd.read_csv(filename, header=None)
        if len(x.columns) != 13:
            continue
        x.columns = ["term", "n1", "n2", "n3", "type", "type_detail", "type_org", "w1", "w2", "w3", "term_full", "pron1", "pron2"]
        x = x[["term", "type_detail", "term_full"]]
        x["term"] = x["term"].astype(str).apply(lambda x: mojimoji.zen_to_han(x, kana=False, digit=True, ascii=True))
        x.query('type_detail == "固有名詞"', inplace=True)
        data.append(x)

    df = pd.concat(data)
    df.sort_values(by=["term"], inplace=True)
    df["term"] = df["term"].str.lower()
    df["term_full"] = df["term_full"].str.lower()
    df.drop_duplicates(subset=["term"], inplace=True)
    df.to_csv(output_name, index=None)

get_noun(globbing="./mecab-ipadic-neologd/build/*/*.csv", output_name="neologd-output.csv", encoding="utf8")
get_noun(globbing="./mecab/mecab-ipadic/*.csv", output_name="ipadic-output.csv", encoding="utf8")
ipa_terms = set(pd.read_csv("ipadic-output.csv")["term"].tolist())

neologd = pd.read_csv("neologd-output.csv")
neologd.query('term not in @ipa_terms', inplace=True)
neologd.to_csv("neologd.csv", index=None)

出力結果

term,type_detail,term_full
!deladap,固有名詞,!deladap
!wagero!,固有名詞,!wagero!
![エクスクラメイション],固有名詞,![エクスクラメイション]
"""is""",固有名詞,”is”
"""l""",固有名詞,”l”
"""l'ultimo bacio""",固有名詞,”l'ultimo bacio”
"""taboo""",固有名詞,”taboo”
"""as""",固有名詞,”as”
"""b"" yasshi",固有名詞,”b” yasshi
"""よいおと""",固有名詞,”よいおと”
"""エースオブエース""なのは",固有名詞,”エース・オブ・エース”なのは
"""エース・オブ・エース""なのは",固有名詞,”エース・オブ・エース”なのは
"""スパムアカウント""",固有名詞,”スパムアカウント”
"""ラバーマン"" ジョニーウォーカー",固有名詞,”ラバーマン” ジョニー・ウォーカー
"""ラバーマン"" ジョニー・ウォーカー",固有名詞,”ラバーマン” ジョニー・ウォーカー
"""国内亡命者""",固有名詞,”国内亡命者”
"""感性を阻害しない""",固有名詞,”感性を阻害しない”
"""文学少女""シリーズ",固有名詞,”文学少女”シリーズ
...
  • 商標登録されているような単語が多いが一般語も多く、この出力単体で商標の単語を見つけ出すことはできない

組織名を取り出す

組織名の抽出条件

  • 固有名詞かつ次のフィールドが組織になっていること
  • neologdの辞書からパースする事ができる

組織名の抽出

import glob
import pandas as pd
import mojimoji


def get_noun(globbing, output_name, encoding="utf8"):
    data = []
    for filename in glob.glob(globbing):
        x = pd.read_csv(filename, header=None)
        if len(x.columns) != 13:
            continue
        x.columns = ["term", "n1", "n2", "n3", "type", "type_detail", "type_org", "w1", "w2", "w3", "term_full", "pron1", "pron2"]
        x = x[["term", "type_detail", "term_full", "type_org"]]
        x["term"] = x["term"].astype(str).apply(lambda x: mojimoji.zen_to_han(x, kana=False, digit=True, ascii=True))
        x.query('type_org == "組織"', inplace=True)
        data.append(x)

    df = pd.concat(data)
    df.sort_values(by=["term"], inplace=True)
    df["term"] = df["term"].str.lower()
   df["term_full"] = df["term_full"].str.lower()
    df.drop_duplicates(subset=["term"], inplace=True)
    df.to_csv(output_name, index=None)


get_noun(globbing="./build/*/*.csv", output_name="neologd-output.csv", encoding="utf8") 

抽出結果

term,type_detail,term_full,type_org
#goodsmile,固有名詞,グッドスマイルカンパニー,組織
(有) anaheim electoronics,固有名詞,有限会社anaheim electoronics,組織
(有) c.c.s,固有名詞,有限会社c.c.s,組織
(有) den,固有名詞,有限会社den,組織
(有) drf,固有名詞,有限会社drf,組織
(有) fujiテクニカル,固有名詞,有限会社fujiテクニカル,組織
(有) g&l,固有名詞,有限会社g&l,組織
(有) grjタフシステムズ,固有名詞,有限会社grjタフシステムズ,組織
(有) heiテクニカル,固有名詞,有限会社h・e・i・テクニカル,組織
(有) h・e・i・テクニカル,固有名詞,有限会社h・e・i・テクニカル,組織
(有) ishida建装,固有名詞,有限会社ishida建装,組織
(有) ja.zooo,固有名詞,有限会社ja.zooo,組織
(有) kimアセント,固有名詞,有限会社kimアセント,組織
...


分析analytics Share Tweet