1. はじめに
プレプリントサーバーといえば、物理や情報処理分野の「arXiv」が有名ですよね。
arXivとChatGPTのAPIを利用して、論文紹介をメールやLINE配信するGASコードが公開されています。
まだarXivほど普及してませんが、化学分野でも「ChemRxiv」というプレプリントサーバーがあります。
上述サイトのコードを参考にして、ChemRxivのPublic APIを利用した論文紹介をメール配信するGASコードを作成しました。
2. AbstractをChatGPTで要約してメール配信
2.1. ChemRxivのAPI取得
下記サイトの「public-api/v1/items」項に取得ルールが記載してあります。
QUERY PARAMETERSは「&」でつなげていけます。具体例は下記サンプルコードを参照ください。
なお、カテゴリを利用する場合は「public-api/v1/categories」であらかじめidを取得しておく必要があります。
2.2. GASのサンプルコード
コードの作成はChatGPTさんにも協力してもらいました。
// OpenAI の API keyを入力↓
const OPENAI_API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
// ChatGPT に渡すプロンプト(適宜変更)
const PROMPT_PREFIX = "あなたは化学に精通した研究者で、論文を簡潔に要約することに優れています。以下の論文を、タイトルと要約の2点をそれぞれ改行で分けて日本語で説明してください。要点は箇条書きで4-8行程度にまとめること。";
// 結果メールの送信先を入力↓
const EMAIL_RECIPIENT = "xxxxxxxxx@xxxxxxxxxxxxx";
// 結果メールのタイトル
const EMAIL_SUBJECT = "ChemRxivの新着論文のお知らせ";
// 結果メールの送信者の名前
const EMAIL_SENDER = "ChemRxiv要約Bot";
// メイン関数
function main() {
if (!OPENAI_API_KEY) {
console.log("ERROR: OPEN_API_KEY を指定してください");
return;
}
// ChemRxiv Public APIのサイトにアクセスしてデータ取得
// 例:語句「informatics」 & カテゴリー「Theoretical and Computational Chemistry」 & 50件取得
const termValue = '"informatics"';
const encodedTerm = encodeURIComponent(termValue);
const url = 'https://chemrxiv.org/engage/chemrxiv/public-api/v1/items?term=' + encodedTerm + '&categoryIds=605c72ef153207001f6470ce&limit=50';
const response = UrlFetchApp.fetch(url);
Logger.log(response.getResponseCode()); // HTTPステータスコードを表示:200表示ならOK
const data = JSON.parse(response.getContentText());
let output = "";
// タイトルと要約を取得して出力
const items = data["itemHits"];
const numItems = items.length;
const maxItems = Math.min(numItems, 5); // 最大5件まで表示
for (let i = 0; i < maxItems; i++) {
const title = data["itemHits"][i]["item"]["title"];
const abstract = data["itemHits"][i]["item"]["abstract"];
const date = data["itemHits"][i]["item"]["statusDate"];
const authors = data.itemHits[i].item.authors;
// 著者の名前を格納する配列
let authorNames = [];
for (let j = 0; j < authors.length; j++) {
const name1 = authors[j].firstName;
const name2 = authors[j].lastName;
authorNames.push(name1 + " " + name2); // 名前を配列に追加
}
const allAuthors = authorNames.join(", ");
// タイトルとアブストラクトをinputに格納
const input = "\n" + "title: " + title + "\n" + "abstract: " + abstract;
// ChatGPTにinputの情報を渡す
const res = callChatGPT([
{
role: "user",
content: PROMPT_PREFIX + "\n" + input,
},
]);
if ("error" in res) {
console.log('Error:' + res.error.message);
return;
}
// 出力の体裁を整える
const paragraphs = res.choices.map((c) => c.message.content.trim());
output += `Title: ${title}\nAuthors: ${allAuthors}\n\n ${paragraphs.join("\n")}\n\n${date}\n------------------------\n\n\n`;
}
output = output.trim();
console.log(output);
sendEmail(output);
}
// ChatGPTの関数
function callChatGPT(messages) {
const url = "https://api.openai.com/v1/chat/completions";
const options = {
"method": "post",
"headers": {
Authorization: `Bearer ${OPENAI_API_KEY}`,
"Content-Type": "application/json",
},
"muteHttpExceptions": true,
"payload": JSON.stringify({
model: "gpt-3.5-turbo",
messages,
}),
}
return JSON.parse(UrlFetchApp.fetch(url, options).getContentText());
}
// メール配信の関数
function sendEmail(body) {
const recipient = EMAIL_RECIPIENT;
const subject = EMAIL_SUBJECT;
const options = { name: EMAIL_SENDER };
GmailApp.sendEmail(recipient, subject, body, options);
}
3. 配信メール
配信されるメールはこんな感じです。
Title: Analyzing the Accuracy of Critical Micelle Concentration Predictions using Deep Learning
Authors: Alexander Moriarty, Takeshi Kobayashi, Matteo Salvalaglio, Panagiota Angeli, Alberto Striolo, Ian McRobbie
タイトル: 深層学習を用いた臨界ミセル濃度予測の精度分析
要約:
- 本研究では、グラフニューラルネットワーク(GNN)にガウス過程(GP)を組み合わせた手法を提案し、臨界ミセル濃度(CMCs)の予測を行います。
- 提案モデルは、分子の学習された潜在空間表現を使用してCMCsを予測し、不確かさを推定します。
- 非イオン性、カチオン性、アニオン性、およびゼウィッタイオン性分子を含むデータセット上で、提案モデルの性能を、拡張連結性フィンガープリント(ECFP)を使用した線形モデルと比較します。
- GNNベースのモデルは、バランスの良いトレーニングデータが十分にある場合に線形ECFPモデルよりわずかに優れた性能を発揮し、サーファクタント化学の範囲が狭い既存のモデルと同等の予測精度を達成します。
- 潜在空間を視覚化するために分子カルトグラムを使用し、モデルの適用範囲を示します。これにより、予測が誤っている可能性のある分子を特定するのに役立ちます。
- サーファクタントクラスの一部においてCMCsを正確に予測するだけでなく、提案手法はCMCsに影響を与える分子の特性に関する貴重な洞察を提供することができます。
2023-08-09T13:36:42.362Z
以上、参考になれば幸いです。