LaTeXもいけるよChatGPT

英語で論文を書くとき、
特に数式の含まれる論文を書くとき気になるのが

  • タイポ(スペルミス)
  • 文法間違い
  • 自然な表現、読みやすい表現

ではないでしょうか?

さて、数学・情報数理学系の我々が論文を書くときの標準ツールが
「LaTeX」
という組版システムです。(自動レイアウトワープロみたいなもの)

LaTeXでの数式表現は独特です。
例えば、
  XとYを集合として、f : X → Y を全単射とする。
というのをLaTeXで書くと
  $X$と$Y$を集合として、$f : X \rightarrow Y$ を全単射とする。
のように記述します。
「→」を「\rightarrow」と表現するなど、独特のコマンドを用います。

 コマンドが混在することで、上記のような短い文章でも、英語で書くとスペルミスや文法ミスがいつも以上に発生しやすくなります。

 スペルチェックや文法チェックのシステムは様々あります。

 例えば、LaTeXコマンドがあってもタイプミスを探し出せるスペルチェッカーのaspellがありますが、文法チェックはできません。また、文法チェックのGrammarlyを使うと、文法チェックができる上にお薦めの表現を教えてくれますが、LaTeXのコマンドが混ざった文章だと文法ミスの見逃しが発生しやすくなります。

 そこで朗報です!!
 ChatGPTを使うと、LaTeXコマンドを含む文章でも、
・スペル修正
・文法修正
・さらに推敲
などを同時に行えます。
 100%完全かどうかはわかりませんが、
以下の例をみると、その実力を確認できます。

 

 ChatGPTを起動したら、最初に次の文言を入力します。
以下、入力する文言をプロンプトと呼びます。

You are a professional editor with LaTeX.

すると、ChatGPTから次の回答がありました。

 なんだかノリノリに見えます。

そこで、次のプロンプトを入力しました。敢えて、よろしくない表現を散りばめています。

Please edit the following.

Let $X,Y$ be a set of integers, and $f$ be a map form $X$ to $Y$ and is a bijection.

これに対するChatGPTの回答は以下です。

完璧です。
・「$X,Y$」を「$X$ and $Y$」に修正。
・「a set of」を「sets of」に修正。
・「and $f$ be」 を「and let $f$ be」に修正。
・最後の「is a bijection」と「map」を合わせて「$f$ be a bijection」に修正。
・タイポ「form」を「from」に修正。
なんて、賢いのだ!

さらに続けて、次のプロンプトを入力しました。

Please edit the following.

Let $X,Y$ be a set of integers, and $f$ be a map form $X$ to $Y$ and is a bijection.
This implies that $\exists g$ from $Y$ to $X$ such that $g f (x) = x$ for $x \in X$.

これに対して

こちらも凄い。
・「a map from $X$ to $Y$」が「$f :X\rightarrow Y$」に。LaTeXのコマンド化。
・「that $\exists g$」という言葉足らずを「that there exists a map $g$」と文章で補完。
・式「$g f(x) = x$」を「$g\circ f(x)=x$」にして、写像の合成を明記。
・「for $x \in X$」を「for all $x \in X$」へと文章で補完。

惜しむらくは、, where $circ$ is the … のように写像の合成$\circ$の説明が欲しかったことか。

私の好みですが、LaTeXコマンドが直前の記号とくっつくと読みづらいと感じます。

そこで、次のプロンプトを与えました。

I prefer a blank before \ for mathematical symbols.

こうすることで次の回答を得ました。

私好みです。見やすい。

やっぱり、$\circ$が気になります。
次のプロンプトを入力。

I think the explanation of $\circ$ should be added.

これに対するChatGPTの回答は

ちゃんと、whereで補足を書いてくれました。
さらに定義に相当する$g(f(x))$も明記。
直前にお願いした、LaTeXコマンド前のスペースも忘れていない。

・スペルミスの修正(文脈を踏まえて、formがfromになりました!)
・文法の修正(a set of をsets ofに。and f be が and let f beに。)
・表現の推敲(bijectionをmapと一緒に。文法ミスでもありますがX, Yが X and Bに。)
・内容の補足(circの定義。anyの追加。)
・好みに合わせた記述(コマンド前にスペースを挿入。)
・LaTeXコマンド込みの編集(f from X to Y が f : X \rightarrow Y に)

これらを一括して行えるChatGPTは、
LaTeXを使った数式文書作成において
欠かせないパートナーになりそうです。


ChatGPTでハミング符号の復号アルゴリズムをC言語実装してみた

ChatGPTなるものが世間を賑わせています。
(世間ってどこよ?)

自然言語処理のための大規模言語モデルの1つです。
文章生成、対話システム、テキストマイニングなどに活用できるシステム。

ざっくり言うと、
・パソコン上で利用できて
・「普段の会話感覚」で文章を入力すると
・いろいろな文字列を作り出してくれる
そんなサービスです。

例えば

最初のデートで、相手を喜ばせるには、どんな会話したら良いと思う?

と入力すると

最初のデートでは、お互いに興味を持つ話題を見つけたり、相手に好印象を与えることが重要です。以下は、相手を喜ばせる可能性のある会話のトピックの例です。

  1. 趣味や興味を尋ねる
  • どのような趣味や娯楽が好きですか?
  • 最近読んだ本や映画は何ですか?
  • 旅行で行ってみたい場所はありますか?
  1. 仕事や学校について話す
  • 仕事や学校で何をしているのですか?
  • どんなキャリアゴールを持っていますか?
  • 好きな職場環境は何ですか?
  1. 質問に答える
  • 自分自身についてもっと知りたいことはありますか?
  • 最近自分で新しいことを始めたり、挑戦したことはありますか?
  • お互いに好きな食べ物やレストランは何ですか?

ただし、相手が話したいことや、話題に触れるのが適切であるかどうかを常に意識し、相手にリスペクトを示すことが大切です。また、相手が話をしているときは、真剣に聞き、興味を持って聞くことも重要です。

のような文が返ってきます。

 

上の様なふんわりとした対話もできますが、専門的な内容を扱うこともできます。

僕の専門の符号理論には「ハミング符号」と呼ばれる誤り訂正符号があります。

この誤り訂正の仕組みを「ソフトウェア実装」するために、ChatGPTを使ってみましょう。

ハミング符号の復号アルゴリズムをC言語で記述して下さい。

と入力したところ、次の回答がありました。

以下は、ハミング符号の(7, 4)符号化方式の復号アルゴリズムの例です。このアルゴリズムは、エラー訂正が可能な1ビットの誤りを検出でき、1ビットの誤りを訂正することができます。

続いて

#include <stdio.h>

int main() {
int received[7]; // 受信した符号語
int decoded[4]; // 復号した情報語
int error_bit = 0; // エラーがあったビットの位置

printf(“Enter the received codeword (7 bits): “);
for (int i = 0; i < 7; i++) {
scanf(“%d”, &received[i]);
}

// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[1] + received[3]) % 2;
syndrome[1] = (received[0] + received[2] + received[3]) % 2;
syndrome[2] = (received[1] + received[2] + received[3]) % 2;

// シンドロームからエラーの位置を特定する
error_bit = syndrome[0] + syndrome[1]*2 + syndrome[2]*4;

if (error_bit != 0) {
printf(“Error detected at bit %d\n”, error_bit);
// エラーを訂正する
received[error_bit – 1] = (received[error_bit – 1] + 1) % 2;
printf(“Corrected codeword is: “);
for (int i = 0; i < 7; i++) {
printf(“%d”, received[i]);
}
printf(“\n”);
} else {
printf(“No errors detected\n”);
}

// 復号する
decoded[0] = received[2];
decoded[1] = received[4];
decoded[2] = received[5];
decoded[3] = received[6];

printf(“Decoded message is: “);
for (int i = 0; i < 4; i++) {
printf(“%d”, decoded[i]);
}
printf(“\n”);

return 0;
}

 

実際の入出力の画面キャプチャがこちらです。

 

 

思わず、
 ChatGPTって賢い!!!

と思ってしまったのですが。
よく見ると
 「シンドロームを計算する」以降の4行は、計算が間違っています。
そこで間違いを指摘します。具体的には次の入力をしました。

あなたのプログラムに間違いを発見しました。

syndrome[0]はreceivedの0,1,3の和ではなくて、0,2,4,6の和です。
syndrome[1]はreceivedの0,2,3の和ではなくて、1,2,5,6の和です。
syndrome[1]はreceivedの1,2,3の和ではなくて、3,4,5,6の和です。

これらの3行を修正して下さい。

するとChatGPTからの返事は

申し訳ありません、間違いを修正します。正しいシンドロームの計算方法は以下の通りです:

続いて
 
// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[2] + received[4] + received[6]) % 2;
syndrome[1] = (received[1] + received[2] + received[5] + received[6]) % 2;
syndrome[2] = (received[3] + received[4] + received[5] + received[6]) % 2;
これは正しい計算です。正解を導き出せたので、私から次の入力をしました。
 
その通りです。素晴らしい。
では、修正版のソースコード全体を出力して下さい。
その結果、ChatGPTからの返事として次のソースコードが出力されました。
 

#include <stdio.h>

int main() {
int received[7]; // 受信した符号語
int decoded[4]; // 復号した情報語
int error_bit = 0; // エラーがあったビットの位置

printf(“Enter the received codeword (7 bits): “);
for (int i = 0; i < 7; i++) {
scanf(“%d”, &received[i]);
}

// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[2] + received[4] + received[6]) % 2;
syndrome[1] = (received[1] + received[2] + received[5] + received[6]) % 2;
syndrome[2] = (received[3] + received[4] + received[5] + received[6]) % 2;

// シンドロームからエラーの位置を特定する
error_bit = syndrome[0] + syndrome[1]*2 + syndrome[2]*4;

if (error_bit != 0) {
printf(“Error detected at bit %d\n”, error_bit);
// エラーを訂正する
received[error_bit – 1] = (received[error_bit – 1] + 1) % 2;
printf(“Corrected codeword is: “);
for (int i = 0; i < 7; i++) {
printf(“%d”, received[i]);
}
printf(“\n”);
} else {
printf(“No errors detected\n”);
}

// 復号する
decoded[0] = received[2];
decoded[1] = received[4];
decoded[2] = received[5];
decoded[3] = received[6];

printf(“Decoded message is: “);
for (int i = 0; i < 4; i++) {
printf(“%d”, decoded[i]);
}
printf(“\n”);

return 0;
}

バッチリです。

ChatGPTに対する私の印象は
 よく間違えるけど作業の早いアシスタント
です。

とにかく間違えます。
ですから、
利用側に
 正解と不正解を見極められる力
が要求されます。

上手く活用すれば、
自分で考えるよりも早くプログラミングできます。

デートの例もそうですが、
それらしい答えを短時間で導いてくれます。
ただし、あてになるかどうか分かりません。