PythonでJanomeを使って形態素解析

JanomeはPythonで書かれた形態素解析のライブラリです。
インストールが簡単で、Mecabをインストールできない環境でも使用できる点が魅力です。

Janomeのインストール

次のコマンドでインストールできます。

pip install janome

Janomeの使い方

Tokenizerをインポートします。

>>> from janome.tokenizer import Tokenizer

Tokenizerオブジェクトを作ります。

>>> tokenizer = Tokenizer()

Tokenizerオブジェクトのtokenize()メソッドに解析する文字列を渡します。
返り値はTokenオブジェクトのlistです。

>>> for token in tokenizer.tokenize("すもももももももものうち"):
...     print(token)
...
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

tokenize()メソッドの引数streamにTrueを指定すると、返り値がgeneratorになります。

tokenize()メソッドの引数wakatiにTrueを指定すると、返り値が表層形(surface)のみになります。

>>> for token in tokenizer.tokenize("すもももももももものうち", wakati=True):
...     print(token)
...
すもも
も
もも
も
もも
の
うち

Tokenオブジェクトは、次のインスタンス変数を持ちます。

surface (表層形)
part_of_speech (品詞)
infl_type (活用型)
infl_form (活用形)
base_form (基本形)
reading (読み)
phonetic (発音)
node_type

実行例

>>> tokens = tokenizer.tokenize("吾輩は猫である")
>>> print(tokens[0])
吾輩    名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ
>>> tokens[0].surface
'吾輩'
>>> tokens[0].part_of_speech
'名詞,代名詞,一般,*'
>>> tokens[0].infl_type
'*'
>>> tokens[0].infl_form
'*'
>>> tokens[0].base_form
'吾輩'
>>> tokens[0].reading
'ワガハイ'
>>> tokens[0].phonetic
'ワガハイ'

part_of_speechはカンマ区切りなので、次のようにして値を取得できます。

>>> tokens[0].part_of_speech.split(',')[0]
'名詞'
>>> tokens[0].part_of_speech.split(',')[1]
'代名詞'
>>> tokens[0].part_of_speech.split(',')[2]
'一般'
>>> tokens[0].part_of_speech.split(',')[3]
'*'

最後に

実行環境

  • Linux Mint
  • Python バージョン3.5.2
  • Janome バージョン0.3.5

jupyter notebookにmatplotlibを使ってグラフを描画する

jupyter notebookにグラフを表示するためのおまじない

%matplotlib notebook

または

%matplotlib inline

notebookはグラフを操作できる。

inlineはグラフが画像になる。

グラフを書いてみる

%matplotlib notebook
# ライブラリの読み込み
import matplotlib.pyplot as plt
# グラフを描画する
plt.plot([1,2,3,4])

X軸、Y軸の値を指定する

%matplotlib notebook
import matplotlib.pyplot as plt
# X軸、Y軸の値を指定する
plt.plot([1,2,3,4], [2,4,6,8])

直線以外の描画

青円

plt.plot([1,2,3,4], [2,4,6,8], 'bo')

赤い下向き三角

plt.plot([1,2,3,4], [2,4,6,8], 'rv')

指定できる文字列は「Matplotlib documentation」を参照。

plt.plot([1,2,3,4], [2,4,6,8], 'bo')
plt.plot([1,2,3,4], [4,3,2,1], 'rv')
plt.plot([1,2,3,4], [7,7,7,7], 'g*')
plt.plot([1,2,3,4], [6,6,6,6], 'mp')

グラフにラベルをつける

%matplotlib notebook
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])

# X軸のラベル
plt.xlabel('X Label')
# Y軸のラベル
plt.ylabel('Y Label')

軸の設定

X軸Y軸の範囲を指定する

%matplotlib notebook
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.xlabel('X Label')
plt.ylabel('Y Label')

plt.axis([1,5,1,8])

axisの引数は、[X軸最小値, X軸最大値, Y軸最小値, Y軸最大値]となる。

X軸Y軸を表示しない

plt.axis('off')

他にも、’equal’,’scaled’,’tight’,’image’などの設定がある。

関数を描画

%matplotlib notebook
import matplotlib.pyplot as plt
import numpy

def sigmoid(x):
    return 1 / (1 + numpy.exp(-x))

x = numpy.arange(-5, 5, 0.1)
plt.plot(x, sigmoid(x))

Pythonでテキストファイルの改行コードをCRLFからLFに変換するには

Pythonでテキストファイルの改行コードをCRLFからLFに変換したい。

文字列を改行コードを指定してテキストファイルに保存する方法が見つからなかった。

バイト列にして保存することで実現できた。

環境

  • Windows 10
  • Python 2.5.1

手順

(1) 改行コードがCRLF(\r\n)になっているテキストファイルを読み込む。

with open('test1.txt', 'r', encoding='utf-8') as a_file:
  txt = a_file.read()

(2) 改行コードCR(\r)を削除する。

txt = txt.replace('\r', '')

(3) ファイルをバイナリモードで開く。

with open('test2.txt', 'wb') as a_file:

(4) ファイルに、文字列をUTF-8のバイト列にして保存します。

a_file.write(txt.encode('utf-8'))

ソースコード

#! python3

# テキストファイルから文字列を読み込む
with open('test1.txt', 'r', encoding='utf-8') as a_file:
  txt = a_file.read()

# 読み込んだ文字列のCR(\r)を削除する。
txt = txt.replace('\r', '')

# ファイルをバイナリモードで開く
with open('test2.txt', 'wb') as a_file:
  # 文字列をバイト列にして保存する
  a_file.write(txt.encode('utf-8'))

Sphinxでテーマをカスタマイズしたときの備忘録

Sphinxでテーマをカスタマイズしたときの手順を記録しておきます。

Sphinxのバージョンは、執筆時点での最新の「Sphinx 1.4a1」。

sphinx_rtd_themeの導入

Sphinxのテーマには「sphinx_rtd_theme」を使用しました。
sphinx_rtd_themeを使うには、conf.pyを編集します。

import sphinx_rtd_theme
html_theme = "sphinx_rtd_theme"
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]

HTMLファイルを出力して、テーマが適用されていることを確認します。

make html

テーマのカスタマイズ

パンくずリストの先頭が「Docs」になっていてわかりにくいので、プロジェクト名を表示するように変更します。

001

sphinx_rtd_themeのソースコードを見ると、パンくずリストの部分はは「breadcrumbs.html」に記述されていました。

<div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
    <li><a href="{{ pathto(master_doc) }}">Docs</a> &raquo;</li>
      {% for doc in parents %}
          <li><a href="{{ doc.link|e }}">{{ doc.title }}</a> &raquo;</li>
      {% endfor %}

Sphinxのプロジェクトのフォルダーに新しいフォルダーを作成し、フォルダーの名前をテーマ名と同じ名前にします。

├sphinx_rtd_theme/ ←新しいフォルダーを作成する
├_static/
├_templates/
├conf.py
├index.rst
├make.bat
└Makefile

作成したフォルダーにsphinx_rtd_themeの「breadcrumbs.html」をコピーします。

├sphinx_rtd_theme/
│└breadcrumbs.html ←コピーする
├_static/
├_templates/
├conf.py
├index.rst
├make.bat
└Makefile

コピーした「breadcrumbs.html」の「Docs」を「{{ project }}」に変更します。

<div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
  <li><a href="{{ pathto(master_doc) }}">{{ project }}</a> &raquo;</li>
      {% for doc in parents %}
          <li><a href="{{ doc.link|e }}">{{ doc.title }}</a> &raquo;</li>
      {% endfor %}
    <li>{{ title }}</li>

conf.pyを編集し、テーマのファイルを読み込むフォルダーを変更します。」

html_theme_path = ["."]

sphinx_rtd_themeフォルダーにtheme.confを作成します。
theme.confにはテーマの設定を記述します。

├sphinx_rtd_theme/
│├breadcrumbs.html
│└theme.conf ←作成する
├_static/
├_templates/
├conf.py
├index.rst
├make.bat
└Makefile

theme.confに次の行を追加します。

[theme]
inherit = sphinx_rtd_theme

inheritは継承元のテーマを指定します。

HTMLファイルを作成します。

make clean html

作成されたファイルを確認します。
「Docs」の文字かプロジェクト名に変更されました。

002