固有名詞の抽出方法について
概要
- テキスト生成の文脈などで固有名詞・組織名の一覧を知りたい場合がある
- 固有名詞は必ずしも商標登録されたような単語と同じではない
一般名詞ではないだろう固有名詞を取り出す
-
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アセント,組織
...