在宅リーマン勉強日誌

忘れがちな毎日のメモ。

【8日目】KaggleでPythonの勉強してみた【独学】

KaggleのコースでPythonの勉強をしています。 進捗状況を見てみると、85%なので、あと一息。 昨日はエクササイズの途中で終わったので、その続きからです。

勉強内容

Lesson:Strings and Dictionaries (Exercise)

Lesson : Working with External Libraries(Tutorial)

TutorialはCourseの和訳(概略)、Tutorialは試行とどう考えていたかを記しています。

Lesson:Strings and Dictionaries (Exercise)

Q2:関数を完成せよ(ニュース内のキーワード)

昨日何とか回答を出せたものの、かなりif文とかfor文の入れ子状態になっていたので、正答例を見て、勉強したいと思います。

構造としては、①リストの要素に分割(enumerate)→②要素を分割(split)→③要素の平準化(rstripとlower)

①は方法違えど、考えは同じ。②は方法も考え方も同じ。③は方法も考え方も違う、という感じですね。

①のenumerateは使ってなかったのですが、要素一つ一つ取り出して変数に入れる効果があるようです。 私はリストのまま扱いましたが、変数が短くできるので、スマートですね。 techacademy.jp

③は、確かにこういうのがあったらいいなと思いつつ、私のコードはかなり危険な道を歩むものです。(すべてアルファベットではなく、文字列がキーワードより12文字長い、と条件を付けているので、数字がついてしまうとたちまちアウト) rstripはもともと末尾の空白を消すものですが、末尾が'.,'であればそれも消すという考え方で使われているようです。 現実世界では、!とかいろいろ入ってくるので、万能なものではないかな。 pg-chain.com

Q3:関数を完成させよ。(ニュース内の複数キーワード)

研究者は複数のキーワードに対しても検索したく、Q2のコードを活用して、複数キーワード検索に対応できる関数を完成させて下さい

出力例はディクショナリなので、それに合わせたコードにすればいいやつ。 自分のコードはあまり好きではないので、正答例のコードをさんこうにして作ります。 基本的には、少し手直しすればいい感じですね。 でもディクショナリの使い方に慣れてないから、少し戸惑ってしまった。

def multi_word_search(doc_list, keywords):
    indices = {}
    for k in range(len(keywords)):
        indices[keywords[k].lower()] = []        
    
    for i, doc in enumerate(doc_list):
        tokens = doc.split()
        normalized = [token.rstrip('.,').lower() for token in tokens]
        for v in keywords:
            if v.lower() in normalized:
                indices[v.lower()].append(i)
    return indices

Lesson : Working with External Libraries(Tutorial)

このレッスンでは、Pythonにおけるインポート、慣れていないライブラリやオブジェクトの返り値を動かすチップス、そして演算子オーバーロードに触れるためにPythonの根幹を掘り下げていきます。

Imports

ここまで、既に組み込まれている型や関数に関して扱ってきました。 しかし、Pythonの最も良い点は大量の高品質なライブラリたちです。

これらは、標準ライブラリと呼ばれており、どのPython環境でも見つけることができます。 そのほかのライブラリは簡単に追加することがで来ます。 これらのコードにアクセスするときに使うのがimportsです。 標準ライブラリよりmathをインポートしてその例を見てみましょう。

mathはモジュールです。モジュールは誰かが定義した変数の塊です。 dir(math)で既に定められているすべての名前を見ることができます。 ドットシンタックスを使うとこの変数を使うことができます。(シンプルな例としては、math.piで円周率) しかし、ほとんどはmath.log()のように関数です。

helpはmathのようなモジュールに対しても返り値を出してくれます。

Other import syntax

もし、mathを使うことがあらかじめ使うことがわかっているのであれば、略語として定義しておくこともできます。

import math as mt

PandasやNumpy, Tensorflow, Matplotlibでこのようなやり方を使うことを見たことがあるかもしれません。 as命名しなおすことは=でも代用することができます。

import *はすべての変数をドットなしで指定することができます。 一部の純粋主義者はこの書き方に文句を言うかもしれませんが。 またこのような純粋主義者も一理あり、ライブラリ間で同じメソッドを使っている場合はエラーを起こしてしまいます。

その場合は、*の代わりに実際に使うもののみをimportするとエラーを避けることができます。

Submodules

ここまでモジュールは関数や値を参照できる変数を含むこと見てきました。 そこからの気づきとしては他のモジュールに対しても参照することができるということです。

ドットを二つつなげることでサブモジュールとして扱うことができます。

Three tools for understanding strange objects

これから、たくさんのメソッドやオブジェクトを目にすることでしょうが、慣れないものに当たったときは、以下のものを試してみるとよいです。

  1. type():これは何か?
  2. dir():これで何ができるか?
  3. help():もう少し教えて
新出単語

the guts :はらわた purists:純粋主義者 grumble:ぶつぶつ不平を言う