品詞タグによる正規表現抽出器とは、名詞や動詞といった品詞を指定して文から語などを抽出するものです。ここでは、30行程度のコードで実行できることを確認します。
事前準備
mecabのインストール
git clone https://github.com/taku910/mecab && \ cd mecab/mecab && \ ./configure --enable-utf8-only && \ make && \ make check && \ make install && \ pip install --no-cache-dir mecab-python3 && \ ldconfig && \ cd ../mecab-ipadic && \ ./configure --with-charset=utf8 && \ make && \ make install
コード
import re import MeCab class PosReg: def __init__(self, mecab_option=""): self.tagger = MeCab.Tagger(mecab_option) def regex_replace(self, regex, sep=","): reg_cp = regex.replace(" ", "") reg_cp = reg_cp.replace("詞", "詞{}?".format(sep)) reg_cp = reg_cp.replace("号", "号{}?".format(sep)) reg_cp = re.compile(r"{}".format(reg_cp)) return reg_cp def finditer(self, regex, sentence, sep=","): tmp = [x.split("\t") for x in self.tagger.parse(sentence).split("\n") if '\t' in x] reg_cp = self.regex_replace(regex, sep) pattern = sep.join([x[1].split(",")[0] for x in tmp]) + sep words = [x[0] for x in tmp] for m in reg_cp.finditer(pattern): start, length = m.start(), len(m.group()) end = start + length i1 = pattern[:start].count(sep) i2 = pattern[:end].count(sep) yield words[i1:i2]
実行
以下でパッケージ化して公開しました。 https://github.com/sugiyamath/posregex
例えば、「名詞または動詞」に対して「助詞または助動詞」が続く表現を取得する正規表現は
(名詞|動詞)(助詞|助動詞)
となります。単純な句を抽出するには便利そうな表現です。これを以下のように抽出できます:
import posregex.posregex as pr p = pr.PosReg() regex = r"(名詞|動詞)(助詞|助動詞)" sent = "イチローがヒットを打った" value = list(p.finditer(regex, sent)) print(value)
[出力]
[["イチロー","が"],["ヒット","を"],["打っ","た"]]
追記
2018-12-15 7:14
生産的に過ごすために、「週一でいいからなにかコードを書き、投稿する」ことにしている。