昨日投稿した「なろう度偏差値計算機」ですが、予告通りホームページに埋め込むことに成功しました。下のリンク、もしくはページ上部メニューの「ツール一覧」からアクセスできます。
前回の記事はこちら↓
以下このページでは、「なろう度偏差値計算機」のソースコードの解説や、WordPressへのPythonコードの埋め込み方法を残しておきたいと思います。
なろう度偏差値計算機
HTML表示部分
<form action="/narou.php" method="post" id="AjaxForm">
<input type="text" name="title">
<input type="submit" value="計算" class="submit">
</form>
<div id="result"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js" async=""></script>
ページ上で見えている部分です。「計算」を押すとnarou.phpに入力したタイトルが転送されます。デフォルトのままだとそのままnarou.phpを表示してしまう(=ページから離れてしまう)ので、次のJavaScriptで制御しています。
JavaScript処理部分
$('#AjaxForm').submit( function(event) {
event.preventDefault();
const $form = $(this);
const $button = $form.find('.submit');
$.ajax({
url: $form.attr('action'),
type: $form.attr('method'),
data: $form.serialize(),
timeout: 10000,
beforeSend: (xhr, settings) => {
$button.attr('disabled', true);
$("#result").text("")
},
complete: (xhr, textStatus) => {
$button.attr('disabled', false);
},
success: (result, textStatus, xhr) => {
$form[0].reset();
$("#result").append(result);
},
error: (xhr, textStatus, error) => {
alert('通信エラー');
}
});
});
ページ遷移を行わないようにしたり、計算ボタンを処理中に押せなくしたり、結果を表示させたりといったページ上の動的な処理を行っています。
PHP処理部分
<?php
$title = str_replace([" ", " ", "~", "~", "-"], "", $_POST['title']);
$command = 'export LANG=ja_JP.UTF-8;/usr/local/bin/python3 /virtual/okinotori/public_html/okinotori/narou.py '.$title;
exec($command, $output);
foreach ($output as $o) {
echo $o . '<br>';
}
?>
転送されてきたタイトルを整形し、exec関数を用いてnarou.pyを実行します。narou.pyで標準出力されたものは変数outputに格納されるので、それを改めてHTMLとして出力します。
Python処理部分(本体)
import sys
sys.path.append('/virtual/okinotori/my-space')
args = sys.argv
import csv
from janome.tokenizer import Tokenizer
with open('narou10000.csv', 'r') as f:
reader = csv.DictReader(f)
d = [row for row in reader]
dic_dev = dict(d[0])
noun = 0
point = 0
title = args[1]
print(title)
tokenizer = Tokenizer()
tokens = tokenizer.tokenize(title)
for token in tokens:
if token.part_of_speech[:2] == '名詞':
if token.surface in dic_dev:
print(token.surface + ":\t" + dic_dev[token.surface])
point += float(dic_dev[token.surface])
else:
print(token.surface + ":\tNone")
noun += 1
print("偏差値:\t"+str(point/noun))
「なろう度偏差値計算機」本体です。本体部分のコードは前回とほとんど変わりませんが、辞書はあらかじめ計算してCSVとして出力したものから読み込んでいます。
おわりに
Python3系のつもりで書いたものをPython2系を使って処理してエラーを出していることに気づかなかったり、CSVをUTF-8で出力しておらず読み込みエラーを出したりといろいろ罠にハマってしまいました。
とりあえず文字コードはそろそろ統一してほしいところですが、たぶんいろいろ問題があるんでしょう。そのうち統一されることを切に願います。
とりあえずPythonでつくったものを埋め込めることがわかったので、これからいろいろ作って遊んでみたいと思っています。アイデアがある方はコメント等で送ってみると管理人が作ってくれるかもしれません。
コメント