TEDの英文を解析してみた -文字処理編-
前回の続きです。
3. 取得したスクリプトを単語毎に分解し、出てくる回数をカウント
この時点で取得したデータは書き起こし英文そのままのため、単語毎に分解する必要があります。
こういった言語処理を扱うライブラリとしてnltkがあるため、こちらを利用します。
gistf84a859034b0bd84c576c7be4ca8a4bd
こちらの実行時間は2時間でした。
アルゴリズムを上手く考えれば(マージソートっぽくやるとか)もっと早く完了できると思いますが、そうすると書いてる時間の方が長くなって飽きてしまいそうなので諦めました。
参照 :
ここで出来上がった一覧を見てみると、以下のことに気づきました。
- 同じ単語にも関わらずドットが混じり違う単語としてカウントしている
- 人の名前、数字、記号などを含んでいる
- 現在形と複数形を違う単語としてカウントしている
時間をかけて真面目にやってると飽きてしまいそうなので、Cは諦めてA,Bだけ解決することにしました。
同じ単語にドットなどが混じり関わらず違うものとしてカウントしている
カウントを足し合わせ、ドットが入った方を取り除くことにしました。
gist04287b179b8a662be11d6be7e109b3e2
人の名前、数字、記号などを含んでいる
どんな方法が良いか色々調べた結果、macには辞書apiがは入っておりpythonからアクセスできることが分かりました。こちらのapiに単語を投げ、結果が帰ってこない(=辞書に存在しない)単語は取り除くことにしました。
gist8614389d32db56d7ee97102b6317ad28
問題なのが、辞書apiにアクセスするためにmacにプリインストールされているpython(≠pyenvやhomebrewで入れたpython)を利用する必要があることです。pandasなどのライブラリがsudo pip installで入れようとしても入らなく、結局元々存在するcsvライブラリでなんとかすることにしました。
現在形と複数形を違う単語としてカウントしている
前のコードで単語の定義もcsvに書き込みました。現在形でも複数形でも辞書から帰ってくる定義は同じなので、定義を比較し同じ場合はカウントを足し合わせていきます。
giste597f9de1578e258a64bd5f8aff13620
これで文字処理まで完了し、出現単語ランキングが完成しました。
次回、中身を見ていきます。
TEDの英文を解析してみた -スクレイビング編-
きっかけ
英語ペラペラになりたい。やっぱボキャブラリーは基礎だよね、と本屋に行っても単語帳はTOEIC対策用ばかり。何かもっと生きた英語単語を学ぶ方法はないだろうか、なんて思ってました。
やりたいこと
そうだ、TEDがあるやん。TEDとは学術、芸術、ビジネスなど多岐に渡る分野についてプレゼンターが自身の体験談などを紹介する講演会のことで、web上のその様子が字幕付き動画で公開されています。
そして、各プレゼンページには文字起こしテキストが掲載されています。
そこで、TEDに掲載されている全プレゼン2,664講演(12/23時点)のスクリプトを取得し、出てくる単語を頻出順に並べる事で英語でペラペラプレゼンをするのに本当に必要な英単語を明らかにしたい!、と思い立ちました。
やったこと
思い立ったは良いですが、私は普通のサラリーマンでプログラマーでも何でもないので色々あさって勉強し、下記のように分けて実行することにしました。
1. 各ページのURLを取得する
2. 各ページにアクセスし、スクリプトを取得
3. 取得したスクリプトを単語毎に分解し、出てくる回数をカウント
以下、ソースコードを掲載します。プロの方から見たらツッコミどころ満載かと思いますが、あくまで主旨は英語の方なのでご容赦ください。
1. 各ページのURLを取得する
まず、動画一覧ページにアクセスして各プレゼンページへのリンクを取得します。 urlopenでページデータを取得し、各プレゼンのイメージ画像とタイトルにリンクが埋め込まれているaタグのhref要素をBeautifulsoupを使って抜き出した後にcsv形式でファイルに書き込んでいく。
gist49721897ce827eaa0b7dd7cc2acf047c
これで下記のように系2,664件のプレゼンへのリンクが取得できました。
参考ページ :
2. 各ページにアクセスし、スクリプトを取得
取得したリンクを基に各プレゼンページの文字起こしテキストを取得していく。ここで面倒なのが各プレゼンページはJavascriptで読み込まれてるため、先ほどのようにurlopenでページデータを取得しても文字起こしテキスト部分が読み込まれていない状態のhtmlしか取得できない。そこで、seleniumでブラウザからリンクを開き、javascriptの反映が完了した後に文字起こしテキストを取得する必要がある。
gistecd84e62085ced19c24a3b560e8be532
ちなみに実行環境はmacbook proですが完了までにほぼ8時間かかりました。。。
並列にプログラムを走らせたりすれば早く終わるのでしょうが、なんか芸がないのでもっと賢い方法があればご教授頂きたいです。
参考ページ :
次回、文字処理編に続く。