毎日テキストマイニングをサボってやっていたこと
久しぶりの更新になってしまいました。
180日間続けるといいつつ、半分の92日間しか継続できませんでした。しかし、毎日テキストマイニングをサボっている間、プログラミングをサボっていたわけではありません。毎日テキストマイニングを通して学習した深層学習で画像の色付けをしていました。
その成果としてサイトを作りました。
kerasを使って白黒写真を色付けしたものを紹介していくだけのサイトです。 綺麗に色がつくかはPhotoshopの前処理にかかっているという程度の技術力です。
例としてはこんな感じです。この写真は太宰治が銀座のルパンというバーで坂口安吾と対談している時の写真です。

元はこんな感じでした。

なぜこのようなことを始めたかと言いますと、今年の8月15日に、終戦から1年が経った広島の写真を深層学習でカラー化した写真が公開され、その写真にひどく感銘を受けたからです。戦争は主に白黒写真でしか見たことがなかったですし、かなり昔に行われていた前世代のものという感覚がありました。しかし、カラー化された写真を見ることで、つい最近まで行われていたものなんだと認識できました。物事の背景には全て歴史がある、と言いますが、この感覚をもっと知りたくて白黒写真のカラー化はやりたいことの1つでした。
そして、深層学習と言いましても、毎日テキストマイニングを通してPythonの基礎はできていましたので、割と楽に実装できました。むしろ自然言語処理と比べて画像処置はかなり楽でした。
90日間しか継続できませんでしたが、やはり毎日インプット・アウトプットを繰り返していくと(苦しいですが)上達は早かったです。この企画を始めてなかったら、深層学習なんて夢のまた夢でしたし、GPU入りのパソコンなんて買わなかったですのでとてもよかったと思います。
しかし、180日間やると言ってできなかったのは反省すべき点です。継続できなかった理由は以下の点かと。。。
- 毎日のネタが思いつかなかった。
- 仕事の忙しさの波が激しかった。
- たまにある飲み会が断れなかった
- マイニング・自然言語処理がやや難しすぎた
- 80日目くらいで心が折れまくってた(このブログを開くのもトラウマw)
- 土日も休めないのが辛い。
毎日のネタ探しが一番辛かったですね。今日の分を書けても、その場で次の日の分のネタを考えなきゃいけないのは地獄でした。次に180日間チャレンジをやるときはネタに困らないテーマでやりたいですね。ひとまず土日は休みつつ、白黒写真をカラー化していきたいと思います。こちらもどうぞよろしくお願いいたします。
最後に宣伝ですが、日露戦争の写真集をカラー化してkindleに置いていますので、興味がある方は見ていただければ幸いです。10月21日(日)まで無料で配信しています。
https://www.amazon.co.jp/dp/B07JVCJN4V/ref=cm_sw_r_tw_dp_U_x_fm1XBb8FZYVGV
2018/09/23【92日目】自然言語処理100本ノック、その10
とうとう自然言語処理100本ノックを初めて、10日目に達してしまいました。なかなか終わりが見えませんね。 可能な限り最後まで行いたいので、引続きやって行きます。今日から第4章の30問目からです。
30問目。 形態素解析をして結果を出力する問題です。これは、ずっとやっていたので簡単ですね。 取り敢えずテキストの読み込みをします。
text = open('neko.txt', 'r') plane_text = text.read() print(len(plane_text))
次にMeCab
import MeCab tagger = MeCab.Tagger ("-Owakati")
ここまではいいんですが、次の一文が気になります。
ただし,各形態素は表層形(surface),基本形(base),品詞(pos),品詞細分類1(pos1)をキーとするマッピング型に格納し,1文を形態素(マッピング型)のリストとして表現せよ.
マ、マッピング型。。。ググってみたら辞書型でした。 取り敢えず、表層形(surface),基本形(base),品詞(pos),品詞細分類1(pos1)を取得するために、chasen形式を選択します。
tagger = MeCab.Tagger ("-Ochasen”)
これでfor文で回せば、取り敢えず取得したいものは得られるかと。
mecab = tagger.parse(plane_text) for mecab_text in mecab.split('\n'): mecab_tab = mecab_text.split('\t') print(mecab_tab)
実行結果。
一 イチ 一 名詞-数 記号-空白 吾輩 ワガハイ 吾輩 名詞-代名詞-一般 は ハ は 助詞-係助詞 猫 ネコ 猫 名詞-一般 で デ だ 助動詞 特殊・ダ 連用形 ある アル ある 助動詞 五段・ラ行アル 基本形
難しすぎて心が折れそうですが、今日は取り敢えずここまで。
今日の結果
今日のAKBの呟きは54件でした。 要約するとこんな感じです。
#이홍기#ftisland#감사합니다""今日は週刊プレイボーイさんの撮影をしてきました☆2月ぶりの水着撮影だったので少し緊張したけど…とっても楽しかったです\(^o^)/発売日は10月17日です!是非チェックしてください✨""#ちゃこらじお第77回配信開始✨動画は第77回のオマケ!より多くの方に知ってもらいたくて初めて見ました? ロゼッタ作ったり写真撮ったりたのしかったです(´▽`)ノインスタに写真載っけますね!!""1つランクアップしてました!応援してくださってる皆さん本当にありがとうございます!最後まで楽しみながら頑張りましょう✨""トムさんゆかるんさんさほさんこみと週刊プレイボーイの撮影でした!!18歳初水着…?✨✨楽しくてあっという間だったなぁ10月17日発売ぜひチェックです!#きょうのせいちゃん#週プレ""愛用しております?" 今日から予約受付が始まっていて、明日(9月29日)締め切りです!!!お忘れなく!!岡田奈々さんに…""今日の担当は私!今の気持ちや、これからの目標なども書いたので、是非見てください??"
'楽しい': 9, '可愛い': 3, 'すごい': 2, 'かわいい': 2, 'たのしい': 2, '嬉しい': 2, '良い': 2, '優しい': 1, '懐かしい': 1, '眩しい': 1, '青い': 1, 'いい': 1, 'やばい': 1, '凄い': 1, 'ありがたい': 1, '悔しい': 1, 'やすい': 1, '詳しい': 1 'さん': 14, '月': 12, 'ちゃん': 12, '日': 11, '楽しい': 9, '今日': 8, '予約': 7, '配信': 7, '方': 6, '時': 6, '撮影': 6, '発売': 6, 'エーケービーフォーティーエイト': 5, '絶対': 5, 'お願い': 5, '私': 4, '位': 4, '人': 4, '皆さん': 4, '最後': 4, '受付': 4, 'する': 30, 'さん': 14, '月': 12, 'ちゃん': 12, '日': 11, '楽しい': 9, '見る': 9, '今日': 8, 'くださる': 8, '予約': 7, '配信': 7, '方': 6, '時': 6, '撮影': 6, '発売': 6, 'くる': 6, '頑張る': 6, 'いる': 6, 'エーケービーフォーティーエイト': 5, '絶対': 5, 'お願い': 5, '行く': 5,

2018/09/22【91日目】自然言語処理100本ノック、その9
29問目です。 APIを使って国旗のURLを取得する問題です。 一応ヒントらしきものがあって、imageinfoを読み出せばいいそうです(意味がわからないですが)。
テンプレートの内容を利用し,国旗画像のURLを取得せよ.(ヒント: MediaWiki APIのimageinfoを呼び出して,ファイル参照をURLに変換すればよい)
取り敢えず、APIを取得します。wikiの中のAPIは全て以下の形で取得できるみたいなので、まずはMediaWikを指定します。
All Wikimedia wikis have endpoints that follow this pattern:https://www.example.org/w/api.php Examples of Wikimedia Wiki Endpoints API Endpoint Wiki https://www.mediawiki.org/w/api.php MediaWiki API https://en.wikipedia.org/w/api.php English Wikipedia API https://nl.wikipedia.org/w/api.php Dutch Wikipedia API https://commons.wikimedia.org/w/api.php Wikimedia Commons API https://test.wikipedia.org/w/api.php Test Wiki API
import requests import json api = "https://www.mediawiki.org/w/api.php" hoge = requests.get(api) print(hoge.text)
<!DOCTYPE html> <html class="client-nojs" lang="en" dir="ltr"> <head> <meta charset="UTF-8"/> <title>MediaWiki API result - MediaWiki</title> <script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>
取り敢えず何かが返ってきました。 それで、問題のパラメーターですね。
元のページは英語なので、Google翻訳をかけます。するとそれらしいものがありました。
iiprop:どのプロパティを取得するには: * url:画像のURLと説明ページ。
これを使えば良さそうです。。。。と、思いきや、解決策が全然思い付かず。。。 この問題の答えをググってみるとやたらと長いコードだったので、ちょっとパスします。
やや心が折れかけています。
今日の結果
今日のAKBの呟きは60件でした。 要約するとこんな感じです。
1年前のあの日昇格できた喜びは本当に忘れられません✨これからも、みんなで頑張っていきたいです!!""ぜひ見てください\(^o^)/""iOS12にアップデートしたら・QRコードと計測ができるようになった(°_°)・ミュージックの表示が変わって聴こえる音がクリアになった気がするのは錯覚、、??・タスクバーの消すのが戸惑う!!iPhoneXの人こんな感じですかね??""#マジムリ学園の放送終わりました? 憧れのドラマ出演本当にありがとうございます❤️撮影終わった後素敵なお花を頂きました? 私の好きな水色、チームKの緑。。。本当に嬉しい!!(๑>ᴗ<๑)♥#山根涼羽ちゃん#16期#ハンドメイド#手作り…""ダイヤモンドZAIの勉強会&撮影でした☆今は私も智代梨も個別株に注目してるんだー(^^)2人とも新しく買い増ししたし、最新号も皆さんチェックしてね♪オススメの株があったら是非握手会なんかで教えてください〜\(^o^)/""彩奈と久しぶりにお出かけ!チームラボにいって写真いっぱい撮ってもんじゃ食べてきました?
'すごい': 3, '凄い': 2, 'いい': 2, '寒い': 2, '可愛い': 2, '長い': 2, '嬉しい': 2, '辛い': 1, '悲しい': 1, '難しい': 1, '面白い': 1, 'よい': 1, 'すっごい': 1, '美味しい': 1, '上手い': 1, '新しい': 1, '欲しい': 1, '楽しい': 1 '私': 9, '今日': 9, 'ちゃん': 9, '回': 8, 'お願い': 8, '人': 8, '日': 7, '学園': 6, 'ん': 6, '撮影': 6, 'さん': 6, '応援': 6, 'チーム': 6, 'ラボ': 6, 'こと': 6, '最終': 5, 'よう': 5, '船': 5, '舞台': 5, '昇格': 5, '年': 5, 'みなさん': 5, 'の': 5, 'する': 49, 'くださる': 15, '見る': 13, '私': 9, '今日': 9, 'ちゃん': 9, '回': 8, 'お願い': 8, '人': 8, '日': 7, '頑張る': 7, '学園': 6, 'ん': 6, '撮影': 6, 'さん': 6, '応援': 6, 'チーム': 6, 'ラボ': 6, 'こと': 6, 'なる': 6, 'ある': 6, 'できる': 6, '最終': 5, 'よう': 5, '船': 5, '舞台': 5, '昇格': 5, '年': 5, 'みなさん': 5, 'の': 5, 'てる': 5, 'られる': 5,

2018/09/21【90日目】自然言語処理100本ノック、その8
26問目です。 25問目の結果からマークダウンの強調を表す''' を消す問題です。 取り敢えず、replaceをしてみます。
import json import json import re from pprint import pprint def extract_base_info(text): m = re.search("{{基礎情報[^|]+\|(?P<info_body>.+?)\n}}", text, re.DOTALL) if not m: return {} info_body = m.group("info_body") info_dict = {} for item in info_body.split("\n|"): item = item.replace(“’’’”, "") key, word = re.split(r"\s*=\s*", item, maxsplit=1) info_dict[key] = word return info_dict text = extract("イギリス") base_info = extract_base_info(text) pprint(base_info, indent=4)
実行結果。
"|確立形態4 = 現在の国号「'''グレートブリテン及び北アイルランド連合王国'''」に変更\n"
なんとなく予想はできていましたが消えませんね。 正規表現での置換はre.sub関数を使うそうです。
import json import re from pprint import pprint def extract_base_info(text): m = re.search("{{基礎情報[^|]+\|(?P<info_body>.+?)\n}}", text, re.DOTALL) if not m: return {} info_body = m.group("info_body") info_dict = {} for item in info_body.split("\n|"): items = re.sub(r"'''", r"", item) key, word = re.split(r"\s*=\s*", items, maxsplit=1) info_dict[key] = word return info_dict text = extract("イギリス") base_info = extract_base_info(text) pprint(base_info, indent=4)
'確立形態4': '現在の国号「グレートブリテン及び北アイルランド連合王国」に変更',
27問目です。 [http〜 を消す問題。次のようなところですね。
'|GDP値元 = 1兆5478億<ref ' 'name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a= ' 'IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United ' 'Kingdom]</ref>\n'
https:を消す正規表現は次の通りなので、これを置換すれば良さそうです。
(https?)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)
import re from pprint import pprint def extract_base_info(text): m = re.search("{{基礎情報[^|]+\|(?P<info_body>.+?)\n}}", text, re.DOTALL) if not m: return {} info_body = m.group("info_body") info_dict = {} for item in info_body.split("\n|"): items = re.sub(r"\[(https?)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)", r"", item) items = re.sub(r"'''", r"", items) key, word = re.split(r"\s*=\s*", items, maxsplit=1) info_dict[key] = word return info_dict text = extract("イギリス") base_info = extract_base_info(text) pprint(base_info, indent=4)
実行結果。
'GDP値元': '1兆5478億<ref name="imf-statistics-gdp"> IMF>Data and '
'Statistics>World Economic Outlook Databases>By Countrise>United '
'Kingdom]</ref>',
良さそうです。
28問目。 < hoge > といったタグを消していく問題です。こちらもre.sub関数で置換していけば良さそうです。
import json import re from pprint import pprint def extract_base_info(text): m = re.search("{{基礎情報[^|]+\|(?P<info_body>.+?)\n}}", text, re.DOTALL) if not m: return {} info_body = m.group("info_body") info_dict = {} for item in info_body.split("\n|"): items = re.sub(r"\[(https?)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)", r"", item) items = re.sub(r"'''", r"", items) items = re.sub(r"<.*>", r"", items) key, word = re.split(r"\s*=\s*", items, maxsplit=1) info_dict[key] = word return info_dict text = extract("イギリス") base_info = extract_base_info(text) pprint(base_info, indent=4)
ぱっと見これで良さそうです。
ひとまず今日はここまで。
今日の結果
今日のAKBの呟きは61件でした。 要約するとこんな感じです。
起きてたら見に来てください♪0:50からやるよーー!""サムネイル公演終わり〜!今日もありがとうございました? 見ないと〜!!!この後24時59分からです!さとはドラマには出演していないのですが、23日の舞台マジムリ学園にゲスト出演します?? "おやすみ〜(*´ω`*)☆""サムネイル公演でした〜☆写真は前座に出てくれた交換留学生のステフィちゃんとモバイルちゃんと♡*゜2人とも綺麗だし大人っぽいし、何より日本語が上手でびっくり(゜o゜)!!今日もありがとうございました(*´ω`*)""私も載せていただきました☆是非皆さんチェックしてくださいね♡♡""今日まで!!皆さんお忘れなく♡*゜""今日は美容院にいってエクステを取ってきました!ショートゆいりーよろしくね?
'楽しい': 9, '嬉しい': 6, '可愛い': 2, '面白い': 2, '寂しい': 2, '高い': 1, 'たのしい': 1, '痛い': 1, '難しい': 1, '宜しい': 1, 'すごい': 1, 'おもしろい': 1, '寒い': 1, '熱い': 1, 'かっこよい': 1, 'っぽい': 1, 'よろしい': 1, 'ほしい': 1, 'ない': 1, '早い': 1, 'すっごい': 1 '今日': 16, '公演': 14, '楽しい': 9, '回': 9, '私': 9, '学園': 8, '最終': 8, 'さん': 8, '皆さん': 8, '人': 7, '期生': 7, '嬉しい': 6, '放送': 6, 'ちゃん': 6, 'の': 6, '出演': 6, 'ん': 6, '後': 5, '是非': 5, '部': 5, '方': 5, 'する': 33, '今日': 16, '見る': 16, 'くださる': 15, '公演': 14, 'いる': 11, '楽しい': 9, '回': 9, '私': 9, '学園': 8, '最終': 8, 'さん': 8, '皆さん': 8, '人': 7, '期生': 7, '嬉しい': 6, '放送': 6, 'ちゃん': 6, 'の': 6, '出演': 6, 'ん': 6, 'やる': 6, 'くれる': 6, 'いただく': 6, 'ある': 6,

2018/09/20【89日目】自然言語処理100本ノック、その7
25問目からです。 よくよく調べて見たら、?P< a >というのはグループ名の指定だったんですね。
(?P
...) 正規表現の丸括弧に似ていますが、グループによってマッチした部分文字列はシンボリックグループ名 name によってアクセス可能になります。グループ名は有効な Python 識別子でなければならず、グループ名は 1 個の正規表現内で一意でなければなりません。シンボリックグループは番号付けもされており、番号によるアクセスも可能です。 名前付きグループは 3 つのコンテキストで参照できます。パターンが (?P ['\"]).*?(?P=quote) (シングルまたはダブルクオートのどちらかにマッチ) の場合`:
となると、別に<>の中は< a >でも< hoge >でもよかったんですね。
しかし、25問目は答えが全くわからないのでググって解答を調べました。
import codecs
import json
import re
from pprint import pprint
def extract_base_info(text):
m = re.search("{{基礎情報[^|]+\|(?P<info_body>.+?)\n}}", text, re.DOTALL)
if not m:
return {}
info_body = m.group("info_body")
info_dict = {}
for item in info_body.split("\n|"):
key, word = re.split(r"\s*=\s*", item, maxsplit=1)
info_dict[key] = word
return info_dict
text = extract("イギリス")
base_info = extract_base_info(text)
pprint(base_info, indent=4)
いまいちよくわかっていないので、上から見ていきます。 上からimport pprint pprintは辞書型やリスト型を綺麗に表示するための関数だそうです。
base_infoのみの場合
{'GDP/人': '36,727<ref name="imf-statistics-gdp" />',
'GDP値': '2兆3162億<ref name="imf-statistics-gdp" />',
'GDP値MER': '2兆4337億<ref name="imf-statistics-gdp" />',
'GDP値元': '1兆5478億<ref name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a= IMF>Data and Statistics>World Economic Out
print(base_info)の場合
{'略名': 'イギリス', '日本語国名': 'グレートブリテン及び北アイルランド連合王国', '公式国名': '{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br/>\n*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}([[スコットランド・ゲール語]])<br/>\n*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}([[ウェールズ語]])<br/>\n*{{
pprint(base_info, indent=4)の場合
{ 'GDP/人': '36,727<ref name="imf-statistics-gdp" />',
'GDP値': '2兆3162億<ref name="imf-statistics-gdp" />',
'GDP値MER': '2兆4337億<ref name="imf-statistics-gdp" />',
'GDP値元': '1兆5478億<ref '
'name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weod
確かに綺麗になっていますね。
次に行きます。
m = re.search("{{基礎情報[^|]+|(?P<info_body>.+?)\n}}", text, re.DOTALL)
ここのsearch関数。 serch関数は以下のような動きをするらしいです。
string を走査し、正規表現 pattern がマッチする最初の場所を探して、対応する match オブジェクト を返します。文字列内にパターンにマッチする場所が無い場合は None を返します; これは文字列内のある場所で長さが 0 のマッチが見つかった場合とは異なることに注意してください。
m = re.search("{{基礎情報[^|]+|(?P<info_body>.+?)\n}}", text, re.DOTALL)
ここの処置のre.DOTALLというもの。
re.DOTALL(原文) 特殊文字 '.' を、改行を含むどんな文字にもマッチさせます; このフラグがなければ、'.' は、改行 以外の 任意の文字とマッチします。 インラインフラグの (?s) に相当します。
要は.を指定すると、全部拾うということですかね? ちょっと返してみます。 re.DOTALLがある場合
<_sre.SRE_Match object; span=(16, 2535), match='{{基礎情報 国\n|略名 = イギリス\n|日本語国名 = グレートブリテン及び北アイルランド連>
ない場合。
{}
何も返ってこないですね。
それで、その正規表現を変数に入れて、for文に入れて回すのが正解らしいですね。
info_body = m.group("info_body")
info_dict = {}
for item in info_body.split("\n|"):
key, word = re.split(r"\s*=\s*", item, maxsplit=1)
info_dict[key] = word
あー、なるほどなー、と思いつつも難しいですね。
今日の結果
今日のAKBの呟きは44件でした。 要約するとこんな感じです。
다시만나(SeeYouAgain)Produce48cover→#miyutube""明日17時〜ゆいりーさんとAKBcafeにお邪魔します?❤️お時間ある方はぜひ、待ってます^^#マジムリ学園""アンナさん公演終わりました?✨見に来てくださった方ありがとうございました^^4か月ぶりのアンナさん公演!凄く緊張しました? "早起きです✌️おはよー!今日ほんとに雨??↑しつこいw""アンナさん公演オンデマンドでみてるよ?✨こみさんの華がすごい!""AKBINGO見てねー☺️☺️☺️""ついに明日が最終回のマジムリ学園『百合を咲かせるか?』舞台前にぜひチェックです\(^o^)/""おはようございます✨福岡聖菜のSHIBUYADESHINING10月2日第4回は、、アシスタントに山邊歩夢ちゃんゲストに交換留学中のお2人TPEのMobileさん、JKTのStefiさんどんな放送になるか楽しみす…""握手会ありがとうございました✨公演や舞台の話などみなさんと楽しい時間を作れて嬉しかったなぁ。54thシングル選抜発表。気持ちを伝えたくて配信してみてくれるそんなみんながいるからこそ頑張ることができます。まだまだな私だ…""9月のプロフィール画像は#じゃんけん大会の衣装にしました☺️いつも21日にアイコンを変わるけど今回はどうしてもこの衣装の写真にしたくて、2日遅く変わりました待ってくれてすみません? の『210人の美女』に選んでいただきました?♀️ぜひチェックよろしくお願いします?♀️""54th『NOWAYMAN』の選抜メンバーに選んでいただきました?
'楽しい': 5, 'やばい': 3, '可愛い': 3, '嬉しい': 3, 'いい': 2, '遅い': 2, '痛い': 1, '明るい': 1, 'ない': 1, '凄い': 1, 'しつこい': 1, 'すごい': 1, 'よい': 1, '気持ちよい': 1 '公演': 13, 'さん': 10, '私': 10, 'アンナ': 8, '今日': 6, '選抜': 6, '日': 6, '楽しい': 5, 'メンバー': 5, 'ん': 5, 'チェック': 4, '方': 4, 'お願い': 4, 'アクシュカイ': 4, '月': 4, '人': 4, '千葉': 4, '髪型': 4, 'する': 20, '公演': 13, 'さん': 10, '私': 10, 'アンナ': 8, '見る': 8, '今日': 6, '選抜': 6, '日': 6, '楽しい': 5, 'メンバー': 5, 'ん': 5, 'みる': 5, 'くださる': 5, 'てる': 5,

2018/09/19【88日目】自然言語処理100本ノック、その6
この頃仕事が終電になることが多く、全然時間が取れませんが、せめて1時間だけでも。
24の続きからです。
正規表現の中に?P
import re r = re.compile(r'(File:(?P<filename>[^|]+)\|)') A = r.findall(n21) A[0]
('File:Battle of Waterloo 1815.PNG|', 'Battle of Waterloo 1815.PNG')
25問目 基礎情報を抜き出して、辞書を作る問題です。 基礎情報は|で始まってる=の後ろにvalueがある感じです。
{{基礎情報 国
|略名 = イギリス
|日本語国名 = グレートブリテン及び北アイルランド連合王国
|公式国名 = {{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br/>
今日も中途半端なところで終わってしまいましたが、また明日。
今日の結果
今日のAKBの呟きは84件でした。 要約するとこんな感じです。
少しお久しぶりの握手会楽しかったです☺️私服はこんなかんじでした(人頼み笑)""本日発表がありましたが、AKB4854thシングル選抜に選んで頂きましたー!!!わーーーーーい!!私の口からもお伝えしたいので突然ではありますが、このあと21:30-22:00の間で#showroomします??? "ありがとうございます!? "握手会ありがとうございました(^^)今日はみんなから沢山パワーをもらいました!応援の言葉をかけてくれた方もいつも通り接してくれた方も、皆さんのその優しさで心が温かくなりました☆本当にありがとう。""握手会ありがとうございました!楽しい握手会になったかな…今日はゆうなぁで双子コーデ??
'嬉しい': 21, '楽しい': 16, 'いい': 4, '良い': 3, 'よい': 3, 'すごい': 3, 'かわいい': 2, '悲しい': 2, '凄い': 2, '多い': 2, '優しい': 2, 'おもしろい': 1, '悪い': 1, '強い': 1, '欲しい': 1, '明るい': 1, 'くさい': 1, '悔しい': 1, '面白い': 1, '寂しい': 1, '残り少ない': 1, '小さい': 1, '遅い': 1, 'っぽい': 1, 'めんどくさい': 1, '温かい': 1} 'アクシュカイ': 56, '今日': 36, '部': 33, '方': 22, '嬉しい': 21, '楽しい': 16, '会': 15, '幕張メッセ': 14, 'レーン': 14, '券': 12, 'たくさん': 12, '私': 10, 'ちゃん': 10, '写真': 10, '久しぶり': 10, '当日': 9, '増し': 9, 'の': 7, 'ん': 7, '選抜': 7, 'お話': 7, '好き': 6, '気': 6, '日': 6, 'さ': 6, '個別': 6, 'ファン': 6, 'サイン': 6, '一緒': 6, '気持ち': 6, 'さん': 6, 'アクシュカイ': 56, 'する': 46, '今日': 36, '部': 33, '方': 22, '嬉しい': 21, '来る': 19, 'くれる': 18, '楽しい': 16, '会': 15, 'くださる': 15, '幕張メッセ': 14, 'レーン': 14, '券': 12, 'たくさん': 12, '使える': 11, '私': 10, 'ちゃん': 10, '写真': 10, '久しぶり': 10, 'いる': 10, '当日': 9, '増し': 9, '推す': 9, 'できる': 9, 'なる': 9, '会える': 8, '思う': 8, 'てる': 8, 'の': 7, 'ん': 7, '選抜': 7, 'お話': 7, 'ある': 7, '会う': 7, 'すぎる': 7, 'ける': 7,

2018/09/18【87日目】自然言語処理100本ノック、その5
この時間まで仕事が終わらず、日をまたいでしまったのですが、1問だけ解きたいと思います。 22問目の続きです。 次のようにタプルに追加しようと思ったのですが、タプルって追加できないんですね。
import re
result = ()
section_reg = re.compile(r'(==+)(.)(==+)')
A = r.findall(n21)
A[0][0:2]
for i in range(len(A)):
if A[i][0] == '====':
result.append(A[i][1],3)
elif A[i][0] == '===':
result.append(A[i][1],2).replace(“=”,””)
else:
result.append(A[i][1],1).replace(“=”,””)
2つ以上の要素を追加するにはリストで渡すのが良いそうなので、最終的には次のようにするといいような気がします。
import re result = [] r = re.compile(r'(==+)(.[^=]*)(==+)') A = r.findall(n21) A[0][0:2] for i in range(len(A)): if A[i][0] == '====': result.append([A[i][1],3]) elif A[i][0] == '===': result.append([A[i][1],2]) else: result.append([A[i][1],1]) print(result)
[['国名', 1], ['歴史', 1], ['地理', 1], ['気候', 2], ['政治', 1], ['外交と軍事', 1], ['地方行政区分', 1], ['主要都市', 2], ['科学技術', 1], ['経済', 1], ['鉱業', 2], ['農業', 2], ['貿易', 2], ['通貨', 2], ['企業', 2], ['交通', 1], ['道路', 2], ['鉄道', 2], ['海運', 2], ['航空', 2], ['通信', 1], ['国民', 1], ['言語', 2], ['宗教', 2], [' 婚姻 ', 2], ['教育', 2], ['文化', 1], ['食文化', 2], ['文学', 2], [' 哲学 ', 2], ['音楽', 2], ['イギリスのポピュラー音楽', 3], ['映画', 2], ['コメディ', 2], ['国花', 2], ['世界遺産', 2], ['祝祭日', 2], ['スポーツ', 1], ['サッカー', 2], ['競馬', 2], ['モータースポーツ', 2], ['脚注', 1], ['関連項目', 1], ['外部リンク', 1]]
23問目 参照されたファイルを全て抜き出せという問題です。 次のような箇所ですね。
[File:City of London skyline from London City Hall - Oct 2008.jpg|thumb|250px|[[ロンドン]]はビジネス、文化、政治などを総合評価した[[世界都市#世界都市指数|世界都市ランキング]]で、ニューヨークに次ぐ世界第2位の都市と評価された<ref>[http://www.atkearney.com/documents/10192/4461492/Global+Cities+Present+and+Future-GCI+2014.pdf/3628fd7d-70be-41bf-99d6-4c8eaf984cd5 2014 Global Cities Index and Emerging Cities Outlook] (2014年4月公表)</ref>。]
import re r = re.compile(r'(File.*)') A = r.findall(n21) A
これでいいんですかね?条件は満たしているような。。。問題が「メディアファイルを抜き出せ」なので、ファイル名を抜き出す必要があるんですかね? 続きはまた明日。
今日の結果
今日のAKBの呟きは82件でした。 要約するとこんな感じです。
"じゃんけん大会ありがとう? 名前入りの素敵な衣装を作ってもらったし、いつか3人でこの衣装を着て何か披露したいな、、…""今日はじゃんけん大会です✊✌️✋優勝目指して頑張ります?? 姉妹での活動がまたできるといいな!!!!ヽ(;▽;)ノこれからも…""#じゃんけん大会応援してくださった皆さんありがとうございました!!負けちゃった〜(;▽;)けど楽しかった\(^o^)/せっかくこんなに可愛い衣装を作ってもらえたので、またこの衣装を着て姉妹で何ができたらいいな♡*゜For…""じゃんけん大会ありがとうございました???
{'可愛い': 12, '楽しい': 11, '嬉しい': 10, 'すごい': 7, 'いい': 6, 'くさい': 2, 'よい': 2, '優しい': 2, '凄い': 2, 'ない': 1, '正しい': 1, '有難い': 1, 'くい': 1, '新しい': 1, '悔しい': 1, 'よろしい': 1, '寂しい': 1, '愛しい': 1, '多い': 1, '弱い': 1, '青い': 1, '美味しい': 1, '浅い': 1})
'大会': 37, '衣装': 26, 'ん': 26, '人': 14, '応援': 13, '可愛': ビーフォーティーエイト': 12, '楽しい': 11, '優勝': 11, '今日': 'ちゃん': 10, '披露': 10, 'こと': 10, 'さん': 10, '位': 10, '
'ける': 52, 'する': 48, '大会': 37, '衣装': 26, 'ん': 26, '人',可愛い': 12, 'エーケービーフォーティーエイト': 12, '楽しい',:今日': 11, '頑張る': 11, '嬉しい': 10, 'ちゃん': 10, '披露': 1,ん': 10, '位': 10, 'くれる': 10, '一緒': 9, 'くださる': 9, '負
