ナード戦隊データマン

データサイエンスを用いて悪と戦うぞ

posregex: POSタグ正規表現による抽出器

品詞タグによる正規表現抽出器とは、名詞や動詞といった品詞を指定して文から語などを抽出するものです。ここでは、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

生産的に過ごすために、「週一でいいからなにかコードを書き、投稿する」ことにしている。