1
1

More than 1 year has passed since last update.

エロマーケットプレースの研究シリーズ 4: MeCab にサイトに出てくる未知語のエロ単語を登録

Last updated at Posted at 2022-05-24

前回は

MeCab のインストールと、ユーザー辞書を構築するための環境を作った

今回は

前々回クロールしたサイトのタグ情報を MeCab の単語として登録していく部分を作っていく

コード書く

import numpy as np
import pandas as pd
import re
import MeCab
import subprocess
import os

# MeCab のシステム辞書 NEOLogd のディレクトリを取得
dicdir = subprocess.run(['mecab-config', '--dicdir'], capture_output=True).stdout.decode('utf-8').strip()
neologd_dir = os.path.join(dicdir, 'mecab-ipadic-neologd')

# 前々回クロールしてきた情報を読み込む
df = pd.read_csv('output.csv')

# タグを数えるための辞書
tag_count_dict = dict()

for index, row in df.iterrows():
    tags_str = row['tags']

    # 空のカラムは nan になっちゃうので nan の場合は無視
    if type(tags_str) != str:
        assert np.isnan(tags_str)
        continue

    tags = tags_str.split(',')

    # タグの出現回数を数える
    for tag in tags:
        # 最初に # から始まるハッシュタグっぽいのは # を除外
        tag = re.sub(r'^#', '', tag)

        if tag not in tag_count_dict:
            tag_count_dict[tag] = 0
        tag_count_dict[tag] += 1

# 2 回以上使われてるタグを抽出
tag_list = np.array(sorted(tag_count_dict.items(), reverse=True, key=lambda pair: pair[1]))[:,0]

# 未知語抽出
unknown_tag_list = []
unknown_tagger = MeCab.Tagger(f'--unk-feature __unk__ -d {neologd_dir}')
for tag in tag_list:
    if unknown_tagger.parse(tag).split()[1] == '__unk__':
        unknown_tag_list.append(tag)

tagger = MeCab.Tagger(f'-d {neologd_dir}')
for tag in unknown_tag_list:
    # 未知語を MeCab で parse
    # (これで既知語の組み合わせとして取得できれば、そこから読みがわかる)
    tag_component_line_list = tagger.parse(tag).splitlines()

    # 既知語の単語を組み合わせて、雑に読みを作っていく
    yomi_component_list = []
    for tag_component_line in tag_component_line_list:
        if tag_component_line == 'EOS':
            break;
        tag_component, features_str = tag_component_line.split()
        features = features_str.split(',')
        
        # 既知語として取得できるか確認
        if len(features) > 7 and features[7] != '*':
            # 読みの情報を取得
            yomi_component = features[7]
        else:
            # 既存の単語から読みを持ってこれない場合はそのまま
            yomi_component = tag_component

        yomi_component_list.append(yomi_component)

    # 既知語の読みを組み合わせて、未知語の読みにする
    yomi = ''.join(yomi_component_list)

    # CSV として stdout に出す
    new_features = (tag, '', '', '', '名詞', '一般', '*', '*', '*', '*', tag, yomi, yomi, '追加エントリ')
    print(','.join(new_features))

こんな感じ

実行

さっき書いたコードを実行して、リダイレクトして ero_words.csv を作る

それを前回作った make_dic.sh を実行して dic ファイル化する

結果

mecab を実行してみる

$ mecab -d "$(mecab-config --dicdir)/mecab-ipadic-neologd"
彼女は彼のクリフェラでアヘオホとイキ声を晒した
彼女	名詞,代名詞,一般,*,*,*,彼女,カノジョ,カノジョ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
彼	名詞,代名詞,一般,*,*,*,彼,カレ,カレ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
クリフェラ	名詞,一般,*,*,*,*,クリフェラ,クリフェラ,クリフェラ,追加エントリ
で	助詞,格助詞,一般,*,*,*,で,デ,デ
アヘオホ	名詞,一般,*,*,*,*,アヘオホ,アヘオホ,アヘオホ,追加エントリ
と	助詞,並立助詞,*,*,*,*,と,ト,ト
イキ声	名詞,一般,*,*,*,*,イキ声,イキゴエ,イキゴエ,追加エントリ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
晒し	動詞,自立,*,*,五段・サ行,連用形,晒す,サラシ,サラシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ

このように、クリフェラ、アヘオホ、イキゴエなどが登録された

これから

ero_words.csv は我が子のようにちゃんと育てて行こうと思う

次回は

前々回クロールしたデータを LightGBM を使って、特徴の重要度を測っていく

1
1
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
1
1