ChatGPTは縦書きが分からない~一緒にプログラミングしてみた~
ChatGPTの登場から半年も経つとChatGPTとプログラム作るのも新鮮さが薄れて書くのも面倒になって来ますね。
生成AIに私の文章は学習させない!
生成AIはWebの文章を学習しているという。著作権関連ではシビアな問題として取り扱われている話も聞いている。(AIが生成したものは著作物として扱わないが、それに手を加えたものは著作権が発生する。AIの生成内容に自分の書いた文章がそのまま出力された場合、それは著作権侵害になるのではないかという話)
画像での学習回避の例
そこで、生成AIに学習させないようにするテクニックが表れている。画像においては細かく分割した画像をHTML上で一枚の画像として見られるような工夫であったり、画像にノイズを混ぜる「Glaze」という手法がとられている。https://forest.watch.impress.co.jp/docs/review/1508037.html
文章の学習回避策としての縦書き
文章については、画像にしてもOCRで読まれてしまうし、単語の間の文字を入れ替える方法でも認識されるので、生成AIの学習を避けるためには、文字を並べ替える手法が有効だと考えた。
ChatGPT(3.5)に聞いてみたけど、やっぱり分かってない。
この縦書き変換プログラムをChatGPTと一緒に作りたい。
色々要求を頑張って伝えたが、縦書きと言うだけでは伝わらず、プロンプトを試行錯誤して何とかプログラムができた。
今回、使いやすくするためにブラウザプラグインまで作った。
基本パートのコーディング
自分でコーディング
import math
tweet="abcdefghijklmnop"
row = 10
col = math.ceil(len(tweet)/row,0)
tweet = tweet+(" "*10)
tweet = tweet[0:col*row]
for i in range(row):
text = ""
for j in range(col):
text = text + tweet[row*(col-j-1)+i]
print(text)
これでとりあえず動いた。
この後Chromeのプラグイン作成をChatGPTにお願いしたけど、せっかくなので最初のコーディング自体をお願いしてみた。
ChatGPTに依頼してみた
import math
def vertical_text(input_text):
# 文字列を縦10文字で分割し、行ごとにリストに格納
rows = [input_text[i:i + 10] for i in range(0, len(input_text), 10)]
# 足りない文字数を計算して、全角スペースで補填
for i in range(len(rows)):
if len(rows[i]) < 10:
rows[i] += ' ' * (10 - len(rows[i]))
# 縦書きに変換して、行の文字列を反転
vertical_rows = [''.join(row[j] for row in rows)[::-1] for j in range(10)]
return '\n'.join(vertical_rows)
# 与えられた文字列
input_string = "文章については、画像にしてもOCRで読まれてしまうし、単語の間の文字を入れ替える方法でも認識されるので、並べ替える手法が有効だろうと考えた。"
# 文字列を縦書きに変換
vertical_output = vertical_text(input_string)
print(vertical_output)
プロンプトを工夫すれば割とすぐできた。
Bing Chatに依頼してみた
def vertical_text(text):
# 全角スペースで補完
while len(text) % 10 != 0:
text += ' '
# 文字列を10文字ごとに分割
lines = [text[i:i+10] for i in range(0, len(text), 10)]
# 各行を逆順にして出力
for i in range(9, -1, -1):
for line in lines[::-1]:
print(line[::-1][i], end='')
print()
# テスト
vertical_text('文章については、画像にしてもOCRで読まれてしまうし、単語の間の文字を入れ替える方法でも認識されるので、並べ替える手法が有効だろうと考えた。')
ちょっと指示が悪かったのか、一度元に戻すミスもあったけど、ちゃんとできた。
プラグインを作る
プラグインのコーディング
Chromeのプラグインなど1mmも知らないけどChatGPTとならやれる。自分でコーディングしたプログラムをプラグインに変換してもらう。
{
"manifest_version": 3,
"name": "縦書き変換プラグイン",
"version": "1.0",
"description": "テキストを縦書きに変換するプラグイン",
"permissions": [
"activeTab"
],
"browser_action": {
"default_popup": "popup.html",
"default_icon": {
"16": "icons/icon16.png",
"48": "icons/icon48.png",
"128": "icons/icon128.png"
}
},
"icons": {
"16": "icons/icon16.png",
"48": "icons/icon48.png",
"128": "icons/icon128.png"
}
}
<!DOCTYPE html>
<html>
<head>
<title>縦書き変換</title>
<style>
textarea {
width: 100%;
height: 100px;
}
</style>
</head>
<body>
<textarea id="inputText" placeholder="縦書きに変換するテキストを入力してください"></textarea>
<button id="convertButton">変換</button>
<div id="outputText"></div>
<script src="popup.js"></script>
</body>
</html>
function convertToVertical(text) {
const row = 10;
const col = Math.ceil(text.length / row);
const paddedText = text + " ".repeat(row - (text.length % row));
let verticalText = "";
for (let i = 0; i < row; i++) {
let rowText = "";
for (let j = 0; j < col; j++) {
rowText += paddedText[row * (col - j - 1) + i];
}
verticalText += rowText + "\n";
}
return verticalText;
}
document.getElementById("convertButton").addEventListener("click", function() {
const inputText = document.getElementById("inputText").value;
const outputText = convertToVertical(inputText);
document.getElementById("outputText").innerText = outputText;
});
vertical_text_extension/
│
├── manifest.json
│
├── icons/
│ ├── icon16.png
│ ├── icon48.png
│ └── icon128.png
│
├── popup.html
│
└── popup.js
結果として、修正が必要だったけど、変換ボタンを自動でつけてくれたりと言っていないことも汲み取って作ってくれた。
この後文字化けを修正したり、コピーボタンを付けたりプレビューウインドウをつけ足したりしてもらった。
アイコンはペイントで適当に作った。
Chromeのプラグインについて何も知らないのに1時間程度で作れたのは本当にすごいし、分からないところは学びながらできるのも本当にすごい。しかも深夜に気兼ねなく聞ける相手がいるのが良い。
プラグインを試す
Chromブラウザの拡張機能として使うには下記の手順2に従う。
公式ドキュメントのリンクを張ってはみたものの、やり方はChatGPTが全部教えてくれた。
結果として下記のようにプラグインが完成しました。
プラグインを公開する
せっかく作ったので5ドル払ってGoogleのDevelopperになり、Chrome拡張機能の公開申請しました。
ご活用ください。
https://chrome.google.com/webstore/detail/%E7%B8%A6%E6%9B%B8%E3%81%8D%E5%A4%89%E6%8F%9B%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3/mhgklijpgchhgmdcjionakojcjlnfkaj
この記事が気に入ったらサポートをしてみませんか?