import os
os.chdir('/home/dsuser/workspace/backend')
import joblib
from modules.model.text_classify import *
itr = "00"
dataset_name = "aozora"
# dataset_name = "ldcc"
pipe = joblib.load(f"data/model/pipe-jptokenizermecab_{dataset_name}set_iter{itr}.gz")
pipe
Pipeline(steps=[('tokenizer', <modules.model.text_classify.JpTokenizerMeCab object at 0x7f0312105250>), ('vectorizer', TfidfVectorizer(lowercase=False, tokenizer=<function ident_tokener at 0x7f03126afa60>)), ('to_dence', <modules.model.text_classify.SparsetoDense object at 0x7f02a8e9fe80>), ('embedder', FeatureUnion(transformer_list=[('pca', PCA(n_components=16)), ('identity', <modules.model.text_classify.Transer object at 0x7f02a82ab160>)])), ('classifier', LGBMClassifier(importance_type='gain', num_class=5, objective='softmax'))])
dataset = joblib.load(f"data/dataset/{dataset_name}set_iter{itr}.gz")
X_train, X_valid = dataset.get_data(do_split=True)
y_train, y_valid = dataset.get_labels(do_split=True)
print("X_train:", len(X_train), "records")
print("X_valid:", len(X_valid), "records")
X_train: 1050 records X_valid: 450 records
print("X_train sample:")
X_train[0]
X_train sample:
['\r\n', '\r\n', '\r\n', '\r\n', '\u3000貧困というものは、云ってみれば今日世界にみちている。病気というものも、その貧困ときりはなせない悲しいつながりをもって今日の世界にみちている。今日の社会感情のなかでは、貧しさと病とに対して闘っている人々の余りの多さのために、おどろきが失われて普通のことがらの一つでもあるかのようになってさえいる。沁々考えてみると、そういう共通な不幸に感じを鈍くさせられて生きている生活の条件の荒っぽさ、冷血さはおそろしいと思う。更にもう一歩すすんで生活を観察すると、貧困といい病といい、それを受ける人の身が男であるか、女であるかということで、同じうち克つべき不幸ながらそこに深刻な相異がおこって来ているのも一つの現実ではないだろうか。\r\n', '\u3000第一書房から竹内てるよさんの『静かなる愛』という詩集が出ている。\r\n', '\u3000幼いときから苦しい境遇に育って、永い闘病生活のうちに詩をつくって来た女詩人であり、統一された境地を今の心にうちたてている詩人である。\r\n', '\u3000同じ題で六月の『新女苑』に過去の生活が書かれている文章もよんで、生活の困苦というものの女のうけた、そこからの高まりかたの女としての特色などについてさまざまの感動をこめて考えさせられた。\r\n', '\u3000この女詩人は生みの母を知らず祖父母に養育された。父は家によりつかない男であった。祖父母に生活能力がなくて、みじめな貧しさのなかで孫が働き、辛うじて糊口をつないだ。世間には男の児だとそういう境遇のめぐり合わせにおかれるものも決して一人や二人ではないだろうと思う。\r\n', '\u3000若い肉体に重すぎる生活の荷にひしがれて病気を発することも、その病気のために働きを休めば一家は饑餓にさらされることから遂に倒れてのち已む決心で働きとおす哀切な強い精神を持つ少年青年たちも、今日ただいま決して一人二人ではないであろう。\r\n', '\u3000だが、竹内てるよさんのように、借金のかたに借金主の息子の妻にさせられるというようなことは、男の子の受けない悲しみと苦しみではないだろうか。そして、子の母となりながら、妻の永い病に精根つき果てたような良人へ気をかねて、その愛子をのこして家を去る決心にまで追いこまれなければならなかったということも、男の一生にはない女のあわれさであると思う。\r\n', '\u3000ロマン・ローランは、人間の社会にのこされる最後の不公平は、健康と病とであると云っているけれども、女はその最後の不幸の中にもう一つ女であるということからの不幸の匣(はこ)を蔵していることは、私たちを沈思させる事実だと思う。\r\n', '\u3000人々は、結婚について語るとき、相方とも健康でなければならない、という。私たちは自然な理解でそれはそうだと思う。どちらが弱くても不幸だから、とおだやかにうけがって考える。けれどもそのうけがいは平静でやや実感から遠くあって、実際の結婚の営みのなかで永い病と闘っている妻たちの不安、気くばり、恐怖とはまだまだはなれたものである。どんな妻も、今日の社会の常識にとりかこまれた現実の中では、自分が永い病をするよりは、良人の看護をする方がまだましだと思っているだろうと思う。それは切なく辛いにしろ、自分が病んでいるのでなければ、自分の堅忍や努力の力で、互の愛を守れる可能もある。相当愛に確信のある夫婦でも妻の方が永年の病にかかったとしたら、妻であるその人に向けられている劬(いたわ)り、憐憫、愛にかわりはないとして、良人のその態度に妻は決して赤子のように抱かれきってはいられまい。心理的にどこかで我が身をひいて考える。その心持には、病人がはたの親切をへりくだった感謝でうけるというのとは、おのずからちがって複雑なニュアンスがこもっているのである。\r\n', '\u3000思えば、妻は健かでなければならぬという常識の中に、何と深く動かしがたく、家というものにおける女の歴史的な立場とでもいうようなものがほのめかされているだろう。極端な対比というかもしれないが、昔の奴隷市でも女奴隷は美しい上に必ず強壮でなければならなかったにちがいない。病気という不幸が少くとも人間共通の不幸として、そこへ特別女であるために生じる一層の不幸というものが加わって来ないような生活をつくり出して行きたいと願う心を、私たちは自分の世代の願いとして、否定してはならないのだと思う。\r\n', '\u3000竹内てるよさんは、カリエスという病が不治であることのため徹也という愛児をおいて家を去り、貧窮の底をくぐって、今は、療養の伴侶であり、友である神谷暢氏と夫婦でない、結婚生活でない共同生活を十三年営んでおられる。\r\n', '\r\n', '「苦しみぬき、もまれぬいてから、人生にはどんなにしても手のとゞかぬ不幸があり、どんなにもがいても、ぬけきれない苦しみがあることや、それに対する諦めや、そしてまたそのために人をうらみ、世をうらむ心を失ってしまったことに気がついた。静かなる愛、それは月の光をすくったような美しくきよらかな母の愛だけが今の私にはのこされている。いずこかに在る徹也よ。母はかくて母の清浄を守り、あなたのふるさとなる躯を、病と貧との中で、清く静かに生かして来た。これからも私に変りはないであろう。」\r\n', '\r\n', '『静かなる愛』はそういう特別な女の心、母の心の露が生活の朝夕にたまった泉のような詩集である。病みぬいた魂の平安と感じやすさというような趣のみちた作品である。特に、『静かなる愛』の後半には、そういう一つの境地に達した人生感、人生への哲学が表現されているのだが、私は、それよりも女の読者の一人として、前半にあつめられている詩のいくつかにうたれた。\r\n', '\r\n', '\r\n', '生れて何も知らぬ吾子の頬に\u3000母よ\u3000絶望の涙をおとすな\r\n', '\r\n', '\r\n', '\u3000格調たかく歌い出されている「頬」\r\n', '\r\n', '\r\n', '忘れかねたる吾子初台に住むときいて\r\n', '通るたびに電車からのび上るのは何のためか\r\n', '\r\n', '\r\n', '\u3000呻きのように母の思いのなり響く「秋」世路の荒さを肌に感じさせる「南風の烈しき日」\r\n', '\r\n', '\r\n', 'ひとりをかみしめて食む\u3000夕食と涙\r\n', 'たよりにする親木をもたない小さい花は\r\n', 'くらしの風に思うまゝ五体をふかせて\r\n', 'つぼみの枝も\u3000ゆれながらひらく\r\n', '\r\n', '\r\n', '「女ひとり」のこの涙は、作者一人の味わったものではないであろう。\r\n', '「ひとりの時」につましく鳴る喜悦のように表現されている充実感。「春来る」に流れ溢れている生活的な美感。「銀鱗」も、北国の五月、にしんの月の五月、まずしき生活の子供たちが生命のかぎり食べて肥ゆるなつかしき五月を溌剌とうたっている。暖くきらめく作者の感動は、「冷雨」において\r\n', '\r\n', '\r\n', '苦悩が\u3000衆生のものでなくして\r\n', '私ひとりのものであったら\r\n', '何を\u3000矜持として\u3000生きるものか\r\n', '\r\n', '\r\n', 'という、ひろがりをもっている。\r\n', '\r\n', '\r\n', 'けがれたまねは\u3000しまいと思う\r\n', 'しっかりと\u3000何よりもまず\r\n', '自らに立派で\u3000あろうと思う\r\n', '\r\n', '\r\n', '\u3000この生きる態度の決意と愛と真実をこの世に信じる心とは女詩人としての竹内さんの一途の道であると思える。そして、この一途の道は永年にわたる極めて独特な神谷氏との感情生活や、作者の年齢や心情のゆるぎを階子として「オリオンやシリウスたち」「アルゴ星」のように天へ向って高まり、或は「落葉をたく」「萩咲く」のような静的なリリシズムに曲折するのであろう。この愛についても例外的な境地に生きる女詩人が、今既にある峯に立っているその境地のなかで、そのような想念と情緒とをどのように展開し、すこやかに渾然と成熟させてゆくか。愛という字をつかわずに、人々の心に愛の火を点じてゆく芸術の奥義が、どんなにしてかちとられてゆくか、それは明日に待たれてよいのだと思う。\r\n', '\u3000それにしても、女の芸術家の響き立てる女というものの気配は、何と微妙で面白いだろう。竹内さんの詩の心は、例えば苦悩についても、それが衆生のものでなくて、私ひとりのものであったら、何を矜持として生きるものか、とうたわれているとおり包括のひろさにかかわらず、女という響は単数で響いている。女である故にめぐりあったこの世の惨苦を、女である故にもつことの出来た愛の力で生きぬいて来たこの女詩人はまことに純一無垢に女であって、しかも、詩のなかに響く女は単数である。それはおそらく闘病の生活という特殊な条件からも来ているだろう。その境地は清純であるとともに常に一つの女の内部からだけ主観的にうたわれていることに芸術上の問題をも含んでいるのである。\r\n', '\u3000永瀬清子氏の『諸国の天女』(河出書房)は、私という文字で、一人の女の心をうたっている時でも、そのわたしという響のなかに、何とはなしどっさりの女の旺(さかん)な気配が動いていて、『静かなる愛』とは実につよい対照をなす美と生活力とを表現しているのは感興をひかれる。\r\n', '\r\n', '\r\n', '諸国の天女は漁夫や猟人を夫として\r\n', 'いつも忘れ得ず想っている。\r\n', '底なき天を翔けた日を\r\n', '\r\n', '人の世のたつきのあわれないとなみ\r\n', 'やすむ間なきあした夕べに\r\n', 'わが忘れぬ喜びを人は知らない。\r\n', '\r\n', '\r\n', '\u3000諸国の天女、女たちが忘れぬ喜びとは何だろう。\r\n', '\r\n', '\r\n', 'ワガ本性ハカナシキ哉時キタレバ\r\n', '忽チニ再ビ瘡痍ヨリ芽フキテ\r\n', 'ソノ傾ケル紅ハ茎ナガク\r\n', 'イトハルカナル方ニムカフ(白昼)\r\n', '\r\n', 'くさんちっぺもかわいそう\r\n', 'にんじんの母親もかわいそう\r\n', 'トルストイ夫人も自分のよう\r\n', 'まして私はかわいそう\r\n', 'これでは気のきいた批評などはかけず\r\n', 'たゞどもるばかり(冬)\r\n', '\r\n', '\r\n', '\u3000けれども、「草に寄す」「夏」「落差に就いて」「わが肉は新陳代謝はげしく」などにもり上りほとばしる感情の勁靭さ、豊富さと清潔さとには、気持よい水しぶきで顔をうたれるような悦びがある。\r\n', '\r\n', '\r\n', '私は凍らず天をみない\r\n', '落差ます/\はげしく一樹なく\r\n', '人工の浪漫なくおもむきなく\r\n', '世の規定を知らずとび落ちよう\r\n', 'おのが飛沫の中にかゞやき落ちよう(中略)\r\n', 'おゝ詩はやわらかい言葉のためにあるのではない\r\n', 'わがうたは社交と虚礼のために奏でざれ\r\n', 'あかつきの大気をくぐりぬけ\r\n', '美しい霜のおくように\r\n', 'そんなに私はわが詩を貴方の胸におくりたい\r\n', '\r\n', '\r\n', '\u3000面白いことだと思う。むかし話に漁師伯龍とその妻となった三保の松原の天女の物語があって、それを大正の時代に菊池寛が「羽衣」という短篇に書いた。天女を妻とした漁師伯龍は元来女たらしであったのだが、天女を妻として十日ほどは彼も大満悦であった。天女は美しくて、彼の肉情も十分に満足させた。けれども、天女だから何にもしない。夕方になって伯龍が腹をぺこぺこにして戻って来て見ると、自分が食べない御飯はたくことも知らない天女の妻が退屈もせず縁側などにぼんやり腰かけている。伯龍がこらえかねて或るとき「このたわけ者め!」と足をあげて蹴ったらば、天女の妻は体が軽いので一二間はねとばされたが声も立てず闇の中でにこにこ笑っている。何より不満なのは天女に少しも話のないことだった。やきもちさえもおこさない。だが天女の妻は美しくて彼の肉情を満足させた。一ヵ月もたつとさすがの伯龍が降参して、もう天へかえって呉れとたのんだが、天女の妻は「天に偽りなきものを」と約束の三ヵ月だけ伯龍のもとにとどまった。伯龍はひどい神経衰弱になった。そして天女がかえってから、伯龍は暫く女房をめとろうとしなかった、と昔の菊池寛らしく、天上的なものへの諷刺を語っているのである。\r\n', '\u3000菊池寛によってかかれた天女が、男の肉情をみたすことだけは知っていたというのは、何と皮肉なようなことだろう。菊池寛にそのようなものとして描き出された天女が、諸国にすまって\r\n', '\r\n', '\r\n', 'きずなは地にあこがれは空に\r\n', '冬すぎ春来て暮すうち、いつしか\r\n', 'おゝ詩はやわらかい言葉のためにあるのではない\r\n', '\r\n', '\r\n', 'とうたい出すようにもなって来たということは、ほんとに面白いことだと思う。現代の天女は話しがないどころか、自身が女の習俗で習慣づけられて来た「論理のどもり」を自ら知り、「素描」の新鮮な感性の価値を影響に研こうと欲し「女性は文学に死せず」や「皮膚をきたえん」には女性と芸術との厳しく隠微な関係さえとらえられ考えられうたわれている。\r\n', '\u3000永瀬さんが今日の日本の女性の詩人として示している独特な美と力とは、女心が縷々(るる)として感じてうたう自然発生の魅力ばかりを鑑賞されることにたよっていないで、女が考える、という合理的な事実を承認して、それをまざまざとした感性で表現してゆく天稟をもっているところに在ると思う。「ギリシャの海では」「デカダンスは」「約束せぬ恋」「女性の価値標準」などは、そういう意味で女の成長のためのたたかいをうたってもいる。\r\n', '\r\n', '\r\n', '女性としてかなしいくらいふしぎな責任。\r\n', 'それは絶望してはならないことだ。\r\n', 'それは天地の底からの母親ごころがゆるさないのだ。\r\n', '\r\n', '古今のすぐれた女性は皆この人生へのいたわりを持っている。\r\n', 'デカダンスは男のものである。\r\n', '特に現代に於いては。(デカダンスは)\r\n', '\r\n', '\r\n', '\u3000竹内てるよさんの「静かなる愛」の表現とこの永瀬さんのこの詩の言葉とは何と相異しながら、女性としての感覚においては同じ本質をもっていることだろう。\r\n', '\u3000永瀬さんは、女の歴史、日本の女の成長の酸苦を「麦死なず」のなかにうたっている。\r\n', '\r\n', '\r\n', '私らにとっては樹木が自然の季節を知るように自明であることはなんにもない。\r\n', 'どんなことでも私らは迷って見なければならないのだ。\r\n', '彷徨しないために一生さえ彷徨しなければならないのだ。\r\n', '\r\n', '\r\n', '\u3000その女の歴史の切ない必然を見ることをしない男たちは\r\n', '\r\n', '\r\n', '自分らの不明を反省するより\r\n', '浅はかな理想の幻影に\r\n', 'エキセントリックなまでに殉じようとした彼女らをあざける。\r\n', '\r\n', '\r\n', 'と、正当な怒りが向けられている。「麦死なず」という石坂洋次郎の小説があった。そこでは歴史の或る時代の或る種の女の動きが、劇画化されて描かれた。題が同じだということばかりでなく、この「麦死なず」の詩に女の真情的なもので同じ現象が見られていると思う。女には\r\n', '\r\n', '\r\n', 'しかしその時期の間に\r\n', '少くとも年輪は一個ふえた\r\n', '\r\n', '\r\n', '事実が感じられているのは意味ふかいことである。\r\n', '\u3000すべての詩を愛す女のひとたち、あらゆる文学の仕事を愛しそれに従って行こうとする女の人々に私は特にこの詩集の中の「流れるごとく書けよ」の一篇をおくりものとしたい。\r\n', '\r\n', '\r\n', '\u3000\u3000(前略)\r\n', 'あゝ腐葉土のない土に\r\n', '種まく日本の女詩人よ\r\n', '自分自身が腐葉土になるしかない女詩人よ\r\n', 'なれよ立派な腐葉土に。\r\n', 'あらゆることを詩でおもい\r\n', 'あらゆることを詩でおこない\r\n', '一呼吸ごとに詩せよ。\r\n', '日記をかくようにたくさんの詩をかけよ\r\n', '手紙をかくようにたくさんの詩をかけよ\r\n', '\u3000\u3000(中略)\r\n', '時々刻々に書き書けば\r\n', '成りがたい彫心縷骨の一篇よりも\r\n', '更に山があり谷があり\r\n', '貴女の姿のまるみのみえる\r\n', '逆説的の不思議はそこに\r\n', '普段着のごとく書けよ\r\n', '流れるごとく書けよ\r\n', '\u3000\u3000まるでみどりの房なす樹々が\r\n', '\u3000\u3000秋にたくさん葉をふらすのように\r\n', '\u3000\u3000とめどもなくふってその根を埋めるように\r\n', '\u3000\u3000たくさんの可能がその下にゆっくり眠るように。\r\n', '\r\n', '\r\n', '\u3000女は女自身女の詩という観念の枠が、時のあゆみのなかでもうはずされていいことを知らなければならない。一人でも多く、妻となり、母となり老婦人となってそれぞれの真実に立った詩を生む女詩人が生れなければならない。日本では男でさえ、詩情は青春の発露のように思い、またその程度の人生感銘の精神しかもたない例が多い。詩人らしいということは、線が細いと同義語のようにつかわれ、いくらか鋭い感受性といささかの主観のつよさと、早期の枯凋とを意味するとしたら、それは人間としてくちおしいことだと思う。\r\n', '\u3000習俗のつよい圧力は、女が詩をつくる心をもって生れたという一事で既に、その人の人生に或る摩擦と波瀾とを予約するというのが私たちの生きる現実のありさまである。けれども、女一人を波瀾に導くその力そのものがとりもなおさずそのひとを立ちあがらせ、やがて歩ませる力でもあるということは、つきぬ味のある実際である。そのことは竹内てるよさんの生活と作品との関係を見ても誰にも分ることだし、『諸国の天女』をよめば、詩というものは不幸のなかに在ってその人をくずおれさせないばかりか、不幸をへらそうとする人間の不断の向上の努力そのものの表現であり得ることさえ理解されるのである。\r\n', '\u3000永瀬さんが益々詩想をすこやかにゆたかにして、時流の観念化に押しながされず、安易な象徴にかがまず「糸針抄」の精神の輝きをいよいよ増して製作されることを祈っている。〔一九四〇年十月〕\r\n', '\r\n', '\r\n', '\r\n', '\n']
# predict trainset
p_train = pipe.predict(X_train)
train_acc = accuracy_score(y_train, p_train)
print("train_acc:", train_acc)
train_acc: 1.0
# predict validset
prob_valid = pipe.predict_proba(X_valid)
print("prob_valid sample:", prob_valid[0])
prob_valid sample: [2.08005989e-02 1.45618535e-02 9.59976370e-01 4.25145191e-03 4.09725736e-04]
lgbm = pipe[-1]
p_valid = lgbm._le.inverse_transform(prob_valid.argmax(axis=1))
valid_acc = accuracy_score(y_valid, p_valid)
print("valid_acc:", valid_acc)
valid_acc: 0.7955555555555556
lgbm._le.inverse_transform(range(len(dataset.labelset)))
array(['NDC 911', 'NDC 913', 'NDC 914', 'NDC 915', 'NDC K913'], dtype='<U8')
dataset.labelset
array(['NDC 911', 'NDC 915', 'NDC 914', 'NDC K913', 'NDC 913'], dtype='<U8')
import numpy
from sklearn import metrics
from matplotlib import pyplot
def plot_pr_curve_by_label(ax, lbl: str, t: numpy.ndarray, p: numpy.ndarray):
fpr, tpr, __thresholds = metrics.roc_curve(t, p)
auc = metrics.auc(fpr, tpr)
# print(f"ROC Area / {lbl} : (AUC = {auc:.3f})")
precision, recall, thresholds = metrics.precision_recall_curve(t, p)
ap = metrics.average_precision_score(t, p)
ax.step(recall, precision, color='g', alpha=0.2, where='post')
ax.fill_between(recall, precision, step='post', alpha=0.2, color='g')
ax.set_xlabel('Recall')
ax.set_ylabel('Precision')
ax.set_xlim([0.0, 1.05])
ax.set_ylim([0.0, 1.0])
ax.set_title(f'{lbl} : AP={ap:0.3f} / AUC={auc:0.3f}')
def plot_pr_curve(dataset, pipe, label_plotter):
n_classes = len(dataset.labelset)
n_rows = int(numpy.sqrt(n_classes))
print("n_rows:", n_rows)
delta = int(bool(n_classes % n_rows))
n = (n_classes // n_rows) * n_rows + n_rows * delta
n_cols = n // n_rows
n_rows -= int(n == n_classes + n_cols)
fig, axes = pyplot.subplots(nrows=n_rows, ncols=n_cols, figsize = (10, 10), squeeze=False, tight_layout=True)
fig.suptitle('PR-Curves', fontsize=16)
lgbm = pipe[-1]
for idx, lbl in enumerate(dataset.labelset):
idx_lbl = lgbm._le.transform([lbl])
t = (numpy.array(y_valid) == lbl).astype(numpy.int32)
p = pipe.predict_proba(X_valid)[:, idx_lbl]
r = idx // n_cols
c = idx % n_cols
label_plotter(axes[r, c], lbl, t, p)
# show plots
fig.tight_layout()
fig.show()
plot_pr_curve(dataset, pipe, label_plotter=plot_pr_curve_by_label)
n_rows: 2
def plot_pr_threshold_by_label(ax, lbl: str, t: numpy.ndarray, p: numpy.ndarray):
precision, recall, thresholds = metrics.precision_recall_curve(t, p)
ax.step(thresholds, precision[:-1], color='b', alpha=0.2, where='post')
ax.fill_between(thresholds, precision[:-1], step='post', alpha=0.2, color='b')
ax.step(thresholds, recall[:-1], color='r', alpha=0.2, where='post')
ax.fill_between(thresholds, recall[:-1], step='post', alpha=0.2, color='r')
ax.legend(["Precsion", "Recall"], loc='lower right')
ax.set_xlabel('Threshold')
ax.set_ylabel('Precision/Recall')
ax.set_xlim([0.0, 1.05])
ax.set_ylim([0.0, 1.0])
ax.set_title(f'{lbl}')
plot_pr_curve(dataset, pipe, label_plotter=plot_pr_threshold_by_label)
n_rows: 2
tokenizer = pipe[0]
tokenizer
<modules.model.text_classify.JpTokenizerMeCab at 0x7f0312105250>
from lime.lime_text import LimeTextExplainer
labels_indices = range(len(dataset.labelset))
labels = lgbm._le.inverse_transform(labels_indices)
explainer1 = LimeTextExplainer(class_names=labels, split_expression=lambda x: x.split(" "))
def make_feature_text1(idx: int) -> str:
tokens = tokenizer.transform([X_valid[idx]])[0]
feature = " ".join(tokens)
return feature
from sklearn.pipeline import make_pipeline
pipe1 = make_pipeline(Splitter(), pipe[1:])
pipe1
Pipeline(steps=[('splitter', <modules.model.text_classify.Splitter object at 0x7f03030f3850>), ('pipeline', Pipeline(steps=[('vectorizer', TfidfVectorizer(lowercase=False, tokenizer=<function ident_tokener at 0x7f03126afa60>)), ('to_dence', <modules.model.text_classify.SparsetoDense object at 0x7f02a8e9fe80>), ('embedder', FeatureUnion(transformer_list=[('pca', PCA(n_components=16)), ('identity', <modules.model.text_classify.Transer object at 0x7f02a82ab160>)])), ('classifier', LGBMClassifier(importance_type='gain', num_class=5, objective='softmax'))]))])
from sklearn.linear_model import Ridge
class Explainer(object):
def __init__(self, explainer, feature_maker, pipe):
self.explainer = explainer
self.feature_maker = feature_maker
self.pipe = pipe
def explain(self, indices_samples, n_pickup=2):
model_regressor = Ridge(alpha=1, fit_intercept=True, random_state=rs)
for idx in indices_samples[:n_pickup]:
print("idx:", idx, f"actual: {y_valid[idx]}", f"prediction: {p_valid[idx]}")
x = self.feature_maker(idx)
print("x:", x[:64].strip(), "...")
exp = self.explainer.explain_instance(x, self.pipe.predict_proba, num_features=10, top_labels=2, model_regressor=model_regressor)
exp.show_in_notebook(text=True)
return
explr = Explainer(explainer1, make_feature_text1, pipe1)
rs = numpy.random.RandomState(1234567)
indices_samples_correct = numpy.arange(len(y_valid))[y_valid == p_valid]
indices_samples_correct = rs.permutation(indices_samples_correct)
## 正判定のテキストの説明
explr.explain(indices_samples_correct)
idx: 385 actual: NDC K913 prediction: NDC K913 x: 一 天下 てんか 勢力 せい ょく 一門 もん あつめ いばっ い 平家 いけ とうとう 源氏 げんじ ため ほろぼさ れ 安徳 ...
idx: 190 actual: NDC 915 prediction: NDC 915 x: 荷風 歳 四十 正月 元日 例 つて 為す 事 なし 午 頃 家 内 暖 く 待ち そこら 取 片づけ 塵 掃 ふ 正月 二日 ...
indices_samples_wrong = numpy.arange(len(y_valid))[y_valid != p_valid]
indices_samples_wrong = rs.permutation(indices_samples_wrong)
## 誤判定のテキストの説明
explr.explain(indices_samples_wrong)
idx: 362 actual: NDC K913 prediction: NDC 911 x: はしがき 一 太平洋 波 浮べる この 船 似 我 日本 國 人 今や 徒らに 富士山 明 麗 風光 恍惚 時 あら 光 譽 あ ...
idx: 66 actual: NDC 915 prediction: NDC 914 x: お 手紙 拝見 いたし 野村 耕作 氏 研究 希望 閣 出版 する こと 決定 昨年 夏 頃 校了 なっ いる はず それ 未だ ...
pipe2 = make_pipeline(Splitter(sep=" "), pipe)
pipe2
Pipeline(steps=[('splitter', <modules.model.text_classify.Splitter object at 0x7f03030e98e0>), ('pipeline', Pipeline(steps=[('tokenizer', <modules.model.text_classify.JpTokenizerMeCab object at 0x7f0312105250>), ('vectorizer', TfidfVectorizer(lowercase=False, tokenizer=<function ident_tokener at 0x7f03126afa60>)), ('to_dence', <modules.model.text_classify.SparsetoDense object at 0x7f02a8e9fe80>), ('embedder', FeatureUnion(transformer_list=[('pca', PCA(n_components=16)), ('identity', <modules.model.text_classify.Transer object at 0x7f02a82ab160>)])), ('classifier', LGBMClassifier(importance_type='gain', num_class=5, objective='softmax'))]))])
def _tokenize(x: str) -> list:
sentences = x.split(" ")
tokenized = tokenizer.transform([sentences])
return tokenized[0]
def make_feature_text2(idx: int) -> str:
feature = " ".join(X_valid[idx]) # join all lines with space
return feature
explainer2 = LimeTextExplainer(class_names=labels, split_expression=_tokenize)
explr = Explainer(explainer2, make_feature_text2, pipe2)
## 正判定のテキストの説明
explr.explain(indices_samples_correct)
idx: 385 actual: NDC K913 prediction: NDC K913 x: 一 天下(てんか)の勢力(せいりょく)を一門(もん)にあつめて、いばっていた平家( ...
idx: 190 actual: NDC 915 prediction: NDC 915 x: 荷風歳四十 正月元日。例によつて為す事もなし。午の頃家の内暖くなるを待ちそこら取片づけ塵を掃ふ。 正月二日。 ...
# 誤判定文書の解析
explr.explain(indices_samples_wrong)
idx: 362 actual: NDC K913 prediction: NDC 911 x: はしがき 一。太平洋の波に浮べる、この船にも似たる我日本の國人は、今や徒らに、富士山 ...
idx: 66 actual: NDC 915 prediction: NDC 914 x: お手紙拝見いたしました。 野村耕作氏の研究は希望閣から出版することに決定、昨年夏頃校了になっているは ...
from IPython.display import HTML
HTML('''<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js">
</script>
<script>
code_show=true;
function code_toggle() {
if (code_show){
$('div.jp-Cell-inputArea').hide();
} else {
$('div.jp-Cell-inputArea').show();
}
code_show = !code_show
}
$( document ).ready(code_toggle);
</script>
''')
# <form action="javascript:code_toggle()"><input type="submit" value="Show/hide code"></form>