百折不撓

データ系の新米エンジニアとして戦闘中。

言語処理100本ノックchap01_05

言語処理100本ノックの続き。
言語処理100本ノック 2015
この記事では、1章5問目をやっていきたいと思いますが、そもそも“N-gram”って何ぞや?一度勉強したけど思い出せない・・・。
最後に参考サイトのリンクを入りますが、要は、任意の文を、N個の文字のつながりで分割する。例えば、2-gramなら

今日の天気はポカポカでしたよ

これを

今日/の天/気は/ポカ/ポカ/でし/たよ/

とします。僕の現在の理解では、句読点を文字扱いするのか、余りの文字が出た場合どう扱うのかが分からないので入れませんでした。2文字ずつ品詞に関係なく分割していくんですね。そして、品詞で分解して文章を分析するのが形態素解析ですが、この問題では範囲外なので深入りはしません(参考サイトの方はもう少し詳しく説明されています)。
 さて、僕の処理としては以下となりました。

import numpy as np
import pandas as pd

def ngram(N, text): 
    num_of_parties = len(text) // N
    #num_of_tail_char = len(text) % N
    for i in np.arange(0,num_of_parties):
        if i == 0 :
            parties_head, parties_remain = text[:N], text[N:]
            parties = [parties_head]
        else:
            parties_head   = parties_remain[:N]
            parties.append(parties_head)
            
            parties_remain = parties_remain[N:]
    
    parties.append(parties_remain)
    
    return parties
    
#N = 5
#text = "ほげってほげってほげるんだ"

if __name__ == "__main__":
    print("NgramのNを入力してください。 N = ")
    N = input()
    N = int(N)
    print("Ngramを生成したい文章を入力してください。")
    text = input()

    print(ngram(N, text))

 テストなどのやり方もまだ分かっていないので完璧かは分かりませんが、それっぽくは動いています。ただ、こういう時にループ回数を1引かないいけないのか否か、毎回悩んでしまいます。特に、そこが怪しい気がします。
 改善点などありましたら、教えて頂けると嬉しいです。こんな所まで来て、読んでくれてありがとうございました!!

戯言:
 昨晩、布団の中で「スライス使えば、簡単じゃん」とかアホな事考えていたのですが、スライスでhoge[::2]みたいにしても2個飛びで取ってくるだけなので上手く行きそうもありませんでした。あれこれ考えて、やっとこさ出来ました。



参考サイト
N-gramと形態素解析 - gggggraziegrazie

言語処理100本ノックchap01_04

 最近Excelしか触っておらず、それもごく簡単な集計位の事しかやっていない。これはいけないと思い、少しでも足掻かないと上には上がってなんかいけやしないと、以下のサイトのノックでもがき始めた。
http://www.cl.ecei.tohoku.ac.jp/nlp100/言語処理100本ノック 2015

 たぶん、この界隈の人には有名なサイトなのかもしれないけど、まずは手習いという事でやってみた。今日はタイトルの通り1章のQ4をやってみたので、糞みそなコードを載せる。まず間違いなく、もっとうまいと言うか、スマートなやり方があると思うが、ググりながらやっても、今の自分にはこれが精いっぱい。ひょんな事でここにたどり着いてしまって、こうした方が良いんじゃないって方はコメントください。

 サイトにして欲しい処理が問題として載っていますが、掻い摘んで言うと、「(僕のコードではtextに代入している文章の)各単語の先頭から1文字or2文字分が元素周期表のCaまでになっているので、それを抜き出してくれ。」と言った問題です。
 ただ、マグネシウムが題意の処理をすると"Mi"になってしまう。そもそも"Mg"で始まる単語があるのか知りませんが、文章に入れようと思ったら、 F = Mg みたいな事しか思い浮かびません。

 と言うわけで、前置きが長くなりましたが、私の糞みそコード:

import numpy as np
import pandas as pd

text = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."

text = text.replace(".","").replace(",", "")
list_text = text.split(sep=" ")
ser_text = pd.Series(list_text)

get_only_first_char = np.array([1, 5, 6, 7, 8, 9, 15, 16, 19], dtype=np.int8)
get_only_first_char = get_only_first_char - 1

atoms = {}
for num in np.arange(0, len(list_text)):
    if num in get_only_first_char:
        ones = ser_text[num][:1]
        atoms[ones] = num
    else:
        twos = ser_text[num][:2]
        atoms[twos] = num
        
print(atoms)

pythonもそうですが、何でも使っていないと本当に忘れてしまいますね。はてな記法もさっぱり覚えていませんでした。少しずつ、もう少しまともな記事にしていきます。

読書の方法

 最近、kindleを買いました。正確にはFireタブレットを買ったのですが、使い道は読書ぐらいしか今のところは考えていません。なんで、Fire買ったのかというと、画面のサイズが大きいものが欲しかったというのが理由です。まぁ、kindle white paperの手軽さとバッテリのもちは魅力的なので、ちょっと欲しい気持ちが残っています。
 さて、やっと電子書籍で本を読み終えました(『諦める力』為末大)。「紙の質感あっての読書。電子媒体のただのデータなんてクソだ」とか思っていたのですが、ちゃんと読めるし、マーカー引けたり、それを後でまとめて見れるのは便利だなと思いました。本の読み方が増えた感じでした。
 もちろん、紙媒体の本にも本の質量を感じ、五感を刺激する要素があると思うのでそれはそれで良い。僕の大好きな、京極夏彦京極堂シリーズなんかは、紙媒体で読みたいですね。けれど、電子書籍ディスるのも違うなぁと思う様になりました。
 もっとたくさんの本を電子媒体で読んで、電子媒体での本の読み方を感覚的に分かっていきたいです。
 あと単純にもっと本を読みたいです。ずっと読んでいなかったので、文章が頭の中で滑ってしまいあかんです。

jupyter notebook のnbextensionsという便利な補完機能の追加(追記あり)

 python用のエディタがpycharm, spyder, sublime(専用ってわけでもないか)と色々あるけど、jupyter notebookをpython用と言っていいのかちょっと分からない。いや、しかし、Rとpythonを勉強するうえで最近Rstudioとともに使い始めて、Rstudioは関数のヘルプをすぐ見れて便利だなぁと思っていた。ちょっと調べたら、jupyter notebookにもあるんですねって話。ホントに優秀な人たちに感謝するし、いつか自分も誰かの役に立ちたいな。
 早速入れてみる。参考サイトの手順に従い、以下の呪文を唱えてnbextensionsを入れました。

conda install -y -c conda-forge jupyter_contrib_nbextensions

 長いけどインストール後に、jupyter notebookを起動あるいは再起動。ここで、home画面でnbextensionsってタブが増えているらしいのだけれど、自分の環境では増えていなかった。そういう時は、

http://localhost:8889/nbextensions

にアクセスしてやると良い。ちょっと手間だけど、現状已む無し。ここでHinterlandと言う項目にチェックを入れてやると、

f:id:RyojiT:20181027010112p:plain

ライブラリのメソッドを使おうとタイプした時、shift + tabで、

f:id:RyojiT:20181027011507p:plain

こんな感じでdocumentが出て引数とかも簡単に分かるようになる。大きなウィンドウで読みたいときは、shift + (tab4回)で下に大きく出るのでお試しあれ(図はこの状態)。この情報は、いつも通りに参考サイトの方が詳しいし、もっとたくさん役立つ情報が載っているので、自分も時間とってちゃんと読みたいです。

参考サイト:
AnacondaのJupyter notebookでnbextensionsを使う - Qiita
Jupyter 知っておくと少し便利なTIPS集 - Qiita

追記[2018/10/29]
 nbextensionsのhinterland便利ですねって話だったわけですが、documentsを出す機能(shift + tab)はそもそもデフォルトの機能なんですね。無知は恥ずかしいです、知りませんでした。
 他の機能がどんなものがあるかまだ分かっていないので良い機能があれば、追記したいと思います。いやー、恥かしい。

はてな記法での数式

 自分用のメモなので、まとまっていません。参考サイトを見に行った方が詳しいし、分かりやすいです。 
 記事の初っ端に、[tex:\displaystyle]とかのカッコを半角にしてやれば、以降は、texでの数式やらの記法が下のように使える。但し、重くなる。texでの数式の書式はググるよろし。
\displaystyle
\begin{eqnarray}
F = mg \\
\end{eqnarray}

\begin{eqnarray}
\phi (x) &=& \sin x \\
\psi (x) &=& \cos x \tag{hogehoge} \\
\end{eqnarray}

 行内で短い数式を書きたい時は半角で、$$ hoge = hige $$みたくで囲うらしいが、$$が機能しないので¥( ~ ¥)を用いた方が良さそう。こんなかんじ\( e^+ e^- \rightarrow \gamma \) 。 ←(行内数式は、文章内に半角の$、¥、(、などが入ってきた時に干渉して、表示が上手く行かない事がある模様。単純にこちらが(を閉じていないからなどの理由も考えられるが、挙動が少し分かり辛いので注意。

 あと、式番号付けたいときは、記事頭で呪文となえるといいらしいが、めんどいので、¥tag{1}とかする事にした。興味のある方は、参考サイトへ。

参考サイト: はてなブログで数式が綺麗に書けるTeXの便利ワザ for 見たままモード - cBlog

Spyder  Anaconda 起動しない anaconda navigatorも起動しない

  Anaconda NavigatorからSpyderが起動しなくなった。
 何でかなと、ググったらこういう事らしい。
teratail.com
 正直よく分からないが、インストールとupdateが必要らしい。上記の教えに従い、anaconda terminalにて呪文を唱える。

conda install -c m-labs pyqt5=5.5.1
conda install -c m-labs qt5=5.5.1

 そしたら、anacondaとpyqt5が相性良くないみたいなエラーが出たので、anacondaちゃんをupdateしてみる。

conda update anaconda

 これは無事通った。再度、呪文を唱え・・・ている最中ですが、色々とインストールしているので、いけそうです。もう寝ます。起きたら、追記します。

 おはようございます。pyqt5とqt5のインストールは無事完了しました。が、今度は、Anaconda navigatorが起動できなくなりました。いや~、参ったね。To be continued201810190814

続き(201810211301)
 少し間が空いてしまいましたが、端的に結論だけ言うと、昨日、致命傷を負いながら解決しました。
 解決方法はもうよく分からないので、一度Anaconda3をアンインストールしました。そこまで使い込んでいないから出来る対処法だと思われ、エキスパートの人たちはこんな事しないのでしょうが、仕方がありません。持っている手札で対処するしかないのです。
 ざっくりやった事をメモ。自分のOSは、Windowsなので別OSの方が同じかは分かりません。

  1. 自分がインストールしたAnaconda3ディレクトリ(デフォルトはC:/Users/username/以下?)の中のenvsディレクトリを開く。
  2. 自分が作った作業環境の設定ディレクトリがあるので、コピーして別に保存(かなり大きい)。
  3. Anaconda3ディレクトリにUninstall_Anaconda3.exeがあるので、実行してサヨナラanaconda(かなり長かった)。
  4. 改めて、最新版のAnaconda3(現在は5.3.0)をインストール。
  5. 先ほどコピーした作業環境のフォルダを新たに出来たAnaconda3のenvsに入れる。

 これで今のところ、Anaconda-navigator、Spyder共に起動しています。やってよい対処なのか分かりませんが、とりあえず現状は解決しました。

日付yyyymmdd(エクセルの話)

 暇なので気象庁の南極の気象データを使って遊ぼうとしている。
 csvファイルの取得方法が悪いのか修正しないと使い勝手が悪い。そこでエクセルを使って、日付のセルを修正。その時のメモ。

cell0=DATE(cell1, cell2, cell3)

で3つのcellを指定の日付表記に。例えばcell1年cell2月cell3日。
 しかし、個人的にはyyyymmdd表記が好き。しかしその表示方法を日付では作成できない模様なので(日付の表記方法に入っていない)、他の方法を調べる。そのサイトのまんまだが

=TEXT(cell0, "yyyymmdd")

とすると良い。"yyyymmdd"は、" "も必要なので注意。
 二度手間だが、出来ないよりはましですな。しかしめんどくせぇな。

参考サイト
日付フォーマットのセルの値を yyyymmdd形式の文字列に変換する (Excelの使い方)