Help us understand the problem. What is going on with this article?

Python初心者が1時間以内にjanomeで形態素解析できた方法

Python初心者(プログラミング未経験者含む)が1時間以内に何らかの文章(複数可)をPythonのjanomeで形態素解析する方法、解析した語彙の出現頻度を調べる方法を紹介します。

準備するもの:
パソコン、形態素解析したい文章・語彙の出現頻度を調べたい文章

環境:
windows7,Python3.6.2, janome0.3.3
mac等でできなかったらすいません。

活用例:
メルマガやブログのタイトル・本文に含まれるワードの出現頻度調査(効果が高い・低いメルマガ・ブログはどんなワードが多く含まれているか)

※今回、エクセルから文章を読み取って形態素解析します。エクセルは1列目しか使用しませんが、複数行の登録も可能です。文章の量にもよりますが、2万行くらいいけます。(1列目にばーっと下へ文章が並ぶイメージ。一文でも可)

1列目(1行目から文章をいれてください)
文章1
文章2
文章3
文章4
....

Pythonインストール〜形態素解析・語彙出現ランキング作成まで

  • "Python"をインストール
  • 形態素解析ライブラリ"janome"インストール
  • エクセル読み込みライブラリ"xlrd"インストール
  • エクセル書き込みライブラリ"xlsxwriter"インストール
  • 下記"sample.py"を適当なフォルダに配置
  • "sample.py"の中身をカスタマイズ
  • sample.pyをコマンドプロンプトで実行
    • エクセル読み込み
    • 読み込んだファイルを形態素解析
    • 解析結果をエクセルに出力
    • 解析結果を元に、語彙の出現頻度をランキング形式でエクセルに出力
  • 完成

"Python"をインストール

https://www.python.org/downloads/
上記リンクから適当にPythonの最新版をインストールしてください。
やり方はこちらの記事に書いてあります。(macもいけそうな気がします)
Pythonをインストールする(for Windows)

Pythonバージョン確認

インストールが終わったらPythonのバージョンを確認してください
コマンドプロンプトを開いて、python -V と入力してEnter
※コマンドプロンプトの開き方...スタートメニュー>すべてのプログラム>アクセサリ
バージョン名がでたらインストール成功しています!

形態素解析ライブラリ"janome"インストール

コマンドプロンプトを開いて、
pip install janomeと実行

もっとjanomeについて知りたい方はこちら↓
http://ailaby.com/janome/
http://mocobeta.github.io/janome/

エクセル読み込みライブラリ"xlrd"インストール

コマンドプロンプトを開いて、
pip install xlrdと実行

もっとxlrdについて知りたい方はこちら↓
http://www.python-izm.com/contents/external/xlrd.shtml

エクセル書き込みライブラリ"xlsxwriter"インストール

コマンドプロンプトを開いて、
pip install xlsxwriterと実行

もっとxlsxwriterについて知りたい方はこちら↓

http://qiita.com/yubessy/items/a39a565cdc2c5872cce9
http://xlsxwriter.readthedocs.io/getting_started.html

下記"sample.py"を適当なフォルダに配置

下記サンプルプログラムの概要:
・エクセルから文章を読み取り形態素解析
・名詞の語彙を抽出
・文章を名詞ごとに分解したデータをエクセルにエクスポート
・語彙の出現回数が多い順にランキング化し、その順番で「語彙・出現回数」をエクセルにエクスポート

sample.py
# -*- coding: utf-8 -*-
import xlrd
import xlsxwriter
from collections import Counter
from itertools import chain
from janome.tokenizer import Tokenizer

## Excelファイル読み込み
# 例)C:\Users\〜\Documents\〜
# ファイル名の前に'r'を入れてください。理由:rを使うとraw文字列として扱われ、エスケープシーケンスとして処理されなくなります。(わからなければスルーしてください)
book = xlrd.open_workbook(r"エクセルファイルのパスを入れてください")

# エクセルシートの1枚目を変数に格納
sheet_1 = book.sheet_by_index(0)
# 1列目のみ読み取るのでcol(columnの略)に0を格納(0が1番目を表す為)
col = 0
data = []
each_data = []
# 1列目に記載されているすべてのセルを1行目から順に読み取ります
t = Tokenizer()
for row in range(sheet_1.nrows):
    val = sheet_1.cell(row, col).value
    tokens = t.tokenize(val)
    for token in tokens:
        partOfSpeech = token.part_of_speech.split(',')[0]
        # 今回抽出するのは名詞だけとします。(もちろん他の品詞を追加、変更、除外可能です。)
        if partOfSpeech == u'名詞':
            each_data.append(token.surface) # token.surfaceは表層形(語彙)です。詳しくはこちら...http://ailaby.com/janome/
        # すべての形態素を含ませたいのであればif構文を外し、each_data.append(token.surface)のみ記載してください。
    data.append(each_data)
    each_data = []

## 文章を形態素毎に分割したデータをいれるエクセルファイル作成(今回は名詞のみ)
# 例)C:\Users\〜\Documents\〜
# パスの前のrは省略しないでください
data_book = xlsxwriter.Workbook(r"作成するエクセルファイルのパス")
# シート作成・変数定義
data_sheet = data_book.add_worksheet('data')
for row in range(len(data)):
    for i in range(len(data[row])):
        data_sheet.write(row, i, data[row][i])
# エクセルを保存
data_book.close()

#すべての語彙を同じ配列に格納
chain_data = list(chain.from_iterable(data))
c = Counter(chain_data)

result_ranking = c.most_common(100) # 出現頻度100位までを変数に格納
# 語彙出現ランキングを記述するエクセルを作成(パスは上記参考に適当にいれてください)
result_book = xlsxwriter.Workbook(r"エクセルファイルのパスをいれてください")
# resultという名前のシートを作ります
result_sheet = result_book.add_worksheet('result')
for row in range(len(result_ranking)):
    for i in range(len(result_ranking[row])):
        result_sheet.write(row, i, result_ranking[row][i])
# エクセルを保存
result_book.close()

"sample.py"の中身をカスタマイズ

主にいじる箇所は3つです。
1、読み込むエクセルファイルのパスを追記
windowsの場合、ファイルのパスが"C:\Users(仮)\〜\Documents(仮)\〜"というような形だとおもいますので、それを追記します。
(ファイルのパスがわからない場合、ファイル名にマウスを当て、shift + 右クリックして、パスとしてコピーをクリックすればファイルのパスを取得できます。)
2、書き出すエクセルファイル(形態素解析)のパスを追記
3、書き出すエクセルファイル(語彙出現ランキング)のパスを追記

(4)形態素解析の中身まで変えたい場合

python
for token in tokens:
        partOfSpeech = token.part_of_speech.split(',')[0]
        # 今回抽出するのは名詞だけとします。(もちろん他の品詞を追加、変更、除外可能です。)
        if partOfSpeech == u'名詞':
            each_data.append(token.surface) # token.surfaceは表層形です(詳しくはこちら...http://ailaby.com/janome/)

ここらへんの中身を変えてください。現状は語彙を名詞で絞り、且つ表層形(token.surface)のみデータを抽出しています。※必要に応じて、エクセルの読み取り方法、エクセルの書き出し方法も整えてください。

"sample.py"をコマンドプロンプトで実行

sample.pyが置いてあるフォルダまで、コマンドプロンプトで移動します。
...
移動!???となった方、移動の方法やその他諸々下記の通り紹介します。

  • Windowsの方

cd,dirというコマンドを使えば、とりあえずフォルダまでたどり着けるとおもいます。
http://www.atmarkit.co.jp/ait/articles/1502/13/news147.html
https://www.k-tanaka.net/cmd/cd.php
https://www.k-tanaka.net/cmd/dir.php

  • Mac(linux)の方

pwd,cd,lsというコマンドを使えば、とりあえずフォルダまでたどり着けるとおもいます。
https://do-zan.com/mac-terminal-command-shortcut/

たどり着きましたら、python sample.pyプログラム実行
解析したい文章量に応じて実行時間が変わります。(
1文約30文字で10000行くらいまでは約3分でいけました。)

完成

お疲れ様でした!
プログラムで作成したエクセルを開いてみてください。開けなかったりエラーが起きていたらすいません。。

まとめ

お役に立てましたでしょうか。
ちなみに私はこれ以上Python無知です。(2019年9月訂正) → 大手転職会社でwebディレクター兼システム開発 -> 某メディア会社でエンジニア -> 現在はドローンメーカーでエンジニアをしております。本記事はwebディレクターしてた時に書いたものです。

プログラムの内容はもしわからなければ調べてみてください!

閲覧いただきありがとうございました!!

d-cabj
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした