TL;DR
Japanese Company Lexiconを使って形態素解析(MeCab)ベースの企業名抽出器をpythonで作ります。
環境は以下を想定しています。
macOS Catalina
Homebrew 2.7.1
python 3.9
事前準備
JCLdicのダウンロード
READMEからJCL_mediumのMeCab Dicをダウンロードして解凍してください。
jcl_medium_mecab.dic
が必要なファイルです。
MeCabインストール
mecab入ってない場合はインストールしてください。
今回はbrewでinstallします。
辞書にmecab-ipadicを使います。
brew install mecab
brew install mecab-ipadic
MeCabのuserdict設定
MeCabのuserdict設定のためdicファイルを置くために、任意の場所にディレクトリ作成します。
今回は/usr/local/lib/mecab/dic/user_dict
に作成しました。
解凍したmecab dict jcl_medium_mecab.dic
を作成したディレクトリ配下に移動します。
mkdir /usr/local/lib/mecab/dic/user_dict
mv jcl_slim_mecab.dic /usr/local/lib/mecab/dic/user_dict
mecabrcの変更
userdictを準備したら、mecabの辞書情報を変更するためにMeCabの設定ファイルであるmecabrcを登録します。
mecabrcは、install方法によって場所が変わるかもしれませんが、brewでinstallした場合/usr/local/etc/mecabrc
にあります。
;
でコメントになっている;userdic = <file path>
を↑でおいたファイルのパスに変更します。
userdic = /usr/local/lib/mecab/dic/user_dict/jcl_slim_mecab.dic
動作確認
まずはconsoleで辞書が反映されているか確認しましょう。
>>> echo "ビザスクで働いています。" | mecab
ビザスク 名詞,固有名詞,組織,*,*,*,株式会社ビザスク,*,*
で 助詞,格助詞,一般,*,*,*,で,デ,デ
働い 動詞,自立,*,*,五段・カ行イ音便,連用タ接続,働く,ハタライ,ハタライ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
い 動詞,非自立,*,*,一段,連用形,いる,イ,イ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
EOS
ビザスクが名詞,固有名詞,組織,*,*,*,株式会社ビザスク,*,*
と表示してされているのでOKです。
python
次にpythonでMeCabを使う準備をします。
library install
まずpython用のライブラリをinstallします。
pip install mecab-python3
これで準備は完了です。
code
以下のcodeで企業名を抽出します。
import unicodedata
import MeCab
# MeCabの設定
tagger = MeCab.Tagger('-r /usr/local/etc/mecabrc')
def extract_company(text):
# textのnormalize
text = unicodedata.normalize('NFKC', text)
node = tagger.parseToNode(text)
result = []
while node:
# node feature: 品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
features = node.feature.split(',')
if features[2] == '組織':
result.append(
(node.surface, features[6])
)
node = node.next
return result
ポイントは2つです。
1つ目は、MeCab.Taggerの引数に参照するmecabrcを-rオプションで指定しすることです。
2つ目は、テキストをparseする前に正規化することです。
JCLdicは辞書サイズと検索速度とのトレードオフの結果、全角を使わず半角のみ使っているようなのでパースするテキストを半角に正規化しておく必要があります。
JCLdicでは、原型に株式会社ビザスクのような正式名称が入っているので原型を抽出することで、企業の正式名称を抽出することができます。
出力
texts = [
"ビザスクでエンジニアとして働いています。",
"三菱UFJモルガンスタンレー証券とガーディアンアドバイザーズでの経歴",
"キャノン株式会社で経営監理を5年経験しました。",
]
for text in texts:
companies = extract_company(text)
print("text: ", text)
for company in companies:
print("キーワード: {}, 正式名称: {}".format(company[0], company[1]))
text: ビザスクでエンジニアとして働いています。
キーワード: ビザスク, 正式名称: 株式会社ビザスク
キーワード: エンジニア, 正式名称: 株式会社エンジニア
text: 三菱UFJモルガンスタンレー証券とガーディアンアドバイザーズでの経歴
キーワード: 三菱UFJモルガンスタンレー証券, 正式名称: 三菱UFJモルガン・スタンレー証券株式会社
キーワード: ガーディアンアドバイザーズ, 正式名称: ガーディアン・アドバイザーズ株式会社
text: キャノン株式会社で経営監理を5年経験しました。
キーワード: キャノン株式会社, 正式名称: キヤノン株式会社
キーワード: 経営監理, 正式名称: 有限会社経営監理
日本の会社名が多く収録されている辞書なので、一般名詞の会社名がでてくるため用途によっては使いにくいかもしれません。
その際は、抽出したくないキーワードをstopwordとして扱い、node.surface
がstopwordだった場合スキップする処理を入れるなどの工夫が必要です。