メイン

DaReCo アーカイブ

2013年10月15日

[DaReCo] DaReCoというウエブアプリケーションを作ってみました

[DaReCo] [連想計算]

DaReCoというウエブアプリケーションを作ってみました.


作った動機といいますか、作るまでの経緯は以下のとおりです.


趣味(?)で連想計算エンジンをpythonで実装していました.メモリベースのものやNoSQL(MongoDBやCassandra)ベースのもの、ファイルシステムを永続化機構として利用したものなど、です.


メモリベースの連想計算エンジンに対しそのパフォーマンスと計算の結果が(自分の)感覚に合うかということを検証するために、いろいろなポータルサイトから記事を集めそれを連想計算エンジンにぶちこんでいました.


ここで連想計算エンジンに入力したのが、「A:記事のURL」と「B:記事のタイトルを形態素解析しその結果から連想されるワード」です.連想計算エンジン自体の計算の確認では、ワードのリストを与え(B側)、そのワードのリストから計算される記事を表示(A側)するということでした.


結果としてある一定の条件下では、計算スピードは相当速かったです.メモリベースなのでスピードが出なければ困るのですが.また計算結果もそんなに悪くありませんでした(自分の感覚とたいして違わないという程度ですが・・・).


確認は「ビッグデータ」とか「python」とか自分の興味のある言葉でやっていたのですが、出力される結果(記事のリスト)がけっこう自分の興味に刺さるような結果で、「この記事あとで読まなきゃ」と思うことが多かったのです.


ここまではターミナル上での確認ですから、自分の興味のある記事で、今日更新された記事にどういうものがあるかを見るためにはわざわざ自宅のターミナルでパフォーマンス確認用のスクリプトをたたかなければなりません.


それだったら、どこでもチェックできるようにウエブアプリにしてしまおうと、考えたわけです.


Googleで同じようなことができるかと思ったのですが、興味のあるワードで検索しても最新の記事を表示してはくれません.例えば「python」と入力してもpythonの公式サイトとかドキュメントページしか上位には表示してくれませんよね.


Googleアラートなら同じような最新のニュースを教えてくれるかもしれませんが、連想計算ではないのでpythonというワードに引っかかるページは教えてくれますが、pythonという空間に近い空間の記事は表示してくれません.


そんな感じでGoogleだとできないなぁと感じたのも、自分でアプリにしてみようと思った最大の要因でしょうか.


単純にpythonと入力して連想計算させて記事を出力させてもpythonというワードがタイトルに含まれるものだけを出力するということではありません.pythonが属する意味的?な空間に属する記事も出力します.pythonですからLL(Lightweight Language、軽量プログラミング言語)周りの記事も出力してくれるのです.たとえばRubyとかPerlとかjavascriptとかあるいはそういった言語に関する記事を.


連想計算ですのでpythonというワードが含まれる記事が上位に来ますが、pythonというワードがタイトルに含まれない記事でも、pythonという意味空間に属するあるいは近い記事は出力してくれるのです.


そういったLL周りの情報・動向も知っておきたいでしすしね.


この感覚が個人的にとても気に入っています.


とにかく自分がほしいと思った機能をもつアプリケーションを作ってみたら、個人的にとても楽しく活用できるページができてしまった、そんな感じです.

2013年10月16日

[DaReCo] DaReCoというウエブアプリケーションを作ってみました (続き)

[DaReCo] [連想計算]

[DaReCo] DaReCoというウエブアプリケーションを作ってみましたの続きです.


先の記事には、「個人的にとても気に入っていて、楽しく活用できるアプリができた」と、書きましたが、わたしも人間ですので、こういったアプリが他人からどう見られるのかなとか、連想計算に同じように興味を持つ人と情報交換してみたいなとも、思うわけです.


さて、DaReCoのページを見ていただくとわかりますが、入力したフレーズ(入力は単語でなくても良い.文章でも良いです)から関連ワードを計算し表示しています.これも連想計算です.この関連ワードには表示はされていませんが、重み(ウエイト)を内部では持っています.このワードとそれに紐付くウエイトの組み合わせによって連想計算を行っていますので、入力したワードが含まれていない場合でも近しい空間の記事を表示してくれますし(正確には近しい空間の記事を表示しているように感じるだけ・・・)、入力したワードをタイトルに含むものが記事の上位に来ます.


この関連ワードはWikipedia様の情報を利用していますので、日本語に関してはほぼ問題がない程度といえます.表記ゆれは勘弁してほしいと思います.特定のニッチなサブカルは捉え切れていないのかもしれません.主にWikipediaが・・・


仮に連想ワードが表示されていたとしても、それに関する記事が必ず表示されるわけではありません.だって自分の興味のあるポータルサイトの記事しか集めていませんから.それに記事はRSSフィードで配信されているものだけですから、RSSで配信していないサイトの記事は入っていません.


つまり、わたしの独断と偏見でポータルサイトを選び、またRSSで配信されているもののみという制限があります.あしからず・・・


RSSで取得した記事の保持期間は現在10日です.前の記事に「趣味でやっている」と書きましたが、連想計算は自宅のマシンで運用しています.現在連想計算を行うモジュールは完全メモリベースですので、計算マシンの性能(主にメモリ容量)に依存します.スワップさせてしまうと計算の性能が出ませんので、スワップしない程度の記事数にしておかなければなりません.現在は10日分を保持し、publishedから10日経過した記事は削除しています.


メモリは32Gありますので、まだまだ余裕はありますが、記事を取得するサイトを増やすこともあるかもしれません.また個人的には最新の記事のみをチェックしたいので、10日で十分なのです.毎日どんな記事がリリースされているかチェックしていますので、本当は5日でも良いくらいです.メモリに余裕があるので10日にしています.


現在連想計算は記事のタイトルのみで行っています.本文で行うこともできますが、RSSをソースとしていますので現時点ではすべての記事にその対応を入れることは不可能です.記事には記事の内容にふさわしいタイトルがつけられていることを前提にしています.


前の記事でも述べましたが、ほんと、個人的にはとても満足しています.

2014年06月19日

[DaReCo] DaReCoの使い方

参考 : DaReCoというウエブアプリケーションを作ってみました


関連記事を表示

通常検索エンジンからこのサイトに遷移すると以下のような状態で、選択されているワード(以下の例だと「ビッグデータ」)に関連するワードがメインエリアに表示されています.



以下のように[関連記事を表示]をクリックすることで、メインエリアに関連記事を表示します.


[図] 記事を表示したところ


もちろん、以下のようなリンクをクリックしてもそのフレーズの関連記事を表示します.

png04.png


連想ワードを表示

「同様に連想ワードを表示」リンクをクリックして、メインエリアに現在選択されているフレーズの連想ワードを表示します.


Myワード

また、Myワードの登録ができます.「My」というリンクをクリックすることで、左上の「あなたのワード」にMyワードが表示されます.現在最大5個まで登録できます.


png05.png


このサイトを見ているブラウザのセッションに紐付けられます.この記事執筆時点ではセッションの有効期限は3日です.3日以内にこのサイトを見なかった場合には、Myワード登録はクリアされます.


png06.png


Myワードを削除する場合は「x」リンクをクリックします.


表示される連想ワードについて

Wikipediaのデータから、連想ワードを計算しています.およそ100万語存在し、それに対してリアルタイムで計算し表示しています.


表示される関連記事について

RSSで収集しています.最新の記事10日間(この記事執筆時点)保持し、10日を経過したものは削除しています.収集しているRSSの性質上IT系の記事が多くなっています.ご了承ください.

2014年08月07日

DaReCo Wikipedia 英語版

DaReCo Wikipedia 英語版

公開中です.ある意味世界進出.

2014年08月09日

Wikipedia内 - 連想計算エンジンAPI

v0.0.1

Wikipedia内のワード連想計算とMeCab形態素解析をウエブAPI化しました

もともと
DaReCo

DaReCo Wikipedia
を構築するのに使っていた、

  • Wikipedia内のワードを連想計算するエンジン
  • Wikipediaのワードを辞書として利用しているMeCabの形態素解析

を、知人が使ってみたいというので、REST化し、ウエブAPIとしてみました.


■ MeCabによる形態素解析(Wikipediaを利用) ■

フレーズ(文字列)を入力とし、MeCabで形態素解析した結果を、フレーズ内での頻度とあわせて、JSON文字列で返します.
(詳細な出力形式はAPIのドキュメントをご参照ください)

MeCabの辞書にはIPA辞書などが利用できますが、(開発当時は)せいぜい数万語です.当然、最新のワードは入っていませんでしたので、Wikipediaのワードを追加辞書として利用しました.

これによって、100万語以上をカバーしています.

MeCabによる形態素解析APIデモ
このデモはGETメソッドで取得できていますが、これはブラウザから出力を確認できるようにしたためです.実際はPOSTメソッドのみを受け付けます.またこのデモは「mecabで形態素解析する」というクエリーのみを受け付けます.
利用したい方はapi_keyを取得してください.
現在MA11用にapi_keyを「ma11」としてAPIを開放しています.
(ただし、AWSのmicro.t1をproxyサーバーとして利用していますので、レスポンスは激しく遅いです.ご了承ください)

MeCabによる形態素解析 API ドキュメント

以下MeCabの直接の出力
mecab001.png

その2
mecab002.png


■ 入力ワードの連想ワードを計算(Wikipediaを利用) ■

Wikipediaの記事タイトルと、その記事に含まれるワードを利用して、あるワード群に関する連想ワードを計算し結果を返すエンジンです.

具体的には

{
  '艦これ': {'cnt': 1}, ---- ①
}

こういった形式のJSON文字列を入力し、これらから関連する連想ワードを重みつきで返します.(JSON形式の文字列)

{
  '艦これ': {'cnt': 3.21},
  '角川ゲームス': {'cnt': 1.23},
  'DMM.com': {'cnt': 1.45},
  '大日本帝国海軍': {'cnt': 0.34},
  ...
}
(この出力はサンプルです)

上記入力の例では入力するワードは1個しか指定していませんが、複数指定できます.

①の入力にはそのまま形態素解析の結果が使えます.

日本語Wikipediaの情報を利用していますので、およそ
100万記事 × 100万ワード(以上)
の、マトリックスで連想計算を行っています.

これらの計算ロジックを利用したのがDaReCo Wikipediaです.検索窓に入力されたフレーズを形態素解析し、それらから連想ワードを表示しています.

連想計算デモ
このデモはGETメソッドで取得できていますが、これはブラウザから出力を確認できるようにしたためです.実際はPOSTメソッドのみを受け付けます.またこのデモは以下のクエリーのみを受け付けます.

{'形態素解析': {'cnt': 1}}

連想計算API ドキュメント



この連想計算の英語版もあり、これはDaReCo Wikipedia (英語版)で利用しています.こちらは1000万×1000万以上のマトリックスとなっています.(英語版連想計算は今回APIでは提供していません)


ご利用になってみたいという方や、質問などは
yuno@yunopon.sakura.ne.jp
まで、ご連絡ください.

MeCab形態素解析API

v0.0.1

Wikipedia内 - 連想計算エンジンAPI v0.0.1

ワード群に関する連想ワードを計算し結果を返すエンジンです.

リクエストのURIは以下のとおりです.

http://www.darecophoe.com/dj/api/v_001/assocFromWords/api_key/
リクエストメソッド : POST
api_key : 各ユーザーに割り当てた文字列を指定します

POSTパラメータ

q(必須):
形態素解析の結果と同じ形式(マルチバイト文字はUTF-8でエンコードしてからJSON文字列にしてください)
サーバー側でパラメータとして受け取りmap形のインスタンスに変換した後、長さが30まで

n
(デフォルト30、max300)
結果の個数.関連の高いものから最大n個返します

origin ※1:
(デフォルト0)
キーとして返された文字列のoriginを結果に付加するかどうかのフラグ

q(入力)のフォーマット

{
  "word1": {"cnt": 1},
  "word2": {"cnt": 1},
  "word3": {"cnt": 1},
  ...
}

originなど他のキーがついていても無視します.ただしサーバー側で受け取ったJSON文字列で1000文字までですので、余計なスペースや改行、余分なキーはないほうがよいかもしれません.

※1
originの説明はMeCabによる形態素解析のドキュメントを参照してください.



結果は以下のような形式で返ってきます.結果は関連度の大きいものから上位n個を返しますが、ソートはされていません.

{
  '艦これ': {'cnt': 3.21},
  '角川ゲームス': {'cnt': 1.23},
  'DMM.com': {'cnt': 1.45},
  '大日本帝国海軍': {'cnt': 0.34},
  ...
}
(この出力はサンプルです)

originを返すよう指定されている場合は、cntキーのほかにoriginキーが付与されます.

python2.7によるサンプル

import urllib, urllib2
import json

def main():
    domain = 'www.darecophoe.com/dj'
    api_key = 'ma11'
    
    #qin = 'mecabで形態素解析する'
    qin = 'ビッグデータとは、市販されているデータベース管理ツールや従来のデータ処理アプリケーションで処理することが困難なほど巨大で複雑なデータ集合の集積物を表す用語である。'
    data = urllib.urlencode({'q': qin})
    url = 'http://%(domain)s/api/v_001/getWordListFromText/%(apikey)s/' % {'domain': domain, 'apikey': api_key}
    req = urllib2.Request(url, data)
    response = urllib2.urlopen(req)
    body = response.read()
    response.close()
    print body # json文字列
    obj = json.loads(body)
    print obj # pythonのmap型へ変換
    for k, v in obj.iteritems():
        print k, v
    # ここまでは形態素解析
    # 以下形態素解析の結果を用いて連想計算を行う
    
    data = urllib.urlencode({'q': body})
    url = 'http://%(domain)s/api/v_001/assocFromWords/%(apikey)s/' % {'domain': domain, 'apikey': api_key}
    req = urllib2.Request(url, data)
    response = urllib2.urlopen(req)
    body = response.read()
    response.close()
    print body
    obj = json.loads(body)
    for k, v in obj.iteritems():
        print k, v

if __name__ == '__main__':
    main()

出力結果(デフォルトなので30個を返します.ソートはされていません)

フラットファイルデータベース {u'cnt': 1.963238669466598}
microsoft jet database engine {u'cnt': 1.6592472083421497}
hadoop {u'cnt': 1.6712429326695695}
データベース管理システム {u'cnt': 1.4581663007233416}
階層型データモデル {u'cnt': 1.3805800199688154}
デリミタ {u'cnt': 1.7034612977580739}
エクサバイト {u'cnt': 1.6255091981213614}
管理 {u'cnt': 1.7475214416487281}
データ移行 {u'cnt': 2.000867131326227}
データ・クラスタリング {u'cnt': 1.4311966634294082}
idef1x {u'cnt': 1.611722125255795}
olap {u'cnt': 1.4938514568104344}
データウェアハウス {u'cnt': 2.380624292263059}
処理 {u'cnt': 2.5317893358955796}
データ分析 {u'cnt': 1.3797870622488642}
データ {u'cnt': 1.821831423127683}
ペタバイト {u'cnt': 1.5804527678131666}
超高速データベース {u'cnt': 2.223044024508403}
ツール {u'cnt': 1.5917291969594238}
extract/transform/load {u'cnt': 2.3430050936400235}
データ完全性 {u'cnt': 1.9056962378786186}
非構造化データ {u'cnt': 1.8388194158082403}
パターン認識 {u'cnt': 1.396134823043611}
ole db {u'cnt': 1.508803034130766}
gnu r {u'cnt': 1.4028342807921397}
データマイニング {u'cnt': 1.920448191146759}
テキストマイニング {u'cnt': 1.5276894417377058}
ビッグデータ {u'cnt': 2.754803153926084}
データ統合 {u'cnt': 2.3076816607668102}
データ処理 {u'cnt': 3.3681212224215114}
origin:1
を指定すると、originをつけて結果を返します.
microsoft jet database engine {u'origin': u'Microsoft Jet Database Engine', u'cnt': 1.6592472083421497} hadoop {u'origin': u'Hadoop', u'cnt': 1.6712429326695695}

About DaReCo

ブログ「[R言語] Rのお部屋::あーるのおへや[別館]」のカテゴリ「DaReCo」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

次のカテゴリはGoogle App Engineです。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

広告

Powered by
Movable Type 3.37