初学者のためのプログラミング学習サイト自然言語処理TKO木下の動画コメントを感情分析してみた2020年04月11日カテゴリ:Python自然言語処理TKO木下の動画が絶賛炎上中だと聞きつけまして早速コメントを感情分析してみました解説動画はこちら炎上している動画はこんな感じです。動画タイトル:TKO木下よりご報告がございます。素晴らしい低評価の数ですねー。私は動画は見ておりませんが低定評に1評投じさせていただきました。こちらを参照してください。中身はこんな感じでない:ない:助動詞:-0.999997酷い:ひどい:形容詞:-0.999997病気:びょうき:名詞:-0.999998死ぬ:しぬ:動詞:-0.999999悪い:わるい:形容詞:-1ポジティブワード、ネガティブワードがありポジティブ方向になると0から1点ネガティブ方向は-1から0点の間の数値を取ります。単語のポジネガ具合が分かる訳です。手順としては1.事前にYoutubeのコメントを集める。Youtubeの動画のページをスクロールしてコメント表示させてから保存する。2.BeautifulSoupでHTMLの中からコメントの部分だけ拾い上げる。比較してポジネガ点数をつけるポジティブだとプラス,ネガティブだとマイナスの点になるまずはじめに動画のコメントを集めなければならないので動画のページをブラウザーで開いてコメントを表示させたら、HTMLファイルに保存します。次にPythonのコードを使ってHTMLの構文解析を行い、コメントを抽出します。インストールしておきましょう。次にhtmlファイルを読み込んで変数に格納しておきます。_f.read()お次はコメント部分の抽出です。htmlファイルの中からコメントを抽出してリストに格納しています。事前にダウンロードしておいてCSVファイルなどにしておいてください。単語を辞書型に取り込みます。float(rows[3])最後にコメントを形態素解析してポジネガで点数をつけていきます。nega_result[rows[3]]=countこれでコメントにポジネガの点数が付きました。ネガティブなコメントは・・・-53.76871590000002私は叙々苑でバイトをしていた者です。1年前、TKO木下が私のバイト先東京の叙々苑を訪れた際の記憶は忘れられません。TKO木下は入店早々に既に様子がおかしく、ホール担当だった私の胸ぐらを急に掴み一言。「さっさと案内しろやボケ」と。全文はかなり長いので端折りますが冒頭を見るだけでもかなりネガティブさが伝わる文面です。ネガティブの一番悪いものでも-1点なので60個近くネガティブな単語が使われているコメントでした。これだけの長文を想像で書くのは無理でしょうから実体験だったんだろうと思いますね。いうようなネガティブコメントが多数並んでいました。逆にポジティブなコメント有るんかな?みてみましょう。なんかこんだけ荒れてることすらおいしいな〜とか思ってそう。うちの姪が初めて掴まり立ちしましてね。低評価日本一おめでとナス!低評価おめでとう、など悪い意味で褒めてる感じですねwwwwww。いうわけで、まとめですが日頃の行いは大事です。見てない所でも敬意を払うことは当たり前だと思います。タレントさんの私生活にはその人となりが出るようですね。素行の悪い方がテレビに出るのはあまり良いことだとは思いません。ネガティブなイメージの有るタレントをCMなどに使うと商品、サービスにもネガティブイメージがつくので我々企業側の人間はこういうタレントは使わないようにしないといけないです。いうことで動画コメントの感情分析でした。皆様も日頃の行いには気をつけたほうが良いですよ誰がみてるか分かりませんし。形態素解析Official髭男dismの歌詞の特徴を見てみたい2020年04月04日カテゴリ:Python自然言語処理グッバイ、イレーーギュラーーーーーとか叫びたくなる今日この頃なんとなくOfficial髭男dismの歌詞の特徴を見てみたいと思ってしまいました。解説動画はこちらはいひげだんさんの歌詞の特徴を見ていきたいですが事前準備として1.歌詞を集める2.形態素解析する3.テキストファイルにするこの作業が必要でーーーす。これができましたら以下のコードを試すことができます。ワードクラウドで歌詞の特徴を可視化する。ワードクラウドは歌詞に出てくる単語の出現頻度順で文字を大きさを決めて、1枚にまとめたものです。).generate(text)wordcloud.to_file('higedan.png')plt.figure(figsize=(12,9))plt.imshow(wordcloud)plt.axis("off")plt.show()このコードではfpathでフォントの場所を指定しているのでお使いのマシンのパスにあわせてください。「僕と君がする」んでしょうね!!!!何をするかは存じませんが割と一般的な語句が多いようですね。歌詞の特徴としてはそこまで突拍子もない単語は連呼していない訳です。次に単語の数ではなくTF-IDFで重要そうな言葉を見てみます。略で、単語の出現頻度を表します。略で、逆文書頻度を表します。これを掛け合わせたものがTF-IDFである単語が多くの文書で出現するほど値は下がり特定の文書にしか出現しない単語の重要度を上げる役割をします。TF-IDF値は0-1の間の値を取ります。重要なキーワードは1に近づきます。0.25より大きなワードを出してみました。id1は最近佐藤健さんが主演したドラマの主題歌です。閾値0.1にすると「イレギュラー」も含まれてきます。id43は映画の主題歌になった曲です。「グッバイ」が特徴的な感じしますね。最後にn-gramをみてみます。n-gramとはn個の単語の繋がりを表す言葉で3つの単語であればtrigramになります。多かったのは英語の歌詞の繋がりでした。英語の歌詞を多用している感じがあります。まとめると・全体的に割と一般的な日本語を多く使用する。・割と英語を多用するところもある。歌詞の特徴を見るには他にもいろんな手法があると思いますが比較的簡単な方法をご紹介しました。皆さんもぜひ試してみてください。自然言語処理100本ノックの第二章UNIXコマンドの基礎をやっていきます。自然言語処理100本ノック解説動画はこちらさて第二章はUNIXコマンドを用いてやりなさいというのが問題文に書いてありますので覚えたほうが良さそうなLINUXコマンドを挙げておきます。(テキストを指定した幅で改行して出力する)こんだけ使いました。Python言語でやるのも良いのですが実はUNIX系のコマンドは自然言語処理では非常に優秀なので覚えておくと作業が捗ると思います。この動画はMacOSでやっているのでJupyterNotebook上でもコマンドが使えますが古いWindowsを用いている人はコマンドが使えないのでコマンドが使える環境で試して下さい。あれば使えるのでアカウントを持っておくと良いかもしれません。問題を解いていきましょう。第二章ではテキストファイルを用いていきます。手元にダウンロードしておきましょう。hightemp.txt全問共通でこのファイルを使うのでファイルのパスを指定しておきましょう。行数のカウント行数をカウントせよ.確認にはwcコマンドを用いよ.最初は行数を数える問題です。ここら辺は基本ですね。pythonでの行数カウントはこんな感じですぐできます。hightemp.txt24wcコマンドで行数を数えることができます。タブをスペースに置換タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.文字列置換の問題ですねPythonでは文字列型の関数であるreplaceで実現できます。繋げてtrコマンドで結果を置換できます。楽な方法としてはPandasのデータフレームというのが使えます。2013-08-10タブ区切りのファイルを読み込みする場合はread_tableというのが使えます。1行目からデータなのでヘッダー行がありません。header=Noneでヘッダーの指定もしておきましょう。次にファイルへの分割です。データフレームの列で抽出しto_csvでファイル化できます。df[[0]].to_csv('col1.txt',index=False,header=False)df[[1]].to_csv('col2.txt',index=False,header=False)ファイル出力する際はindexとheaderの指定もしておかないと出力されてしまうので、Falseを指定して出力されないようにしておきます。Linuxコマンドの場合はこれをcutコマンドで実現できます。p2.txtcutコマンドでは区切り文字を指定してその何列目を取るかという指定ができます。ファイル名でファイル出力ができます。col1.txtとcol2.txtをマージ12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.ファイルの結合問題です。先ほど作ったファイルを連結させてみましょう。データフレームに2つのファイルを読み込みします。pd.read_table('col2.txt',header=None)データフレームの結合はpd.concat([データフレーム,データフレーム])で行います。行列、どちらの方向で結合するのかを指定しないといけないのでaxis=1で列方向にくっつけるのを指定します。pd.concat([df1,df2],axis=1)df3.to_csv('col3.txt',index=False,header=False,sep='\t')ファイル出力はto_csvですが区切り文字を指定しておかないとタブ区切りにはならないのでsep=区切り文字で区切り文字を指定しましょう。p12.txtpasteコマンドでファイル連結の結果出力ができます。その場合どの区切り文字で連結するかを指定し最後に結果をファイル出力をします。自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.これもデータフレームで簡単に操作できます。データフレーム変数.head(行数)で先頭行から抽出できます。2007-08-16input()で入力を受け取ることができます。int()で整数値に変換しています。Linuxコマンドも同様のheadコマンドで先頭行から出力できます。自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.これは14問目がtailに変わるだけです。tailコマンドは末尾から出力できます。ファイルをN分割する自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.ファイル分割ですがいろいろやり方があるので1例を紹介します。numpyのsplitを用いてデータフレームを分割します。2007-08-16分割した結果を表示しています。ファイル出力をしたければ繰り返しの中でファイル出力を行いファイル名を動的に変えれば実現できると思います。uniqコマンドを用いよ.ユニークカウントの問題です。こっからはテクニックが必要かなーと思います。Pythonの方からデータフレームに読み込んだ後はvalue_countsで列の値のユニークカウントができます。1列目を指定してvalue_countsの結果のindex値の個数を求めています。ユニークカウントします。個数だけ出したければwcコマンドを繋げましょう。各行を3コラム目の数値の降順にソート各行を3コラム目の数値の逆順で整列せよ確認にはsortコマンドを用いよ並び替えの問題ですね。データフレームではsort_valuesで並び替えをすることができます。ソートでは昇順と降順があるのでascending=Trueで昇順、Falseで降順です。1994-08-08データフレームではデータの型があります。数値型であれば数値の大小での並び替えになります。Linuxコマンドではsortコマンドで並び替えできます。並び替えの対象列を指定してます。sortコマンドを用いよ.17問目と似ていますが17問目は各行の値でのユニークカウント今度はそれぞれの文字でのユニークカウントですね。1列目の文字を全部抜き出してみましょう。構文でファイル読み込みして1列目だけをリスト型に格納しそれをjoinで繋げて1つの文字列にします。for文では文字列型は1文字ずつ処理できるので1文字ずつ集計します。集計は辞書型などで行うことができます。res[t]=1最後に辞書型の結果を並び替えて出力です。3結構長くなりましたね。Linuxコマンドをみてみましょう。17問目の答えでは1行ずつ処理していましたのでそこに1つコマンドを足します。コマンドは指定した文字数で改行させるコマンドです。これを用いて1行の文字列を1文字ずつ複数行に変換しそれをユニークカウントしています。はい第二章はこれで終わりです。LinuxコマンドはMacでは標準で使用できますし開発現場では普通に使用していると思います。ログファイルの操作や中身の確認などでも威力を発揮しますし、1行で済んだりしてとても効率が良いです。Pythonなどと並行して覚えておくと自然言語処理がスムーズになるかと思いますので覚えておいて損はないと思います。今回はここまでですそれでは。100本ノック準備運動の続きです。XとYとして求め,XとYの和集合,積集合,差集合を求めよ.さらに,'se'というbi-gramがXおよびYに含まれるかどうかを調べよ.文字列の集合を考える問題です。bi-gramというのはふた文字の組み合わせです。前回作成したn-gramを作る関数を用いてbi-gramを作っていきます。range(len(st)-n+1)]pythonでは集合を表現するデータ型があります。set型は重複を排除したデータ構造です。リスト型からset関数で作成できるのでbi-gramの結果をそのままsetにします。'gr'}先頭から二文字ずつ切り取った文字を集合にしているので重複した部分は取り除かれます。含むかどうかの判定は以下のようなコードになります。z=22.4として,実行結果を確認せよ.恐らくですが気温を英語に直すとtemperatureなのでtemplateとかけているんじゃ無いかと!!!!素敵すぎる問題です。嫌いじゃ無い、こういうのということでPythonでは文字列のformatで文字の差込ができます。z=22.4)'12時の気温は22.4'メールの定型文など文字の差し込みをする際に非常に便利で業務でも多用します。formatは覚えておくと非常に重宝しますね。・その他の文字はそのまま出力この関数を用い,英語のメッセージを暗号化・復号化せよ.まずは英小文字かどうかを判定するという部分です。これは非常に厄介でPythonでは文字列型にそれっぽい関数があるのですがうまく判定されないという致命的な欠陥があります。判定関数を先に作ります。reライブラリを用いて正規表現で英小文字を判定します。Noneこの関数を用いると英小文字以外はFalseになります。この判定結果を用いて暗号文を作成する関数を作ります。文字コード)の文字に置換というのがあります。文字というのは全て文字番号が存在し一文字ずつ番号が降られています。Pythonではord(文字列)で文字番号を取得できます。chr(番号)で文字を取得できます。組み合わせると文字を変換できるというわけです。最終的にできた関数はこちら。cipher(message)print(cipher_text)#復号化print(cipher(cipher_text))私の名前は乙kbです私の名前は乙pyです関数の結果は文字が暗号化されその結果をもう一度関数にかけると元の文字に復号されます。)を与え,その実行結果を確認せよ.これは非常に厄介な問題ですね考え方はいくつもあり答えは一つにならないと思いますが自分のコードはこうなりました。'.']実行毎に文字の順番は入れ替わります。この場合の考え方としては元の文章の四文字以下はそのままに五文字以上は空白にしたデータを用意します。別途五文字以上のものをリストに確保します。元の文章の空白部分にランダムに並び替えしたリストを順番に差し込んでいます。スマートに書けるかなと思いますリファクタリングは大事ですね。これで準備運動は終わりです。これで準備運動ですからねーなかなかパズルのようで面白いですよね。自然言語処理100本ノックの準備運動を解いてみました。解説動画はこちら自然言語処理とはコンピューターに言語を処理させるための一連の方法です自然言語処理100本ノックはこちら自然言語処理100本ノックプログラミングを行う上でこういった文字列の処理方法を覚えておくとプログラミングスキルが格段にアップします。やっておいて損はしないと思います。どの言語でも対応することは可能です。Python言語を用いて1つ1つ解いていきましょう。文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.解き方としては文字列のリバース方法を考えるです。Python言語のリスト型などはリバース用の関数がありますが文字列には無いようです。Pythonでは次のようにすることで実現できます。"stressed"[::-1]'desserts'これだけです。インデックスを用いると文字列を切り出すことができます。飛ばす個数になっています。-1することで終わりから抽出を行います。「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.文字の奇数番目を取り出す方法です。Pythonの文字列のインデックスの操作で簡単に取り出せます。"パタトクカシーー"[0::2]'パトカー'これだけですね。インデックスの最後を2とすることで1こ飛ばしで文字を抽出できます。「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.文字を交互に組み上げる問題です。ここから少し考えるのが必要になりそうですね。いうのは業務でも良く出てきそうな問題なので覚えておくと仕事がはかどりますね。文字列からの文字の切り出しはインデックスを用いて行うことができました。単純の文字と文字を足すと文字の連結になってしまいます。交互にというのがポイントです。zip関数を使うと2つの文字列やリストなどを組み合わせて使うことができます。zip('パトカー','タクシー')])'パタトクカシーー'一旦zipで1文字ずつ交互に切り出し、それを内包表記で書いてあげるとリスト型になります。文字列型のjoin関数でリスト型を文字列に連結できます。mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.最終的に欲しいものはリストです。各単語に分解するというのは文字列型のsplit関数でスペース区切りで区切ると実現できます。アルファベットの・・・と書かれているのでそれ以外はの文字が不要になりますね。文字列の削除はreplace関数で実現できます。文章を単語にしたら欲しいのは文字数ですね。文字列の文字数はlen関数で測ることができます。出来上がったコードはこのような形になりました。9]replaceを二回続けていますがreライブラリを用いると簡素になります。連想配列(辞書型もしくはマップ型)を作成せよ.最終的に欲しいものは辞書型ですね。単語分解は前問と同じようにsplitで行います。次に考えることは何文字切り出すです。これも文字列のインデックスで実現できます。文字の切り出しに条件がついています。他は2文字ややこしい条件ですよね。文章から単語に切り分けた段階でリスト型になっています。リスト型では順番に処理することができるのでそこにenumerate関数を加えると何番目という数値を取ることができます。あとは条件分岐とうまく設定すればいいです。コードはこうなりました。IF文を組み合わせて使うことができます。NLPer"という文から単語bi-gram,文字bi-gramを得よ.n-gram任意の文字列や文書を連続したn個の文字や単語で分割するテキスト分割方法.特に,nが1の場合をユニグラム(uni-gram)2の場合をバイグラム(bi-gram)3の場合をトライグラム(tri-gram)と呼ぶ.ということでバイグラムを取得するための関数を作れという問題ですね。文字列はそのままfor文の繰り返しに用いることができます。そこからインデックスを用いてn文字を取得していけば良いという考えです。コードは非常にシンプルになります。'Per']単語単位でやりたい場合は一旦スペースでsplitすれば単語単位のn-gramになります。'NLPer']]まだまだ準備運動は続きますね今回はここまでですそれでは。CodeWhispererで爆速コーディングコーディングに迷った際に役に立ちWEB検索する時間を無くして作業時間を効率化できます。