5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JCLdicを使ってpythonで企業名抽出器をつくる

Posted at

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だった場合スキップする処理を入れるなどの工夫が必要です。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?