好きな品詞の組み合わせのフレーズを抜き出すPythonパッケージ「negima」を作った

日本語の自然言語処理が絡んだ作業をする際に、

  • 名詞だけ抜き出したい
  • 名詞だけ抜き出したいが、接頭詞の「未」「非」とかもくっつけて抜き出したい
  • 形容詞を抜き出したいが、否定の「ない」もくっつけて抜き出したい

みたいに形態素解析をしたあとに形態素同士をつなげてフレーズの抽出をしたいシチュエーションがよくあると思う。

そういった特定の品詞の組み合わせをルールを定義することで、フレーズを抜き出せるPythonパッケージ「negima」を作った。

概要

例えば複合名詞を抽出したい場合、このようなルールを定義する。

id min max pos0 pos1 pos2 pos3 pos4 pos5
nouns 0 2 接頭詞
1 4 名詞 一般|サ変接続|数
0 2 名詞 接尾

このルールをnoun.csvとしてファイルに定義したとすると、

  1. 0個以上2個以下の接頭詞ではじまり、
  2. 1個以上4個以下の名詞(一般orサ変接続or数)があり、
  3. 0個以上2個以下の名詞(接尾)を持つ

ような、フェーズを以下のコードで抽出することができる。

sample.py

from negima import MorphemeMerger
mm = MorphemeMerger()
mm.set_rule_from_csv('noun.csv')

words, _ = mm.get_rule_pattern('約5000人が国立競技場に駆けつけた')
print(words)
$ python sample.py
['約5000人', '国立競技場']

内部的には、定義されたルールから以下のような木構造を作成し、matchするかを確かめている。 f:id:cocodrips:20180820144644p:plain

詳しいルールの書き方はリポジトリREADME.mdに書いてあるが、 ルールファイルはcsv/tsv/エクセルで定義することが可能で、複数のルールを同時に定義することができる。

ルールの定義順は関係なく、id列につけたルールの名前によりsortされ、小さい順に優先度が高いルールとなる。

例えば以下のような複数のルール定義する。

id min max pos0 pos1 pos2 pos3 pos4 pos5
999_noun 名詞
100_set 1 4 名詞
助詞 格助詞 係助詞
形容詞 自立
0 助動詞 特殊・ナイ
200_verb 動詞 自立
0 助動詞 特殊・ナイ

レベルが低すぎてボスに勝てない という文章から抽出を行うと、

  • レベルが低い: 100_set
  • ボス: 999_noun
  • 勝てない: 200_verb

の3パーツになる。 レベルは名詞なので 999_noun のルールにも引っかかるが、100_set のルールのほうが優先度が高いため、そちらの組み合わせが優先される。

インストール

pypiに登録してみた。 pypi.org

利用するには

  • Python3.4以上
  • mecabのインストール

が必要になる。これらを満たせば、

$ pip install negima

でインストールできる。

さいごに

こういうのあるでしょって思って調べたんだけどなかなか見つけられなくて、 仕事で使うために作ったんだけど、結構便利だったのでpypiに登録してみました。
(パッケージ名は可愛い名前の食べ物のなかでpypiにないやつを探した!パーツを組み合わせる感じはねぎまっぽさあると思う!)

不具合等あればissue/PRだしていただければ嬉しいです。
GitHub - cocodrips/negima

古いバージョンのR(2系)の環境を作る

仕事の都合でRの2.15を使いたい状況になったのだが、 古いバージョンのRの環境を作るのが想像以上に大変だったので、環境構築の仕方を残しておく。

自分のMac上に環境を作ろうとしたのだが、Apple周りのエラーが大量に出現しだいぶ厳しそうだったので諦めた。 ※ちなみにWindowsだと比較的古いRでも環境を作りやすいとのこと。

私の作った環境は CentOS(6) + R(2.15.2) + R studio server

最終的にはDocker上にその環境をつくってlocalhostにlocal port forwardingして、開発をすることにした。

※R 3.0.0以上ならrockerっていうRのimageがあって即RStudio Server建てられるよ!!

RをCentOSにInstallする

Rのsourceはhttps://cran.r-project.org/src/base/のR-0 ~ R-3から入手できる。ビルド済みのものが動けばそれが一番簡単なのだけど、 難しそうだったのでsourceからビルドする。 今回は2.15.2を入れる想定でかいていく

# Rのビルドに必要なライブラリのinstall
yum install -y gcc-gfortran libgfortran gcc-c++ make cmake perl readline-devel 
yum install -y xorg-x11-server-devel libX11-devel libXt-devel

# RのsourceをDonwload
# ほかのバージョンを入れたいときは上記リンクからurlを探す
cd
curl -O https://cran.r-project.org/src/base/R-2/R-2.15.2.tar.gz
tar -zxvf R-2.15.2.tar.gz
cd R-2.15.2

./configure --prefix=/opt/R/2.15.2 --enable-R-shlib
make -j 4 # -j 4は並列してmakeしたいだけなのでなくても
make install 
ln -sF /opt/R /usr/local/lib64/R
ln -sF /usr/local/lib64/R/2.15.2/bin/R /usr/local/bin

これで RコマンドがうごけばOK

RStudio Serverをインストールする

Rだけ入れても多分大抵の人には使うのが難しいのでRStudio Serverをたてる。サーバをたてると、Web上からRstudioを使えるようになる。

https://www.rstudio.com/products/rstudio/download-server/

ここにあるようRStudio Serverでは3.0.0以上しか動かないので、 以下から欲しいバージョンのRStudio Serverを確認する。

https://support.rstudio.com/hc/en-us/articles/206569407-Older-Versions-of-RStudio

2.11.1以上なら、以下のver0.99で問題なく動く。

# Install Rstudio server
cd
curl -O https://download2.rstudio.org/rstudio-server-rhel-0.99.903-x86_64.rpm
yum install -y rstudio-server-rhel-0.99.903-x86_64.rpm

rpm -ihv http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm

# 日本語対応
yum -y groupinstall "Japanese Support"
yum install -y initscripts 

# Start Rstudio server
rstudio-server start

Dockerで環境を作る場合

docker-composeファイルを作ったので使いたい方は以下からDL https://github.com/cocodrips/enviroment-old-version-r

Dockerfileの{password}の部分のみ書き換える

docker-compose build
docker-compose up

でサーバーが立ち上がるので、 http://localhost:8787 へアクセスするとログイン画面になる。

  • Username: rstudio
  • Password: 自分で設定した{password}

でログインすればRstudioが使える!やったー!

Dockerfileとdocker-compose

Githubに上がってるけどここにもはっておく

Dockerfile:

FROM centos
RUN yum install -y gcc-gfortran libgfortran gcc-c++ make cmake perl readline-devel 
RUN yum install -y xorg-x11-server-devel libX11-devel libXt-devel

# Install 2.15.2
# Other version: https://cran.r-project.org/src/base/R-2/
RUN cd; curl -O https://cran.r-project.org/src/base/R-2/R-2.15.2.tar.gz
RUN cd; tar -zxvf R-2.15.2.tar.gz
RUN cd ~/R-2.15.2; ./configure --prefix=/opt/R/2.15.2 --enable-R-shlib
RUN cd ~/R-2.15.2; make -j 4 # -j 4は並列してmakeしたいだけなのでなくても
RUN cd ~/R-2.15.2; make install

# [2.11.0 or higher] Use this script.
# [2.11.0 or lower] check document: https://support.rstudio.com/hc/en-us/articles/200552306-Getting-Started
RUN cd; curl -O https://download2.rstudio.org/rstudio-server-rhel-0.99.903-x86_64.rpm
RUN cd; yum install -y rstudio-server-rhel-0.99.903-x86_64.rpm 
RUN rpm -ihv http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
RUN yum -y groupinstall "Japanese Support"
RUN yum install -y initscripts 
RUN ln -sF /opt/R /usr/local/lib64/R
RUN ln -sF /usr/local/lib64/R/2.15.2/bin/R /usr/local/bin
RUN adduser rstudio
RUN echo "rstudio:{password}" | chpasswd

WORKDIR /r
ADD . /r/

docker-compose.yml

version: '3'
services:
  server:
    build: . 
    working_dir: /r
    ports:
      - 8787:8787
    volumes:
      - .:/r
    command: bash -c "rstudio-server start && /bin/bash"
    tty: true

さいごに

多分殆どのRユーザにとって古いRを使いたいことってほとんどないと思うから、誰も幸せになれない記事を書いてしまった・・・ Docker初心者なので冗長だったり無駄なこと書いてる可能性が高い(´・ω・`)