解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Python を exe ファイルに変換する



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方、ファイル選択ダイアログの使い方を調べてきました。
ここで、気分転換に exe ファイルに変換してみたいと思います。

ファイル選択ダイアログでファイルを選択して、選択されたファイルのパスをメッセージボックスで表示する exe ファイルを作成します。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

以下の2つのソースコードは共に下記の【保存ディレクトリ】に保存しました。
ファイルもそれぞれ書いておきます。

【保存ディレクトリ】
C:\WinPython-64bit-3.4.4.6Qt5\settings\.spyder-py3

exe ファイルソースコード : GUI0.py
変換実行ソースコード : GUI_Ex0.0.py

下の『結果』で今回発生したエラーについても、まとめていますが、ファイル名でには要注意です。

exe ファイル ソースコード


###############################################################################
# メッセージボックスとファイル選択ダイアログの GUI プログラム
###############################################################################
# モジュールのインポート
import os, tkinter, tkinter.filedialog, tkinter.messagebox
import sys
 
#==============================================================================
# 設定
#==============================================================================
program_name = 'GUIプログラム' # プログラム名設定
 
flag_type = 0 # 読み込むファイルの形式設定
# 0 : すべてのファイル
# 1 : cvs ファイルのみ
# 2 : xls ファイルのみ
# 3 : xlsx ファイルのみ
# 4 : xls, xlsx ファイルのみ
# 5 : txt ファイルのみ
# 6 : mp3 ファイルのみ
 
flag_multi_select = 1 # ファイル選択可能数設定
# 0 : 単一ファイル選択
# 1 : 複数ファイル選択
 
#==============================================================================
# GUI プログラム
#==============================================================================
# Tk オブジェクトのインスタンス作成
root = tkinter.Tk()
 
# Tk のウィンドウを非表示にする
root.withdraw()
 
# 読み込むファイル形式の設定
if   flag_type == 0:
    fTyp = [("すべてのファイル", "*")]    # すべてのファイル
elif flag_type == 1:
    fTyp = [("csvファイル","*.csv")]    # cvs ファイルのみ
elif flag_type == 2:
    fTyp = [("Excelファイル","*.xls")]  # xls ファイルのみ
elif flag_type == 3:
    fTyp = [("Excelファイル","*.xlsx")] # xlsx ファイルのみ
elif flag_type == 4:
    fTyp = [("Excelファイル","*.xls"),
            ("Excelファイル","*.xlsx")] # xls, xlsx ファイルのみ
elif flag_type == 5:
    fTyp = [("テキストファイル","*.txt")]   # txt ファイルのみ
elif flag_type == 6:
    fTyp = [("音声ファイル","*.mp3")]   # mp3 ファイルのみ
 
# ファイル選択ダイアログのイニシャルディレクトリの設定
#initDir = os.path.abspath(os.path.dirname(__file__))
initDir = 'C:\\'
 
# メッセージボックスの表示
tkinter.messagebox.showinfo(program_name, '処理ファイルを選択してください.')
 
# ファイル選択ダイアログの表示
if flag_multi_select == 0:
    file = tkinter.filedialog.askopenfilename(filetypes = fTyp, initialdir = initDir)
    if file == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, file)
    print(file)
else:
    files = tkinter.filedialog.askopenfilenames(filetypes = fTyp, initialdir = initDir)
    if files == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    l = list(files)
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, l)
    print(l)
 
#==============================================================================
# ファイル処理プログラム
#==============================================================================
 
 
print('\ncomplete!!')



変換実行ソースコード


import sys
from cx_Freeze import setup, Executable
 
base = None
 
if sys.platform == 'win32':
    base = 'Win32GUI'
 
exe = Executable(script='GUI0.py', base=base)
 
setup(name='GUI',
      version='0.1',
      description='converter',
      executables=[exe])



コマンドプロンプト

図1 コマンドプロンプト



結果

上の exe ファイルソースコードを最初は『 GUI0.0.py 』として保存していました。 exe ファイルは生成できたのですが、 exe ファイル実行時に図2 のエラーメッセージが表示されました。

図2 エラーメッセージ


なんのことかよくわかりませんが、『 GUI0.0.py 』というファイルが悪さをしている感じがしたので、exe ファイルソースコードを『 GUI0.py 』というファイル名で保存し直して、再度 exe ファイルに変換しました。

すると、 exe ファイルは生成できたのですが、 exe ファイル実行時に図3 のエラーメッセージが表示されました。

図3 エラーメッセージ


ファイル選択ダイアログで、最初に表示するディレクトリ設定をスクリプトファイルがあるディレクトリとしていたのですが、 exe ファイルに変換すると取得できなくなるみたいなので、 C ドライブ直下を指定する様にソースコードを変更して再度 exe ファイルに変換しました。
すると、正常に動作する様になりました。


exe ファイルは上の2つのソースコードを保存したディレクトリ『 C:\WinPython-64bit-3.4.4.6Qt5\settings\.spyder-py3 』に新しく『 build 』というフォルダができます。その中に exe ファイルと付帯ファイルが出来ています。

起動スピード、実行速度共に普通なスピードでした。

まぁ、簡単なファイル選択のみのプログラムなので当たり前ですが…



コメント

exe ファイルに変換出来ると自動化や効率化に大きく影響してくると思います。

今のプログラムのままでは使い道がないので、もうちょっと実用的なクラス、関数を作って組み込みたいです。



以上

Python で ファイル選択ダイアログを使う



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方を調べました。
まだ、基本的なグラフの書き方だけですが…

今回は ファイル選択ダイアログを使ってみます。

グラフの描き方は少しわかってきたので、グラフにする値の読み込みに少し力を入れたいと思います。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# メッセージボックスとファイル選択ダイアログの GUI プログラム
###############################################################################
# モジュールのインポート
import os, tkinter, tkinter.filedialog, tkinter.messagebox
import sys
 
#==============================================================================
# 設定
#==============================================================================
program_name = 'GUIプログラム' # プログラム名設定
 
flag_type = 0 # 読み込むファイルの形式設定
# 0 : すべてのファイル
# 1 : cvs ファイルのみ
# 2 : xls ファイルのみ
# 3 : xlsx ファイルのみ
# 4 : xls, xlsx ファイルのみ
# 5 : txt ファイルのみ
# 6 : mp3 ファイルのみ
 
flag_multi_select = 1 # ファイル選択可能数設定
# 0 : 単一ファイル選択
# 1 : 複数ファイル選択
 
#==============================================================================
# GUI プログラム
#==============================================================================
# Tk オブジェクトのインスタンス作成
root = tkinter.Tk()
 
# Tk のウィンドウを非表示にする
root.withdraw()
 
# 読み込むファイル形式の設定
if   flag_type == 0:
    extension = [("すべてのファイル", "*")]    # すべてのファイル
elif flag_type == 1:
    extension = [("csvファイル","*.csv")]    # cvs ファイルのみ
elif flag_type == 2:
    extension = [("Excelファイル","*.xls")]  # xls ファイルのみ
elif flag_type == 3:
    extension = [("Excelファイル","*.xlsx")] # xlsx ファイルのみ
elif flag_type == 4:
    extension = [("Excelファイル","*.xls"),
            ("Excelファイル","*.xlsx")] # xls, xlsx ファイルのみ
elif flag_type == 5:
    extension = [("テキストファイル","*.txt")]   # txt ファイルのみ
elif flag_type == 6:
    extension = [("音声ファイル","*.mp3")]   # mp3 ファイルのみ
 
# ファイル選択ダイアログのイニシャルディレクトリの設定
initDir = os.path.abspath(os.path.dirname(__file__))
 
# メッセージボックスの表示
tkinter.messagebox.showinfo(program_name, 'ファイルを選択してください.')
 
# ファイル選択ダイアログの表示
if flag_multi_select == 0:
    file = tkinter.filedialog.askopenfilename(filetypes = extension, initialdir = initDir)
    if file == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, file)
    print(file)
else:
    files = tkinter.filedialog.askopenfilenames(filetypes = extension, initialdir = initDir)
    if files == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    l = list(files)
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, l)
    print(l)
 
#==============================================================================
# ファイル処理プログラム
#==============================================================================
 
 
print('\ncomplete!!')



結果

意外と楽でした。

図1 は実行して表示されたファイル選択ダイアログです。

図1 ファイル選択ダイアログ


図2 は『 dir.txt 』というファイルを選択した時の表示です。

図2 ファイル選択結果表示


図3 は『 dir.txt 』と『 dir1.txt 』いうファイルを選択した時の表示です。

図3 複数ファイル選択結果表示



コメント

グラフ出力のコードと合わせれば、アプリケーションっぽくなると思います。

これをテンプレートみたいに使いまわして、ソースコードの『 # ファイル処理プログラム 』よりも下の行に処理プログラムを入れれば、簡単にいろんなファイルの処理プログラムが作れます。

単一ファイル選択の時は下の様にファイルパスが文字列として取得できます。


In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/GUI0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
C:/Users/UserName/Desktop/dir.txt
 
complete!!



また、複数ファイル選択の時は下の様にファイルパスが配列として取得できます。

In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/GUI0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
['C:/Users/UserName/Desktop/dir1.txt', 'C:/Users/UserName/Desktop/dir.txt']
 
complete!!



以上

Python でパレート図を描く



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方を調べ出しました。

今回はパレート図の描き方をまとめました。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# パレート図を作成するプログラム
###############################################################################
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
 
# グラフの値の準備 ---------------------------------------------------------------
sample_label = ["a", "b", "c", "d", "e", "f", "g"]
np.random.seed(seed=42)
sample_data = np.random.randint(0, 100, size=7)
 
# グラフの値の整形 ---------------------------------------------------------------
sample_df = pd.DataFrame({"label": sample_label, "data":sample_data}, columns=["label", "data"])
 
# グラフの値のソート ---------------------------------------------------------------
sample_df = sample_df.sort_values(by="data", ascending=False)
 
# グラフの値を項目毎に加算する -----------------------------------------------------
sample_df["accum"] = np.cumsum(sample_df["data"])
 
# 全体に対する項目の割合を計算する -------------------------------------------------
sample_df["accum_percent"] = sample_df["accum"] / sum(sample_df["data"]) * 100
 
# グラフの作成 ------------------------------------------------------------------
fig, ax1 = plt.subplots(figsize=(6,4))
 
# データ数のカウント ---------------------------------------------------------------
data_num = len(sample_df)
 
accum_to_plot = [0] + sample_df["accum_percent"].tolist()
 
percent_labels = [str(i) + "%" for i in np.arange(0, 100 + 1, 10)]
 
# 棒グラフのプロット ---------------------------------------------------------------
ax1.bar(range(1, data_num + 1), sample_df["data"], align="edge", width=-1, edgecolor='k')
ax1.set_xticks([0.5 + i for i in range(data_num)], minor=True)
ax1.set_xticklabels(sample_df["label"].tolist(), minor=True)
ax1.tick_params(axis="x", which="major", direction="in")
ax1.set_ylim([0, sum(sample_df["data"])])
 
# 横軸に名前をつける -------------------------------------------------------------
ax1.set_xlabel("label")
 
# 縦軸に名前をつける -------------------------------------------------------------
ax1.set_ylabel("counts")
 
# 第 2 軸のグラフの作成 ----------------------------------------------------------
ax2 = ax1.twinx()
 
# 押せ連グラフのプロット ------------------------------------------------------------
ax2.set_xticks(range(data_num + 1))
ax2.plot(range(data_num + 1), accum_to_plot, c="red", marker="o")
ax2.set_xticklabels([])
ax2.set_xlim([0,data_num])
ax2.set_ylim([0, 100])
ax2.set_yticks(np.arange(0, 100 + 1, 10))
ax2.set_yticklabels(percent_labels)
ax2.grid(True, which='both', axis='y')
 
# グラフタイトル設定 ---------------------------------------------------------------
ax1.set_title("PARETO_CHART")
 
# パーセンテージライン -------------------------------------------------------------
ax2.hlines(y=80, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
ax2.hlines(y=85, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
ax2.hlines(y=90, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
ax2.hlines(y=95, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
 
# グラフの保存 -------------------------------------------------------------------
plt.savefig("C:\\WinPython-64bit-3.4.4.6Qt5\\settings\\.spyder-py3\\Pareto_Chart.jpg", bbox_inches="tight")



結果

データはシード値を固定した乱数です。

棒グラフはデータが大きい順に左から並べ替えられています。

赤線は 100% 積み上げの折れ線グラフで、黄色は 80% 、 85% 、 90% 、 95% 線です。

図2 パレート図



コメント

パレート図って分析してる感じが出ますね。

全体の 80% を超えるデータなどがひと目で分かるようになりました。



以上

Python で棒グラフを描く



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方を調べ出しました。

今回は棒グラフの描き方をまとめました。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# 棒グラフを作成するプログラム
###############################################################################
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
 
# グラフの値の準備 ---------------------------------------------------------------
sample_label = ["a", "b", "c", "d", "e", "f", "g"]
np.random.seed(seed=42)
sample_data = np.random.randint(0, 180, size=7)
 
# グラフの値の整形 ---------------------------------------------------------------
sample_df = pd.DataFrame({"label": sample_label, "data":sample_data}, columns=["label", "data"])
 
# グラフの値のソート ---------------------------------------------------------------
sample_df = sample_df.sort_values(by="data", ascending=False)
 
# グラフの値を項目毎に加算する -----------------------------------------------------
sample_df["accum"] = np.cumsum(sample_df["data"])
 
# 全体に対する項目の割合を計算する -------------------------------------------------
sample_df["accum_percent"] = sample_df["accum"] / sum(sample_df["data"]) * 100
 
# 全体に対する項目の割合を計算する -------------------------------------------------
fig, ax1 = plt.subplots(figsize=(6,4))
 
# データ数のカウント----------------------------------------------------------------
data_num = len(sample_df)
 
# 棒グラフの棒の設定--------------------------------------------------------------
bar = 2 # 1:棒グラフの棒幅が広い 2:棒グラフの棒幅が狭い
if bar == 1:
    ax1.bar(range(1, data_num + 1), sample_df["data"], align="edge", width=-1, edgecolor='k')
    ax1.set_xticks([0.5 + i for i in range(data_num)], minor=True)
else:
    ax1.bar(range(1, data_num + 1), sample_df["data"], width=-0.5, edgecolor='k')
    ax1.set_xticks([1 + i for i in range(data_num)], minor=True)
 
# 自動で割り当てられる横軸ラベルを消去------------------------------------------------
ax1.set_xticklabels([])
 
# 横軸ラベルに "label" を設定-----------------------------------------------------
ax1.set_xticklabels(sample_df["label"].tolist(), minor=True)
 
# 横軸に名前をつける
ax1.set_xlabel("label")
 
# 縦軸に名前をつける
ax1.set_ylabel("counts")
 
# グラフの保存 -------------------------------------------------------------------
plt.savefig("C:\\WinPython-64bit-3.4.4.6Qt5\\settings\\.spyder-py3\\Bar_Graph.jpg", bbox_inches="tight")



結果

データはシード値を固定した乱数です。

棒グラフはデータが大きい順に左から並べ替えられています。

図2 棒グラフ



コメント

この棒グラフはランキングを整理する場合は良さそうですね。



以上

Python で折れ線グラフの足し算



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思い立ち、まず最初にグラフが思い浮かびました。

かなり安易な発想ですが、こういうのは蓄積していくことが大切なので、まとめておきます。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# グラフの足し算をするプログラム
###############################################################################
import matplotlib.pyplot as plt
import numpy as np
 
# グラフの値の準備 ---------------------------------------------------------------
x  = [100, 200, 300, 400, 500, 600]
y1 = [ 10,  20,  30,  50,  80, 130]
y2 = [ 10,  15,  30,  45,  60,  75]
 
# グラフの値の出力----------------------------------------------------------------
plt.plot(x, y1, marker="o", color="red",  linestyle="--")
plt.plot(x, y2, marker="v", color="blue", linestyle=":")
 
# グラフの y1, y2 を要素毎に足す --------------------------------------------------
y11 = np.array(y1)
y22 = np.array(y2)
y = y11 + y22
 
# y の出力 ---------------------------------------------------------------------
plt.plot(x, y, marker="x", markersize=8, color="green", linestyle="-.")
 
# グラフの保存 -------------------------------------------------------------------
plt.savefig("C:\\WinPython-64bit-3.4.4.6Qt5\\settings\\.spyder-py3\\Addtition_Graph.jpg", bbox_inches="tight")
 
# グラフの表示 -------------------------------------------------------------------
plt.show()
 
# linestyle の種類
# '-'  '実線'
# '--' '破線'
# '-.' '一点鎖線'
# ':'  '点線'
 
# marker の種類
# '.' 'point'
# ',' 'pixel'
# 'o' 'circle'
# 'v' 'triangle_down'
# '^' 'triangle_up'
# '<' 'triangle_left'
# '>' 'triangle_right'
# '1' 'tri_down'
# '2' 'tri_up'
# '3' 'tri_left'
# '4' 'tri_right'
# '8' 'octagon'
# 's' 'square'
# 'p' 'pentagon'
# '*' 'star'
# 'h' 'hexagon1'
# 'H' 'hexagon2'
# '+' 'plus'
# 'x' 'x'
# 'D' 'diamond'
# 'd' 'thin_diamond'
# '|' 'vline'
# '_' 'hline'



結果

赤線がソースコードの中の y1 で青線がソースコードの中の y2 です。

緑線が y1 と y2 を足し算した y です。

図2 折れ線グラフの足し算



コメント

Excel ファイルや CSV ファイルを読み込んで大量のグラフを出力できそうですね。

もうちょっと実用性のあるグラフの書き方も調べたいです。



以上

コピペで音声データの作成アプリが出来るようになる【Windows】【HTML】【JavaScript】【VBS】



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


なんのキッカケかは忘れましたが、音声データの作成をやってみたくなり、調べたところ簡単だったので、雑ですが、音声データ作成アプリっぽいものを作りました。



動作環境


Windows 7
・HTML
JavaScript
VBScript

また、音声読み上げに関するランタイム、ライブラリは画像の通りです。




構成


3 つのファイルから構成されるアプリにしました。

デスクトップに speak というフォルダを作成して、 3 つのファイルを保存しました。




プログラム

speak.html ソースコード


<html>
        <head>
                <title>テキスト読み上げ音声ファイルメーカー</title>
                <script language="javascript" type="text/javascript">
                        function OnLinkClickAudition() {
                                var txt = document.form1.msg.value;
                                var sh = new ActiveXObject("WScript.Shell");
                                sh.Exec("cmd /C wscript C:\\Users\\UserName\\Desktop\\speak\\Speak_Audition.vbs " + txt);
                                sh.null;
                        }
                        function OnLinkClickOutput() {
                                var txt = document.form1.msg.value;
                                var sh = new ActiveXObject("WScript.Shell");
                                sh.Exec("cmd /C wscript C:\\Users\\UserName\\Desktop\\speak\\Speak_Output.vbs " + txt);
                                sh.null;
                        }
                </script>
                <style type="text/css">
                        .btn-real-dent {
                                /*周りの凹み*/
                                display: inline-block;
                                position: relative;
                                text-decoration: none;
                                color: rgba(3, 169, 244, 0.54);
                                width: 100px;
                                height: 100px;
                                border-radius: 50%;
                                text-align: center;
                                background: #f7f7f7;
                                box-shadow: inset 0 0 4px rgba(0, 0, 0, 0.08);
                        }
                        .btn-real-dent i {
                                /*ボタン自体*/
                                position: absolute;
                                content: '';
                                width: 80px;
                                height: 80px;
                                line-height: 80px;
                                left: 10px;
                                top: 9px;
                                border-radius: 50%;
                                font-size: 30px;
                                background-image: linear-gradient(#e8e8e8 0%, #d6d6d6 100%);
                                text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.66);
                                box-shadow: inset 0 2px 0 rgba(255,255,255,0.5), 0 2px 2px rgba(0, 0, 0, 0.19);
                                border-bottom: solid 2px #b5b5b5;
                        }
                        .btn-real-dent .fa:active {
                                box-shadow: inset 0 1px 0 rgba(255,255,255,0.5), 0 2px 2px rgba(0, 0, 0, 0.19);
                                border-bottom: solid 2px #d8d8d8;
                        }
                        .textlines {
                                padding: 0.5em;          /* 内側の余白量 */
                                background-color: snow;  /* 背景色 */
                                width: 40em;             /* 横幅 */
                                height: 350px;           /* 高さ */
                                font-size: 1em;          /* 文字サイズ */
                                line-height: 1.2;        /* 行の高さ */
                        }
                </style>
        </head>
        <body>
                <form name="form1">
                        <p>
                                <textarea name="msg" cols="30" rows="7" class="textlines"></textarea>
                        </p>
                </form>
                <a href="#" class="btn-real-dent" onClick="OnLinkClickAudition()">
                        <i class="fa fa-home">試聴</i>
                </a>
                <a href="#" class="btn-real-dent" onClick="OnLinkClickOutput()">
                        <i class="fa fa-home">出力</i>
                </a>
        </body>
</html>


Speak_Audition.vbs ソースコード


cntArgs = WScript.Arguments.Count
 
If cntArgs <> 1 Then
        WScript.Echo "引数が" & intArgsCount & "個渡されました。" & vbCrLf _
                                & "指定可能な引数の数は 1 個なので処理を中止します。"
        ' 処理を中断
        WScript.Quit
End If
 
arg = WScript.Arguments(0)
 
Set tts = WScript.CreateObject("Speech.SpVoice")
tts.Rate = 2
tts.Speak(arg)


Speak_Output.vbs ソースコード


 
cntArgs = WScript.Arguments.Count
 
If cntArgs <> 1 Then
        WScript.Echo "引数が" & intArgsCount & "個渡されました。" & vbCrLf _
                                & "指定可能な引数の数は 1 個なので処理を中止します。"
        ' 処理を中断
        WScript.Quit
End If
 
arg = WScript.Arguments(0)
 
Set tts = WScript.CreateObject("Speech.SpVoice")
Set stream = WScript.CreateObject("Speech.SpFileStream")
tts.Rate = 2
stream.Open "speak.wav", 3
Set tts.AudioOutputStream = stream
tts.Speak(arg)
stream.Close



結果

インターフェースを図1 に示します。


図1 インターフェース


視聴ボタンを押すとテキストを読み上げた音声がスピーカーから流れます。

出力ボタンを押すとデスクトップに図2 のファイルが出来ます。

図2 出力ファイル



コメント

使い道はあまり思いつかないですが、たった 3 つのファイルを作成するだけで音声データが作成出来ました。



以上

python で単語感情極性対応表を使った感情分析〜失敗!?〜



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


前回の記事で『単語感情極性対応表』という辞書の使い方について練習しました。

今度は実際に使ってみます。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


#-*- encoding: utf-8 -*-
from pyknp import Juman
import pandas as pd
 
strlen = 10
 
###############################################################################
# 形態素解析
###############################################################################
 
# 形態素分析器 juman のインスタンス作成
juman = Juman(jumanpp=False)
 
# 形態素解析
text = '最近、痛ましい事件や事故のニュースが多い。'
result = juman.analysis(text)
 
# 形態素解析結果表示 および numpy 配列作成
print('*** 形態素解析結果 ***')
print('原文'.ljust(strlen, ' ') + '原形'.ljust(strlen, ' ') + '品詞'.ljust(strlen, ' ') + '分類'.ljust(strlen, ' '))
targetwords = []
for mrph in result.mrph_list():
    print(mrph.midasi.ljust(strlen, ' ') + mrph.genkei.ljust(strlen, ' ') + mrph.hinsi.ljust(strlen, ' ') + mrph.bunrui.ljust(strlen, ' '))
    targetwords.append(mrph.genkei)
print()
 
###############################################################################
# 単語感情極性解析
###############################################################################
 
# 単語感情極性対応表 のパスを設定する
filepath='C:\\Users\\UserName\\Desktop\\dictionary\\pn_table.txt'
print('*** 単語感情極性対応表 ***')
print('dictionary path = ' + filepath)
print()
 
# pandas で読み込む
pn_table = pd.read_csv(filepath, engine='python', encoding='shift_jis', sep=':', names=('Word','Reading','POS','PN'))
 
# 語のリスト と PN 値のリスト の作成
word_list = list(pn_table['Word'])
pn_list = list(pn_table['PN'])
 
# 語をキーとした PN 値辞書の作成
pn_dict = dict(zip(word_list, pn_list))
 
# 単語感情極性解析
print('*** 単語感情極性解析結果 ***')
for w in targetwords:
    if w in pn_dict.keys():
        print(w.ljust(strlen, ' ') + str(pn_dict[w]).ljust(strlen, ' '))
    else:
        print(w.ljust(strlen, ' ') + '無し'.ljust(strlen, ' '))
print()



結果


In [1]: runfile('C:/WPy64-3720/settings/.spyder-py3/jumanknptest5.py', wdir='C:/WPy64-3720/settings/.spyder-py3')
*** 形態素解析結果 ***
原文        原形        品詞        分類        
最近        最近        名詞        時相名詞      
、         、         特殊        読点        
痛ましい      痛ましい      形容詞       *         
事件        事件        名詞        普通名詞      
や         や         助詞        接続助詞      
事故        事故        名詞        普通名詞      
の         の         助詞        接続助詞      
ニュース      ニュース      名詞        普通名詞      
が         が         助詞        格助詞       
多い        多い        形容詞       *         
。         。         特殊        句点        
 
*** 単語感情極性対応表 ***
dictionary path = C:\Users\UserName\Desktop\dictionary\pn_table.txt
 
*** 単語感情極性解析結果 ***
最近        -0.0125929
、         無し        
痛ましい      -0.997224 
事件        -0.8599600000000001
や         -0.278384 
事故        -0.9970530000000001
の         無し        
ニュース      -0.391963 
が         無し        
多い        無し        
。         無し        
 
 
In [2]:



コメント

分析速度は悪くなかったと思います。

『最近』や『ニュース』がネガティブな数値を示しています。

辞書を見てみると、そんなにネガティブではない単語にネガティブな数値が与えられているモノが多数あります。

ポジティブとネガティブの閾値など、単語感情極性対応表をもっと理解する必要がありそうです。



以上