朝日新聞の要約APIをたたくスクリプトを書いてみたよ

先日公開された朝日新聞の要約APIを試してみました。私が書いたスクリプトは以下。 長めの文章を「sample.txt」というファイルにまとめておくと、勝手に内容を読み込んで要約してくれます。

github.com

 

スクリプト使用に際しての注意点

(1)APIキーが必要だよ

朝日新聞の発行するAPIキーが必要になります。以下のサイトから申し込みを忘れずに!

APIキー発行:朝日新聞社メディア研究開発センター 人工知能研究の取り組み

(2)APIキー情報を書き込んだファイルを別途作ってください

今回のスクリプトでは「AsahiToken.py」からAPIキーを読み込むようにしました。別途作成をお願いします。ファイルの中身は以下のとおりにしてください。

ACCESS_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX' #APIキーを指定
(3)要約対象ファイルは「sample.txt」という名前にしてね
要約したいテキストは「sample.txt」という名前のファイルに保存してください。
 
(4)すべてのファイルを同じディレクトリに置こう
以上すべてのファイルが同一ディレクトリにある状態でスクリプトを実行すれば、結果が返ってくるはず。
 
もし成功したら、エンドポイントやパラメータをお好みで変えてみてください。1日に20アクセスまでと上限が決まっているので、ご利用は計画的に!
「テキストを変数に代入してJSONに渡したいけど失敗してしまう」という悩みを秒で解決してくださいました。いつもありがとうございます!

Wordファイルの表記統一が自動でできるスクリプトを書いたよ

先日、原稿の表記統一が自動でできるスクリプトを書きました。表記統一ルールをCSVファイルで定めておけば、原稿の文字列をそのとおりに置換してくれます。

tekitoeditor.hatenadiary.com

上記スクリプトはそこそこ便利ではありますが、テキストファイルの原稿のみが対象だという弱点がありました。そこで今回、Wordファイルを対象にしたバージョンを新たに作成しました。

github.com

 

使い方は以下のとおりです。

(1)JupyterNotebookの実行環境を用意する

(2)python-docxというライブラリをインストールする

(3)tekitoeditor/w_unificationリポジトリをgit cloneする

(4)(3)のディレクトリにWordの原稿を「before.docx」という名前で保存する

(5)「unification.csv」のbefore列・after列を置換したいものに書き換える

(6)スクリプトを実行する

これから編集者&ライター向けのツールをどんどん開発していきたいと考えています。日々の仕事を進めるうえでの困りごとがあれば、ぜひお聞かせください。もしかすると何か作るかもしれません!

原稿の表記統一が自動でできるスクリプトを書いたよ

最近はGoogleDocsの音声入力で取材音源の文字起こしをしている。作業が爆速で終わり、もはやこれ以外のやり方は考えられない。だが、この方法にはいくつかの問題がある。その一つが「表記が自分好みにならない」ってことだ。例を挙げよう。

色々 結構 多分 皆さん 所 色んな 頂く 元々 大体 割と 人達 やり取り 嬉しい

どうだろうか。私はこれを見て「連体詞や副詞、形式名詞は開いてくれないかな」と思う。なぜならば、彼らは文の主役ではなく、目立たせる必要がないからだ。このままだと全体的に黒っぽい字面になり、発光体では読みにくい(以上は勝手な持論)。

というわけで、自分好みに表記統一してくれるスクリプトを書いてみた。

github.com

以下の手順を踏めば、自動で表記統一ができる。

(1)JupyterNotebookの実行環境を用意する

(2)上のリポジトリをgit cloneする

(3)同一ディレクトリに原稿を「before.txt」という名前で保存する

(4)「unification.csv」のbefore列・after列を置換したいものに書き換える

(5)スクリプトを実行する

本当はプログラムの実行環境を用意する部分が最もハードルが高いはずなので、このスクリプトもいずれWebアプリ化して公開したい。早くDjangoで開発できるようになりたいなあ。

GoogleDocsの音声入力はよい、しかし……

何度挑戦しても正しく変換されない言葉がある。

f:id:tekitoeditor:20210409181353p:plain

これは音声で「Kaggle」を入力しようと試みた結果です。日本語的な発音でスタートし、徐々に英語的な発音に変えていきました。あまり意味がなかったのが一目瞭然ですね。

 

ちなみに「Google日本語入力に登録した単語とGoogleDocsの音声入力が連動している可能性が微小なレベルで存在するのではないか」と考え、「Kaggle」を同IMEに登録してから臨みました。ぜんぜん連動してなかったよ!

 

Kaggleとは👇

www.kaggle.com

 

最近グッときた形

駅でよく売られている某アイス。そのゴミ箱にはペットボトルなど他のゴミがよく捩じ込まれていた。おそらくはそれを受けてのことだろう。ゴミ箱の口が次のような形に変化していた。

 

f:id:tekitoeditor:20210403131713j:plain

写真ではサイズ感が伝わりにくいが、円形部分がちょうどペットボトル大で、その一部が開いている。開口部は小さいため、たたんだアイスの包み紙くらいしか入らない。円形部分の赤い配色には視線を集める意味があるのだろうが、ゴミ捨て時のインストラクションを兼ねているのがよい。アフォーダンス的な観点からして、よいデザインではないだろうか。

Clubhouseで作った部屋の名前を一部晒しながら命名のコツを考えてみる

2月1日にClubhouseを始めてから、毎日複数の部屋を作り続けてきた。どれくらい人が来てくれるか、どんな会話が繰り広げられるかは部屋の名前や開設する時間帯によってさまざまだ。以下、部屋を作り続けるうちに気づいた命名のコツを、実際の部屋タイトルを晒しながら説明していく。

1.面白い話や有益な話はしなくていいと暗に伝えてみる

Clubhouseを始める前は「意識高い人たちが集うSNS」という印象があった。しかしいざ自分でやってみると、必ずしもキラキラした人間である必要はないと気づいた。むしろテンションの高さやすてきな自分を演出できず、疲れている人が多いのではないか。実際、私の部屋を訪れる人は「自分は有名じゃないし、話もうまくないし」と最初は尻込みする。そこで、私は部屋の名前で思いっきりハードルを下げてみた。以下がそれだ。 

・ダウナーな人が中くらいまでテンションを上げていく部屋
・テンションの低い人だけが入室を許される部屋
・俺は有益なことは一切しゃべりたくないんだ

 どうだろうか。テンションが高くて人見知りしない人、有益な話をしようとする人はむしろ敬遠される可能性のある部屋。そんな建前を作っておくと、部屋を運営する側も訪れる側も、「何か面白い話をしなきゃ」という心理的な枷から解放され、逆に楽しく話ができる。部屋を開設したことのない人は、まずこのあたりから試してほしい。

 

2.自分はレスポンスしないと明言してみる

Clubhouseをやっていると「自分は話せる状況にないが人の話は聞きたい、しかしいまある部屋の中に好みのものはない」というシチュエーションが発生する(移動中など)。そんな時は、自分が好きな人に集まって話をしてもらえばいい。そこで、自分はレスポンスしない前提の部屋を何度か作った。

・松本に向かって自分の行いを懺悔する部屋(レスポンスはありません)
・最近興味のあることを話してほしい(レスポンスなし)

 部屋の主は「レスポンスしない」と明言している。訪れた人たちにとっては、小さな非常事態だ。人間はイレギュラーな状況に置かれると、何とかここを乗り切らねばと考え、周囲との結束が深まる。このタイプの部屋は集まった人々の相性次第で楽しさの度合いが変わってくるが、趣向を凝らしてみる価値はあるだろう。

 

3.みんなに関係しそうなタイムリーなネタをぶち込んでみる

Clubhouseの部屋のタイプは、ごく一部の人たちがスピーカーになる「ラジオ型」とみんながスピーカーになる「雑談型」に大別できる。私はだいたい後者を選ぶ。自分で話をするよりも、人の話を聞くほうが面白いからだ。しかも友達だけでなく、知らない人とも話してみたい。そんな時に有効なのが、みんなに関係しそうなタイムリーなネタをタイトルにぶち込むスタイルだ。

・気圧に敗北した民が雑談しながら人生をやっていく部屋
・気圧ごときに振り回されるちっぽけな俺たちだが
・確定申告の準備を始めようとしている民が集う部屋

不定期で訪れるうれしくないイベントに「低気圧」がある。これまでは頭痛ーるを片手に独りで体調不良を乗り切ってきたが、同じ悩みを抱えている人は多いと考えられる。そこで、上記の気圧部屋を低気圧まっただなかに立ててみたところ、非常に多くの人々が集まり、意外にも有益な情報交換ができた(ぼやきながら各自作業を進めるくらいのつもりで考えていたのに)。確定申告ネタの場合もほぼ同様の結果だった。定期、あるいは不定期で訪れるタイムリーなネタをぶち込んでいくと、状況を同じくする人たちと話ができて楽しい。

 

3.協力を乞うてみる

人間、生きているといろいろ困る。大きなものでは就活の失敗やパートナーとの別れ、小さなものでは今夜の献立決めなど。そういう時、誰かがそばにいてくれたり、知恵を出してくれたりするといい。Clubhouseでならば、きっとみんなが力を貸してくれるのではないか。そう思い、いくつか協力を乞う部屋を立ててきた。 

・悲しみにくれる松本をみんなで励ます部屋
・みなさん私を褒めてください
社会学を学ぶには何から始めればいいのかな
・おすすめのドキュメンタリーを教えてほしい
・みんなのおすすめマンガを私に教えてくれ

上記には「感情をケアしてほしい」系と「知恵を出してほしい」系の2つが混在する。しかし、集まる人々の違いはさほどない。意外にも、「感情をケア」系の部屋でも初めて会う人たちが訪れて励ましやアドバイスをくれる。Clubhouseを通じて人の温かさを知った。なお、「知恵を出してほしい」系の部屋では、その道のプロが来てアドバイスしてくれる場合もある。「Clubhouse知恵袋」の威力は、本家Q&Aサイトをはるかにしのぐ。

 

4.その他いろいろ

毎日多くの部屋を立てていると、次第にすべてがマンネリ化してくる。そこで新しい風を取り込むべく、新たな方向性のタイトルをつど考案している。上記に区分できないタイプをまとめて紹介しよう。 

(1)最近やっていることをちょっとだけ話す部屋
(2)深夜にちょっとだけ俺と話さないか
(3)真実を発見してしまったから、みんなにも伝えたい
(4)Kさんを召喚する部屋
(5)最初に集まった5人が雑談する部屋
(6)人前では好きと言いにくい映画を語る部屋

 毎日会う友人であっても(1)のような部屋を立てると、これまで話題に上らなかった中長期的な目標を話してくれたりする。(2)はセンチメンタルな気分の時に立てた雑談部屋。(3)はちょっとしたライフハックを発見した時に立てた部屋で、あえて煽り気味にしている。(4)はpingを飛ばさず、念の力だけで松本の友人である売れっ子ライターK氏を召喚するというネタ部屋。(5)はスピーカーの数を限定して雑談する部屋。Clubhouseには部屋に入場できる人の数を指定する機能がないようなので、部屋のタイトル付けで制御している。(6)は映画『花束みたいな恋をした』をめぐる雑談の流れで立てた部屋。深夜のテンションだからこそ話せるテーマで、我ながら気が利いていると思う。

 
備考:部屋のタイトルに爆破時刻を入れる

私はいつも部屋タイトルの末尾に部屋を閉じる時刻を入れるようにしている。これを設定すれば、運営側・参加側の双方が「一定の時間になれば部屋がなくなる」と意識できる。運営側は部屋を閉じる時によけいな説明をしなくていいし、参加側もスピーカーになった時の心理的なハードルが下がる(たぶん)。私は往々にして爆破時刻を守らない。しかし爆破時刻を設定することで、疲れて部屋を閉じたくなった時に「もうだいぶ時間が過ぎたから」と切り出しやすくなるだけでなく、時々「爆破の瞬間に立ち会いたい」と言って来てくれる人もいる。だから爆破時刻の設定には意味がある(たぶん)。

 

私はビジネス目的でClubhouseを利用しておらず、同所で生産しているのは友情だけだ(詳しくはこちらのPodcastを→「はなれより。」vol.13)。だから、集客目的で部屋のタイトル付けを工夫したことはない。私が部屋の名前をめぐって実験し続けているのは、さまざまな人に来てもらい、楽しく話ができるようにするためだ。そのような意味では上記のテクニックも使えると思うから、みんなにも活用してほしい。ちなみに私のClubhouseのアカウントは、Twitterなどと同じ@tekitoeditorだ。よろしくな!

『スッキリわかるSQL入門 第2版』ドリル(題材A・LEVEL6)の答え

『スッキリわかるSQL入門 第2版』のドリルを解き、ひたすら答えを載せていくシリーズです。今回は題材A・LEVEL6。手強かったです。

 

59.

update 口座
set 残高 =(select (sum(入金額)-sum(出金額)) as 残高
from 取引
where 口座番号 = '0351333'
and 日付 = '2018-01-11'), 更新日 = '2018-01-11'
where 口座番号 = '0351333'

 

60.

 select 残高, (select sum(入金額) from 取引select 残高, (select sum(入金額) from 取引    where 口座番号 = '1115600' and 日付 = '2017-12-28') as 入金額, (select sum(出金額) from 取引    where 口座番号 = '1115600' and 日付 = '2017-12-28') as 出金額from 口座where 口座番号 = '1115600'

 

61.

select 口座番号, 名義, 残高 select 口座番号, 名義, 残高 from 口座 where 口座番号 in (select 口座番号 from 取引   where 入金額 >= 1000000)

 

62.

select *
from 口座
where 更新日 > all(select 日付 from 取引)

 

63.

自力では解けなかったため割愛

 

64.

 insert into 廃止口座
(select * from 口座 where 口座番号 = '2761055');
delete from 口座
where 口座番号 = '2761055';