Yahoo!の形態素解析APIを使ってたのを思い出したので、そのメモ。
Clojureから、Yahoo!のこのAPIを使って、任意の文字列を形態素解析できるようにします。
・Yahoo!日本語形態素解析API
テキストデータと言えば、青空文庫
・「青空文庫/夏目漱石/それから」
Clojure側ではとりあえず、
- httpのリクエストを送リ、データを受け取る。
- データをClojureの内部形式(ハッシュマップ、そして、リスト)に戻す。
という2つの処理が出来ればOK。簡単です。
リクエストは、Clojureのhttp-agentというラッパーを使います。
Yahoo!日本語形態素解析APIは、XML形式でデータを返してくれます。
今回は、そのデータを一旦、ローカルに保存して、ClojureのXMLパーサを使って、データをハッシュマップにマッピングします。そこから、必要なデータだけ抜き出して、単語列にします。
以下が実行結果とコード。
以下が実行結果とコード。
user=> (load-file "use-yjma-api.clj") #'user/tokenizer user=> (tokenizer kana "誰か慌ただしく門前を馳けて行く足音がした時、代助の頭の中には、大きな俎下駄が空から、ぶら下つてゐた。けれども、その俎下駄は、足音の遠退くに従つて、すうと頭から抜して消えて仕舞つた。さうして眼が覚めた。") ("だれ" "か" "あわただしく" "もんぜん" "を" "はせ" "け" "て" "いく" "あしおと" "が" "し" "た" "とき" "、" "しろ" "たすけ" "の" "あたま" "の" "なか" "に" "は" "、" "おおきな" "まないた" "げた" "が" "そら" "から" "、" "ぶらさがり" "つて" "ゐ" "た" "。" "けれども" "、" "その" "まないた" "げた" "は" "、" "あしおと" "の" "とおのく" "に" "じゅう" "つて" "、" "すう" "と" "あたま" "から" "ぬき" "し" "て" "きえ" "て" "しまい" "つた" "。" "さ" "う" "し" "て" "め" "が" "さめ" "た" "。") user=> (tokenizer kanji "誰か慌ただしく門前を馳けて行く足音がした時、代助の頭の中には、大きな俎下駄が空から、ぶら下つてゐた。けれども、その俎下駄は、足音の遠退くに従つて、すうと頭から抜して消えて仕舞つた。さうして眼が覚めた。") ("誰" "か" "慌ただしく" "門前" "を" "馳" "け" "て" "行く" "足音" "が" "し" "た" "時" "、" "代" "助" "の" "頭" "の" "中" "に" "は" "、" "大きな" "俎" "下駄" "が" "空" "から" "、" "ぶら下" "つて" "ゐ" "た" "。" "けれども" "、" "その" "俎" "下駄" "は" "、" "足音" "の" "遠退く" "に" "従" "つて" "、" "すう" "と" "頭" "から" "抜" "し" "て" "消え" "て" "仕舞" "つた" "。" "さ" "う" "し" "て" "眼" "が" "覚め" "た" "。")
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(use '[clojure.xml :only (parse)]) | |
(use '[clojure.contrib.http.agent :only (http-agent string)]) | |
(use 'clojure.java.io) | |
(def app-id "id for yahoo api") | |
(defn gen-request-message [text] | |
(str | |
"http://jlp.yahooapis.jp/MAService/V1/parse?appid=" | |
app-id | |
"&results=ma,uniq&uniq_filter=9|10&sentence=" | |
(java.net.URLEncoder/encode text "UTF-8"))) | |
(defn get-manalized-data [text] | |
(string (http-agent (gen-request-message text)))) | |
(defn save-data [text file-name] | |
(do | |
(with-open [w (writer file-name)] | |
(.write w text)) | |
file-name)) | |
(def kanji first) | |
(def kana second) | |
(defn take-tokens [kana-kanji xmld] | |
(map #(first (:content (kana-kanji (:content %)))) | |
(:content (first (drop 2 (:content (first (:content (parse xmld))))))))) | |
(defn tokenizer [kana-kanji text] | |
(take-tokens kana-kanji (save-data (get-manalized-data text) "temp.xml"))) |
- app-idには、yahooから与えられたアプリケーションIDを記述します。
- (平)仮名と漢字を選べます。(XMLデータには、両方の結果があります)
- リクエストの日本語のエンコードには、java.net.URLEncoder/encode
- take-tokensは、ネストしたハッシュマップから、単語の列を生成する。
0 件のコメント :
コメントを投稿