最終更新日:2023年6月12日

開発本部研究開発グループR&Dチーム マネージャーの榊です。
さて、今回のテックブログでは、2017年になったということで、データ分析に関連した国際会議の論文投稿のDeadlineと会議自体の日程をまとめたカレンダーを作ったので共有します。また、その副産物であるSpreadsheetにまとめた内容からカレンダーを自動生成するスクリプトも共有します。
弊社が取り組んでいる研究領域において、最先端研究を知るためには、研究領域に関連する国際会議の論文を調査することが必要不可欠です。さらに学術コミュニティにインパクトを与えるためには、それらの国際会議に論文を投稿し、採択されることが重要となります。
そこでまずは、2017年の論文投稿計画を作成する上で主要な国際会議の日程をまとめる必要があると考え、下記のようなスプレッドシートとカレンダーを作成しました。ただ、社内にとどめておくのももったいないので、こちらで公開したいと思います。
■データ分析関連の国際会議リスト
https://docs.google.com/spreadsheets/d/1OKtQUpbfvTDTsWaRcHCemIOgYeZHfRq5IykjPDGzzQw/edit?usp=sharing
■カレンダー
・埋め込み用URL
<iframe src="https://calendar.google.com/calendar/embed?src=o3tv21fckmium7kgb0jh752kbs%40group.calendar.google.com&ctz=Asia/Tokyo" style="border: 0" frameborder="0" scrolling="no"></iframe>
・カレンダー直接アクセスURL
https://calendar.google.com/calendar/embed?src=o3tv21fckmium7kgb0jh752kbs%40group.calendar.google.com&ctz=Asia/Tokyo
・iCal形式
https://calendar.google.com/calendar/ical/o3tv21fckmium7kgb0jh752kbs%40group.calendar.google.com/public/basic.ics
まずは、調査対象とした国際会議について簡単にご説明します。次にカレンダーの自動作成スクリプトの使用方法を説明します。最後に、そもそもなぜこのようなものを作るに至ったかの経緯について説明します。
調査した国際会議
弊社のR&Dチームが直接的に研究対象としている領域は、「Social Media Mining」となりますが、これらと関連する研究領域となると「Data Mining」「Web Mining」「Natural Language Processing」「Social Network Analysis」「Artificial Intelligence」「Machine Learning」とかなり多岐にわたります。そのため関連する国際学会も多数存在し、また近年は新たな国際会議も次々と立ち上がっているため、それらの国際会議をまとめるのも一苦労です。
ただ、データ分析に関連する国際会議については、すでに産業技術総合研究所の神嶌 敏弘研究員が極めてよくできた俯瞰図がありますので、こちらを参考にさせていただきました[参考1-1]。神嶌 敏弘研究員は機械学習の領域では非常に有名な方なので、ご存知の方も多いかと思います。(なお、弊社でバイトをしているとある博士学生は、神嶌 敏弘研究員のことを「歩く関連研究」と呼んでおりました(笑))
こちらの俯瞰図から、弊社R&Dの研究領域との直接的な関連性が低い「Computational Learning Theory」「Theoretical Computer Science」「Computer Vision」「Speech Signal Processing」の4分野の国際会議を除き、かわりに「Computational Social Science」に関連の深い国際会議を追加しました。全部で54国際会議となります。
これらの国際会議について各会議のウェブサイトから、「開催地」「アブストラクト投稿締切日」「論文投稿締切日」「採択通知日」「会議開始日/終了日」の情報を取り出して、スプレッドシートにまとめました。なお、これらの情報についてまとめたwikiサイト:wikiCFP ※1もあるのですが、一部の会議が含まれていない、たまに誤った情報が掲載されている、という点から、今回は地道に各ウェブサイトから情報を取ってくるようにしました※2。すでに論文投稿が昨年内に締め切られている学会もありますが、今年の投稿を計画する上では参考になるので、情報として記載してあります。
また付加的な情報として国際会議のグレード(インパクト)を自分の主観により付与してあります。3段階で評価してあり、
1:トップカンファレンス
2:中堅カンファレンス
3:その他
というざっくりとした3段階になっています。国際会議のグレードは、他の方も書かれていらっしゃいますので、そちらを参考にしてみてください[参考1-2,1-3]。ただ、国際会議のグレードは、常に変化していますので、あくまで原稿執筆時点の情報とお考えください。
カレンダーの方は直接参照していただくか、もしくは、コピーして適宜編集してお使いください。
スプレッドシートの方は投稿締切日でソートしたり、GradeやTopicでフィルタするなどしてご活用ください。
※1 自分が投稿予定の会議がwikiCFPに全て掲載されているのであれば、素直にwikiCFPを使うことをおすすめします。スプレッドシートにはwikiCFPのリンクも付与しました。
※2 なお、「人工知能技術を扱う研究者であるなら、『自動で国際会議をクローリングして、情報を自動抽出するスクリプト』をかけばよいのでは?」というツッコミもあるかと思いますが、意外とこれが難しく、結構時間がかかりそうなため断念した経緯があります。
参考1-1:http://www.kamishima.net/jp/kaisetsu/=> ML, DM, and AI Conference Map
参考1-2:http://ymatsuo.com/japanese/ronbun_eng.html#race
参考1-3:http://hontolab.org/researchtips/target-conference/
カレンダーの自動生成スクリプトの利用方法
スプレッドシートに書いてある予定からカレンダーを自動生成するスクリプトの使用方法について説明します。
1、スプレッドシートかスプレッドシートのコピーを作成して開いてください。
2、自分の必要性に合わせてスプレッドシートを適宜修正してください。
3、メニューの「Calendar」から「Regist All Events to Calendar」をクリックしてください。

4、「Regist All Events to Calendar」を実行するのが初めての場合は、下記のようにカレンダーへのアクセス権限の承認依頼が表示されますので、「続行」「許可」をクリックしてください。


5、カレンダー名を入力するダイアログが表示されますので、適宜名前を入力してください。

6、カレンダーのサマリを入力するダイアログが表示されますので、適宜名前を入力してください。

7、あとはスクリプトが完了するまで待つだけで、カレンダーが自動生成されます。なお、日付が入るべきカラムに日付以外の値が入っていたり、値が空の場合は下記のようにエラーダイアログが表示されます。その場合は、「OK」をクリックしてください。そのイベントは作成されませんが、スクリプトの実行は継続されます。

8、Google Calendarにアクセスし、新たなカレンダーが作成されていることを確認してください。

なお、スクリプト(Google Apps Script)を確認したい方は、スプレッドシートのメニューから「ツール」=>「スクリプトエディタ」を開けば確認できます。
今回のスクリプトは下記のページを参考にさせていただきました。
http://daichan4649.hatenablog.jp/entry/2016/03/23/021722
スクリプト自体はブログの末尾に記載します。
カレンダーを作るに至った経緯
冒頭で述べたように弊社では、国際会議の論文を読むだけ無く、それらの国際会議に投稿することも試みています。これは「可能であれば、弊社にいる研究員が学術界→弊社→学術界というキャリアプランを描けるようにしたい」と弊社、そして私自身が考えているためです。つまり、博士号を取った後、弊社でビジネス開発をしつつ論文実績を積み上げた後、大学で何らかの職位を得る、というキャリアを実現できるのが理想です。そして、弊社だけでなくIT中小企業・ITベンチャー企業と学術界との交流がもっと盛んになればよいと考えています。
しかし、理想は掲げたものの現実は厳しく、昨年、トップの国際会議に投稿した論文のレビュー(査読の評価)はだいぶ残念なことになっており、国際会議には一本も通すことはできませんでした。これはまずい、ということで、今年はちゃんと成果を出すために、予め論文投稿計画を立て、それに基づいて研究と論文執筆を進めることとしました。その中で、作成した成果物を共有しようと思った次第です。
ここで、「研究を進める前に投稿先を決める」ということに違和感を覚えた方がいらっしゃるかもしれません。確かに、一般的に考えれば、研究成果の中身に従って論文を書いた後、それに適した投稿先を選定するのがまっとうなプロセスのように聞こえるかもしれません。
しかし、インパクトのある論文を発表されてる先生方の多くは、論文投稿前、さらには研究開始前に投稿先を決めておくことを推奨しています。例えば、「できる研究者の論文作成メソッド (原題:How to Write it UP)」[参考3-1]では、「雑誌(投稿先)を選ぶタイミングとして最適なのは、研究を開始する前だろう」と書かれています。自分の博士時代の指導教官である松尾豊先生は論文の書き方を丁寧にまとめていらっしゃいますが、その中でも執筆前に投稿先の会議のCall For Papersを確認することを進めています[参考3-2]。人工知能学会で以前あった「国際会議に通すための英語論文執筆」という特集号でも「一流国際会議に採択される論文内容を想定して研究計画を構成し、それにそって研究作業を進める」と言及されています[参考3-3]。このように、研究を始める前に論文投稿先をあらかじめ選別しておくことは、インパクトのある論文を量産するのに必要不可欠と考えられます。
皆様の中でも、国際会議に投稿することに興味がおありの方は、今回共有したカレンダーを元に今年の論文投稿計画を立ててはいかがでしょうか?また今年は、昨年のCOLINGに引き続きSIGIR、DSAAと大きな国際会議が日本で開催されます。トップレベルの国際会議が日本で開催されるのは数年に一度しかありませんので、聴講するだけでも十分価値はあるかと思います。
参考3-1:https://www.amazon.co.jp/できる研究者の論文作成メソッド-書き上げるための実践ポイント-KS語学専門書-ポール-J-シルヴィア/dp/4061556274/ref=pd_sim_14_1?_encoding=UTF8&psc=1&refRID=71QW88Z09GDZJK9QZM6Y
参考3-2:http://ymatsuo.com/japanese/ronbun_eng.html
参考3-3:http://ci.nii.ac.jp/naid/110006664730
最後に、自分が英語論文執筆の際に、大変ためになった資料を付与しておきます。
・できる研究者の論文生産術 どうすれば「たくさん」書けるのか
・できる研究者の論文作成メソッド 書き上げるための実践ポイント
・人工知能学会 No.23 Vol.3:「国際会議に通すための英語論文執筆」特集にあたって 本文: CiNii
・松尾ぐみの論文の書き方:英語論文
以下、Google Apps Script
//References: http://daichan4649.hatenablog.jp/entry/2016/03/23/021722
//var CALENDAR_ID = '';
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Calendar')
.addItem('Regist All Events to Calendar', 'register')
.addToUi();}
#create a new Calendar
function createCalendar()
{
var cl_name = undefined;
var cl_summary = undefined;
var new_calendar = undefined;
cl_name = Browser.inputBox('Please Input Calendar Name', Browser.Buttons.OK_CANCEL);
if (cl_name != 'cancel'){
cl_summary = Browser.inputBox('Please Input Calendar Summary', Browser.Buttons.OK_CANCEL);
if(cl_summary == 'cancel'){
cl_summary = "";
}
new_calendar = CalendarApp.createCalendar(cl_name,
{location: '',
summary: cl_summary
});
}
return new_calendar
}
#read events from the current spreadsheet and register to a new calendar
function register() {
// read spreadsheet
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var eventlist = convertSheet2List(sheet);
var ui = SpreadsheetApp.getUi();
//create a new calendar
var calendar = createCalendar();
if(calendar == undefined){
ui.alert("Calender ID is Invalid");
}else{
//create event lists
for(var i=0; i<eventlist.length; i++) {
var event = eventlist[i];
var check_date = new Date(event.Deadline);
if(check_date != "Invalid Date"){
//add paper submission dates to the new calendar
var dead_title = "Submission Deadline: " + event.abbr + "2017";
var dead_date = event.Deadline;
var dead_description = "Type:Submission DeadLine\nConference Name:" + event.ConferenceName + "\nPlace:" + event.Place + "\n";
var dead_options = {description: dead_description};
calendar.createAllDayEvent(dead_title, dead_date, dead_options);
}else{
ui.alert("Submission Deadline Date of " + event.abbr + " is Invalid");
}
check_date = new Date(event.Conference_start);
if(check_date != "Invalid Date"){
//add event dates to the new calendar
var event_title = "Conference:" + event.abbr + "2017";
var event_start = event.Conference_start;
var event_end = event.Conference_end;
var event_description = "Type:Conference Period\nConference Name:" + event.ConferenceName + "\nPlace:" + event.Place + "\n";
var event_options = {description: event_description};
calendar.createEvent(event_title, event_start, event_end,event_options);
}else{
ui.alert("Event Start Date of " + event.abbr+ " is Invalid");
}
}
}
}
#read events from spreadsheet
// https://gist.github.com/daichan4649/8877801#file-convertsheet2json-gs
function convertSheet2List(sheet) {
// first line(title)
var colStartIndex = 1;
var rowNum = 1;
var firstRange = sheet.getRange(1, 1, 1, sheet.getLastColumn());
var firstRowValues = firstRange.getValues();
var titleColumns = firstRowValues[0];
// after the second line(data)
var lastRow = sheet.getLastRow();
var rowValues = [];
for(var rowIndex=2; rowIndex<=lastRow; rowIndex++) {
var colStartIndex = 1;
var rowNum = 1;
var range = sheet.getRange(rowIndex, colStartIndex, rowNum, sheet.getLastColumn());
var values = range.getValues();
rowValues.push(values[0]);
}
// create json
var eventArray = [];
for(var i=0; i<rowValues.length; i++) {
var line = rowValues[i];
var tmp_event = new Object();
for(var j=0; j<titleColumns.length; j++) {
tmp_event[titleColumns[j]] = line[j];
}
eventArray.push(tmp_event);
}
return eventArray;
}