2022年12月20日火曜日

mecab-neologd(3)

mecab-neologd(2)からの続き

とりあえず,最新単語を含む形態素解析のmecab-ipadic-neologdが使えるようになった。次の課題は,これをpython プログラムの中から使えるようにすることだ。これは事例がたくさんころがっていたので,そのまま写経してみた。

2018年,Qiitaにsudo5in5kさんが書いた,mecab + NEologd + python3 で形態素解析という記事があるのでそのまま使える。import MeCab のCが小文字のtypoになっているところでつまづいた。その後,辞書ディレクトリを自分の環境に合わせて指定したところ,青空文庫の人間失格のテキストファイルをとってきて,無事に形態素分解した結果が出力された。

そこで,入出力ファイルをコマンドラインで指定し,任意のテキストファイルを変換できるように数行だけ修正したのが以下のコードである(ほぼsudo5in5kさんのもの)。

#!/opt/homebrew/bin/python3


# usage: aozora.py infile outfile

# infile is taken from https://www.aozora.gr.jp -> txt download


import MeCab

import re

import sys


infile = sys.argv[1]

outfile = sys.argv[2]


bindata = open(infile, 'rb').read()

textdata = bindata.decode('shift_jis')


# 青空文庫のための固有処理

textdata = re.split(r'\-{5,}', textdata)[2]

textdata = re.split(r'底本:', textdata)[0]

textdata = textdata.strip()


# 人によっては以下のパスは異なるので確認してね

mecab = MeCab.Tagger('-d /opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd')

mecab.parse('')  # バグ対処

results = []

lines = textdata.split("\r\n")

for line in lines:

    r = []

    # 学習に使わない表現の削除処理

    s = line

    s = s.replace("|", "")

    s = re.sub(r'《.+?》', "", s)

    s = re.sub(r'[.+?]', '', s)

    # Mecab

    node = mecab.parseToNode(s)

    while node:

        # 単語を取得

        if node.feature.split(",")[6] == '*':

            word = node.surface

        else:

            word = node.feature.split(",")[6]


        # 品詞を取得

        part = node.feature.split(",")[0]


        if part in ["名詞", "形容詞", "動詞", "記号"]:

            r.append(word)

        node = node.next

    rl = (" ".join(r)).strip()

    results.append(rl)


# write to a file

with open(outfile, 'w', encoding='utf-8') as wf:

    wf.write("\n".join(results))

0 件のコメント: