け日記

最近はPythonでいろいろやってます

Solrの類似度アルゴリズム (TF*IDF, BM25)

引き続きSolrに触れていきます。 今回はSolrの検索で使われる類似度 (similarity) についてです。 前提 Solrのダウンロードとkenikkiコレクションの追加まで完了している状態を前提として進めます。 ohke.hateblo.jp ohke.hateblo.jp 類似度 Solrのコアエン…

Solrで検索 (フィルタ, ソート, ファセット, ハイライト)

前回・前々回に引き続いて、Solrについてです。 今回は検索クエリで頻繁に使われる、フィルタ、ソート、ファセット、ハイライトについてまとめます。引き続き、チュートリアルと↓の本を参考にしています。 なお、前々回のSolrのダウンロード、前回のkenikki…

Solrでスキーマの定義とドキュメントの登録を行う

前回の投稿に引き続き、Solrに慣れ親しんでいきます。 ohke.hateblo.jp 今回の投稿では、スキーマの定義、および、JSONを使ったドキュメント登録を行います。引き続き、チュートリアルと↓の本を参考にしています。 Solrサーバの起動とSolrCoreの作成 話を単…

Solrの環境をMacに構築する

仕事で検索プラットフォームの Apache Solr を扱うことになったのですが、今までブラックボックスにしてきてしまっていたので、この機会に勉強することにしました。 http://lucene.apache.org/solr/ 今回は、Mac上にSolr (7.5.0) の環境を構築し、け日記のエ…

Python: LexRankで日本語の記事を要約する

仕事で行っているPoCの中で、文章の要約が使えるのではと思い、調査をし始めています。 今回はsumyのLexRankの実装を使い、過去の投稿を要約してみます。 LexRank LexRankは、抽出型に分類される要約アルゴリズムで、文書からグラフ構造を作り出して重要な文…

SQL ServerのテーブルをPandas DataFrameで読み書きする

SQL ServerのテーブルをPandasのDataFrameに読み込んだり、逆に書き出したりする方法の備忘録です。 ドライバにpymssqlを使います。また書き出しには $ pip install pymssql SQLAlchemy DataFrameへの読み込み まずはSQL ServerのテーブルからDataFrameへ読…

論文メモ: GloVe: Global Vectors for Word Representation

前々回の投稿でGloVeで単語ベクトルを計算しましたが、今回の投稿ではその提案論文を整理したいと思います。 nlp.stanford.edu ohke.hateblo.jp GloVe: Global Vectors for Word Representation @inproceedings{pennington2014glove, author = {Jeffrey Penn…

論文メモ: Distributed Representations of Words and Phrases and their Compositionality

前回の投稿で紹介したGloVeの論文を読もうと思ったのですが、先発のword2vecの論文をまだ読んでなかったので、先にそっちを読んだメモです。 なお、gensimのword2vecの実装を使った例を以前投稿してます。 ohke.hateblo.jp Distributed Representations of W…

GloVeで単語ベクトルを得る

単語ベクトル化モデルの一つであるGloVeを試してみます。 GloVe GloVeは単語のベクトル表現を得る手法の一つで、Word2Vecの後発となります。論文はこちらです。 nlp.stanford.edu Word2Vec (skip-gram with negative sampling: SGNS) では各単語から周辺単語…

PythonからGoogle Cloud Natural Language APIを使って感情分析

Google Cloud Natural Language APIを使って、Pythonで日本語文章の感情分析 (ポジティブ/ネガティブの判定) を行います。 このAPIは自然言語処理のためのGCPサービスで、感情分析以外にも、構文解析やエンティティ解析が提供されています。 cloud.google.co…

scipy.statsでカーネル密度推定 (KDE)

scipy.statsでカーネル密度推定 (KDE) を行う方法のメモです。 カーネル密度推定は、標本データから確率密度を推定するものです。 要するにヒストグラムをなめらかにすることで、データの傾向を捉えやすくします。 2017/1/1〜2017/12/31 (365日) の東京の日…

小ネタ: PandasでCSV文字列を分割して列にする

PandasでCSV形式の文字列のカラムを、それをカンマ区切りで分割して、別々の列にする方法のメモです。 例えば、1行目なら"123"と"456"と"789"を3つの列に分割します。 import pandas as pd df = pd.DataFrame({'name': ['A', 'B'], 'csv': ['123,456,789', '…

Flask-CachingでRedisにキャッシュする

Flaskアプリケーションでビューを楽にキャッシュする方法はないかと探していた時、同僚にFlask-Cachingを紹介されました。 Flask-Cachingを使ってRedisにキャッシュする方法について整理します。 Flask-Caching Flask-Cachingは以下の特徴があり、Flaskアプ…

PySparkでMLを使って機械学習する

引き続きPySparkについてです。今回はMLパッケージを使ってスパムメッセージを分類します。 PySpark + Jupyter Notebookの環境をDockerで構築する - け日記 PySpark (+Jupyter Notebook) でDataFrameを扱う - け日記 PySparkのMLパッケージを使ってMovieLens…

PySparkのMLパッケージを使ってMovieLensをレコメンドする

前回・前々回と引き続き、PySparkを使っていきます。 PySpark + Jupyter Notebookの環境をDockerで構築する - け日記 PySpark (+Jupyter Notebook) でDataFrameを扱う - け日記 今回はMLパッケージを使って映画のレコメンドを行います。 データセットにはお…

PySpark (+Jupyter Notebook) でDataFrameを扱う

前回の投稿では、PySparkをJupyter Notebookから操作するための環境を作りました。 ohke.hateblo.jp 今回は上の環境を使って、PySparkでDataFrameを扱う方法についてまとめます。 (そのため上の環境構築が済んでいる前提となります。) SparkのDataFrame Spar…

PySpark + Jupyter Notebookの環境をDockerで構築する

お仕事でSparkをJupyter Notebook (Python 3) から使うのにあたり、PySparkの実行環境をDockerで構築する方法について調べました。 今回は、PySpark APIを使ったJupyter Notebookの動作確認をローカルで完結できるようにすることをゴールにします (別ノード…

Pandasで正規表現を使って検索する

Pandasで正規表現を使って、マッチする行を検索する方法です。 textという列を1つ持つDataFrameをサンプルデータとして作成します。 import pandas as pd import re df = pd.DataFrame({'text': ['a', 'aaa', 'abc', 'def']}) PandasのSeriesは、文字列の便…

Python: NumPyで縦持ちから横持ちへ変換する小ワザ

以前、DataFrameの縦持ち・横持ちの変換につ いてまとめましたが、今回はNumPyの行列を縦持ちから横持ちへ変換する小ワザを紹介します。 ohke.hateblo.jp 以下のような5行3列の値を、列1の値を行インデックス、列2を列インデックス、列3を各要素の値として行…

Python: BayesianOptimizationによるベイズ最適化

お仕事で、時間のかかる学習のパラメータ選定に、ベイズ最適化を用いる機会がありましたので、備忘録として整理します。 ベイズ最適化 ベイズ最適化 (Bayesian Optimization) は、過去の実験結果から次の実験パラメータを、確率分布から求めることで最適化す…

Python: Joblibで並列処理プログラミング

Pythonの並列処理では標準ライブラリであるmultiprocessingがよく使われると思いますが、「もっと気楽に実装したい」という場合に便利なのがJoblibです。 github.com 今回はJoblibを使った並列処理プログラミングについて紹介します。 基本的な使い方 使い始…

Python: PandasのDataFrameを横持ち・縦持ちに変換する

PandasのDataFrameを縦持ちから横持ちにする方法とその逆(横持ちから縦持ちにする方法)についての備忘録です。 縦持ちと横持ち 縦持ちは、以下のように、カラム固定で1行に1つの値を持たせている表です。カラムをおいそれと変更できないDBのテーブルなどはこ…

Scrapyでけ日記をクローリングする (3. parseへ任意の値を渡す方法とエラーハンドリング)

前回・前々回に引き続き、Scrapyを使ってこのブログのクローリングを行います。 github.com 今回は細々としたところで、Spiderクラスのparseメソッドへ値を受け渡す方法と、エラーハンドリングについてです。Spiderの実装は前々回の投稿も参考にしてみてくだ…

Scrapyでけ日記をクローリングする (2. PipelineでPostgreSQLに保存する)

前回に引き続き、Scrapyを使ってこの日記のクローリングを行います。 github.com 今回はクローリングで得られた値を、バリデーションしてPostgreSQLに保存するPipelineを実装します。Spiderの実装は前回の投稿も参考にしてみてください。 ohke.hateblo.jp こ…

Scrapyでけ日記をクローリングする (1. 初めてのSpider作り)

Scrapyを使ってはてなブログ、といいますか、この日記のクローリングを行います。今回はエントリタイトルを取得するSpiderを作ります。 こちらの書籍を参考にしてます。 Scrapyとは Scrapyはクローリング&スクレイピングに特化したPythonのフレームワークで…

Python: setにlistやtupleを追加する

Pythonでsetとlistを使う時のtipsです。 listやtupleを引数にsetを作ることができます。 set_a = set(['a', 'b', 'c', 'a']) # {'a', 'b', 'c'} set_b = set(('a', 'b', 'c', 'a')) # {'a', 'b', 'c'} addメソッドで1要素を追加することはできますが、listや…

NumPyを使って線形モデルのパラメータを最小二乗法で推定する

線形モデルと最小二乗法について調べることがありましたので、まとめておきます。 今回は青本の2章を参考に、繰り返し測定、1元配置、多項式の3つのモデルで例示します。また、NumPyを使った行列計算でナイーブに最小二乗法を実装します。 自然科学の統計学 …

PythonでRedisを参照・更新する

仕事でPythonアプリケーションからアクセスするRedisの導入を検討した際に、redis-pyでRedisを参照・更新する方法について調べましたので、備忘録にしておきます。 redis-pyのドキュメントはこちらです。 http://redis-py.readthedocs.io/ DockerでRedisコン…

Google AnalyticsのデータをBigQueryで集計・分析するときのテクニック集

先週の投稿で、Google AnalyticsのサンプルデータをBigQueryでクエリできるようにしました。 BigQueryを有効化してGoogle Analyticsのサンプルデータにクエリできるようにする - け日記 今回はBigQueryを使ってGoogle Analytics (GA)のデータを集計・分析す…

BigQueryを有効化してGoogle Analyticsのサンプルデータにクエリできるようにする

最近、よく仕事でGoogle AnalyticsのデータをBigQueryで集計したりしています。 プライベートでも学習できる環境が欲しかったので、Google Cloud Platform (GCP)アカウントでBigQueryを有効化して、Google Analytics (GA)のサンプルデータにクエリできるよう…