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）](http://qiita.com/taiponrock/items/f574dd2cddf8851fb02c)
### 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"を適当なフォルダに配置

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

```py3: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"の中身をカスタマイズ
主にいじる箇所は３つです。
１、読み込むエクセルファイルのパスを追記
 windowsの場合、ファイルのパスが"C:\Users（仮）\〜\Documents（仮）\〜"というような形だとおもいますので、それを追記します。
（ファイルのパスがわからない場合、ファイル名にマウスを当て、```shift + 右クリック```して、```パスとしてコピー```をクリックすればファイルのパスを取得できます。）
２、書き出すエクセルファイル（形態素解析）のパスを追記
３、書き出すエクセルファイル（語彙出現ランキング）のパスを追記

（４）形態素解析の中身まで変えたい場合

```py3: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ディレクターしてた時に書いたものです。(2022年現在)

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

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