éå»ã®ãšã³ããªãããªã©ã€ããããšã³ããªã§ãã
以åããã¡ãã®ãšã³ããªãèŠãŠ
Clojure/kuromojiã§ããã¹ããã€ãã³ã°å
¥éãã圢æ
çŽ è§£æããã¯ãŒãã«ãŠã³ããŸã§ã
http://antibayesian.hateblo.jp/entry/2013/09/10/231334
çŽ ã®Kuromojiã䜿ã£ãŠåœ¢æ çŽ è§£æãããŠãããšããããLuceneã®Kuromojiã«æžãæãããšã³ããªãæžããŸããã
Clojure/lucene-kuromojiã§ããã¹ããã€ãã³ã°å
¥éãã圢æ
çŽ è§£æããã¯ãŒãã«ãŠã³ããŸã§ã
http://d.hatena.ne.jp/Kazuhira/20130911/1378914422
ããã¶ã£ã¡ãããã®æã¯Incanterã®éšåãåãã£ãŠããªããŠãéäžçµéãŸã§åãããã«ã§ããã®ã§åŸã¯å ã®ãšã³ããªã«åãããŠâŠãšããæãã§ããã
ããã§ãIncanterãå°ã䜿ã£ãŠã¿ãã®ã§ãã³ãŒãã®èŠçŽããããŠã¿ãããšæããŸãã
ãããããäœã«ã€ããŠã®ãšã³ããªã ã£ãïŒ
倧å ã®ãšã³ããªãããããšããŠããã®ã¯ãããããããŒãã§ãã
Clojureã§ããã¹ããã€ãã³ã°ããããïŒãšããæ¹ãTLã«ããã£ããã£ãã®ã§ã
Clojure/kuromojiでテキストマイニング入門 ~形態素解析からワードカウントまで~ - あんちべ!
Clojureãšããèšèªãškuromojiãšãã圢æ çŽ è§£æåšãçšããããã¹ããã€ãã³ã°å ¥éã®èšäºãæžããŸãã
ãã®èšäºã®éãæãåãããšãæ§ã ãªããã¹ããäŸãã°ã¢ã³ã±ãŒãã®èªç±èšè¿°ãããã°ãtwitterãªã©ã®æç« ã«åœ¢æ çŽ è§£æãæããã¯ãŒãã«ãŠã³ããšåŒã°ãããããåèªãäœååºçŸããŠããã®ãã解æããææ³ã䜿ããããã«ãªããŸãããããå©çšããåºçŸåèªãé »åºŠé ã«äžŠã¹ãŠã©ã³ãã³ã°ãäœããªã©ããŠããã®ææžã®ç¹åŸŽãæããã«ãããªã©ãåºæ¥ãããã«ãªããŸãã
ãšããããã§ã圢æ çŽ è§£æãè¡ã£ãŠãã¯ãŒãã«ãŠã³ãããã£ãŠã¿ãããšããå 容ã§ããããããLucene Kuromojiã䜿ã£ãŠãããŸãã
ç°å¢æºå
ä»åã¯ã1ãšã³ããªã§å šéšå®çµãããŠã¿ãŸããããç°å¢ã®åæã¯ãJavaãã€ã³ã¹ããŒã«ãããŠããããšãããã®ã¿ãšããŸãã
ãã ãã€ã³ã¹ããŒã«ããããŒã«ãã©ã€ãã©ãªãªã©ã«ã€ããŠããããªã«çŽ°ããã¯çŽ¹ä»ããŸããã
Leiningenã®ã€ã³ã¹ããŒã«
å®è¡ã«ã¯ãLeiningenãšãããã«ãããŒã«ãå¿ èŠã«ãªããŸãã
Leiningen
http://leiningen.org/
ã€ã³ã¹ããŒã«ã¯ãã¹ã¯ãªãããé©åœãªãã£ã¬ã¯ããªã«ããŠã³ããŒãããŠ
$ wget -O /path/to/lein https://raw.github.com/technomancy/leiningen/stable/bin/lein
ããŠã³ããŒãããã¹ã¯ãªããã«å®è¡æš©éãä»äžããŸãã
$ sudo chmod 755 /path/to/lein
ãŸããé 眮ããã¹ã¯ãªããã«ãã¹ãéããŠãããŠãã ããã
æ¬äœãã€ã³ã¹ããŒã«ã
$ lein self-install
ããã§ãLeiningenã®ã€ã³ã¹ããŒã«ã¯å®äºã§ãã
lein-execãã©ã°ã€ã³ã®ã€ã³ã¹ããŒã«
Leiningenã䜿ããšããµã€ããããžã§ã¯ãã¿ãããªåäœã®ãã®ãäœæããã®ã§ãããé¢åãªã®ã§Clojureã¹ã¯ãªããããã®ãŸãŸå®è¡ãã圢æ ã«ããŸãã
ããã§ãLeiningenã®ãã©ã°ã€ã³ã§ããlein-execãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŸãã
lein-exec
https://github.com/kumarshantanu/lein-exec
Leiningenã®ã€ã³ã¹ããŒã«ãçµãããšã
$HOME/.lein
ãšãããã£ã¬ã¯ããªãã§ããŠããã®ã§ãããã«ä»¥äžã®ãã¹ã§
$HOME/.lein/profiles.clj
ãã®ãããªå 容ã®ãã¡ã€ã«ãäœæããŸãã
{:user {:plugins [[lein-exec "[0.3.2,)"]]}}
ãã¡ã€ã«èªäœã¯ååšããªãã¯ããªã®ã§ãæ°èŠã«äœæããŠãã ãããã
èšå®å 容ãšããŠã¯ãlein-execãã©ã°ã€ã³ã®0.3.2ããã³ãããæ°ããããŒãžã§ã³ãååŸãããããªèšè¿°ã«ãªã£ãŠããŸããåºå®ã«ãããå Žåã¯ã以äžã®æ§ã«æžããšããã§ãããã
{:user {:plugins [[lein-exec "0.3.2"]]}}
ããã§ã以äžã®ãããªã³ãã³ãã§Clojureã¹ã¯ãªãããå®è¡ã§ããããã«ãªããŸãã
$ lein exec [Clojureã¹ã¯ãªããå]
Clojureã¹ã¯ãªããã®æºå
ããã§ã¯ã圢æ çŽ è§£æãšã¯ãŒãã«ãŠã³ããè¡ãClojureã¹ã¯ãªãããæžããŠãããŸãã
ããã§äœæããClojureã¹ã¯ãªããåã¯ãlucene-clojure-word-count.cljããšãã以äžã®ã³ãã³ãã§å®è¡ããŠããŸãã
$ lein exec lucene-clojure-word-count.clj
å¿ èŠãªäŸåé¢ä¿ã®å®çŸ©ãimportïŒrequireãªã©
ä»å䜿çšããLucene KuromojiãIncanterãªã©ãžã®äŸåé¢ä¿ãå®çŸ©ããŸãããŸããå¿ èŠã«å¿ããŠimportãrequireãèšè¿°ã
(set! *warn-on-reflection* true) (require '[leiningen.exec :as exec]) (exec/deps '[[clj-soup/clojure-soup "0.1.1"] [org.apache.lucene/lucene-kuromoji "3.6.2"] [incanter "1.5.4"]]) (ns lucene.clojure.word.count (import (java.io StringReader) (org.apache.lucene.analysis Analyzer TokenStream) (org.apache.lucene.analysis.ja JapaneseAnalyzer) (org.apache.lucene.analysis.ja.tokenattributes BaseFormAttribute InflectionAttribute PartOfSpeechAttribute ReadingAttribute) (org.apache.lucene.analysis.tokenattributes CharTermAttribute) (org.apache.lucene.util Version)) (:require [jsoup.soup :as js] [incanter.core :as c] [incanter.stats :as s] [incanter.charts :as ch]))
ãããŸãé¢ä¿ãªãã§ããããªãã¬ã¯ã·ã§ã³ã«å¯ŸããèŠåãæå¹ã«ããŠããŸãã
jsoupã¯äž»é¡ãšã¯é¢ä¿ãªãã®ã§ãããåŸã§äœ¿çšããŸãã
[clj-soup/clojure-soup "0.1.1"]
ãŸãã䜿çšããLuceneã®ããŒãžã§ã³ãå€ãã®ã§ãããããã¯lein-execçµç±ã§å®è¡ããå Žåã¯ãå®è¡æã«Leiningenæ¬äœãã¯ã©ã¹ãã¹äžã«å«ãŸããŠããŸããããããã®äžã«Lucene 3.6ãããããã§ãã
[org.apache.lucene/lucene-kuromoji "3.6.2"]
ãã£ãŠãæ®å¿µãªããLucene Kuromojiã¯3.6.2ãéžæããŠããŸãããããã®åŸã§æžãã³ãŒãã¯Lucene 4ç³»ã§ãåäœãããã®ã®ã¯ãã§ãã®ã§ãå¿ èŠã§ããã°Leiningenãããžã§ã¯ãã®åœ¢ã«ããŠãäŸåé¢ä¿ã®å®çŸ©ãå€ããŠããã ããã°ãšã
圢æ çŽ è§£æãè¡ãé¢æ°
圢æ çŽ è§£æãè¡ãé¢æ°ãã以äžã®æ§ã«å®çŸ©ããŸããã
;; Luceneã®ããŒãžã§ã³ (def ^Version lucene-version (Version/LUCENE_CURRENT)) ;; äžããããæååãã圢æ çŽ è§£æãåèªããã³å±æ§ã®ããããšã㊠;; ãã¯ã¿ã«å«ããŠè¿åŽãã (defn morphological-analysis [^String sentence] (let [^Analyzer analyzer (JapaneseAnalyzer. lucene-version)] (with-open [^TokenStream token-stream (. analyzer tokenStream "" (StringReader. sentence))] (let [^CharTermAttribute char-term (. token-stream addAttribute CharTermAttribute) ^BaseFormAttribute base-form (. token-stream addAttribute BaseFormAttribute) ^InflectionAttribute inflection (. token-stream addAttribute InflectionAttribute) ^PartOfSpeechAttribute part-of-speech (. token-stream addAttribute PartOfSpeechAttribute) ^ReadingAttribute reading (. token-stream addAttribute ReadingAttribute)] (letfn [(create-attributes [] {:token (. char-term toString) :reading (. reading getReading) :part-of-speech (. part-of-speech getPartOfSpeech) :base (. base-form getBaseForm) :inflection-type (. inflection getInflectionType) :inflection-form (. inflection getInflectionForm)})] (. token-stream reset) (try (loop [tokenized-seq []] (if (. token-stream incrementToken) (recur (conj tokenized-seq (create-attributes))) tokenized-seq)) (finally (. token-stream end))))))))
ãã®é¢æ°ã«ã以äžã®ãããªå ¥åãäžãããš
(->> (morphological-analysis (str "ClojureãšLucene-Kuromojiã䜿ã£ãŠã" "ããã¹ãã圢æ çŽ è§£æããŠã¯ãŒãã«ãŠã³ããè¡ãã" "Clojureã«ããããã¹ããã€ãã³ã°ã«ãã£ã¬ã³ãžããããšæããŸã")) (println))
ãã®ãããªçµæã«ãªããŸãã
ïŒå®éã«ã¯ãã¯ã¿ã§ãããèŠãããã®ããã{ãã§æ¹è¡ããŠããŸãã
[ {:token clojure, :reading nil, :part-of-speech åè©-åºæåè©-çµç¹, :base nil, :inflection-type nil, :inflection-form nil} {:token lucene, :reading nil, :part-of-speech åè©-åºæåè©-çµç¹, :base nil, :inflection-type nil, :inflection-form nil} {:token kuromoji, :reading nil, :part-of-speech åè©-äžè¬, :base nil, :inflection-type nil, :inflection-form nil} {:token 䜿ã, :reading ãã«ã, :part-of-speech åè©-èªç«, :base 䜿ã, :inflection-type äºæ®µã»ã¯è¡ä¿é³äŸ¿, :inflection-form é£çšã¿æ¥ç¶} {:token ããã¹ã, :reading ããã¹ã, :part-of-speech åè©-äžè¬, :base nil, :inflection-type nil, :inflection-form nil} {:token 圢æ çŽ , :reading ã±ã€ã¿ã€ãœ, :part-of-speech åè©-äžè¬, :base nil, :inflection-type nil, :inflection-form nil} {:token 解æ, :reading ã«ã€ã»ã, :part-of-speech åè©-ãµå€æ¥ç¶, :base nil, :inflection-type nil, :inflection-form nil} {:token ã¯ãŒã, :reading ã¯ãŒã, :part-of-speech åè©-äžè¬, :base nil, :inflection-type nil, :inflection-form nil} {:token ã«ãŠã³ã, :reading ã«ãŠã³ã, :part-of-speech åè©-ãµå€æ¥ç¶, :base nil, :inflection-type nil, :inflection-form nil} {:token è¡ã, :reading ãªã³ãã€, :part-of-speech åè©-èªç«, :base è¡ã, :inflection-type äºæ®µã»ã¯è¡ä¿é³äŸ¿, :inflection-form é£çšåœ¢} {:token clojure, :reading nil, :part-of-speech åè©-åºæåè©-çµç¹, :base nil, :inflection-type nil, :inflection-form nil} {:token ããã¹ã, :reading ããã¹ã, :part-of-speech åè©-äžè¬, :base nil, :inflection-type nil, :inflection-form nil} {:token ãã€ãã³ã°, :reading ãã€ãã³ã°, :part-of-speech åè©-ãµå€æ¥ç¶, :base nil, :inflection-type nil, :inflection-form nil} {:token ãã£ã¬ã³ãž, :reading ãã£ã¬ã³ãž, :part-of-speech åè©-ãµå€æ¥ç¶, :base nil, :inflection-type nil, :inflection-form nil} {:token æã, :reading ãªã¢ã€, :part-of-speech åè©-èªç«, :base æã, :inflection-type äºæ®µã»ã¯è¡ä¿é³äŸ¿, :inflection-form é£çšåœ¢}]
åè©ã®ã¿ãæœåº
å ã»ã©ã®åœ¢æ çŽ è§£æã®çµæãããã¯ãŒãã«ãŠã³ãããããã«åè©ã®ã¿ãæœåºããŸãããã®ããã®ãé¢æ°å®çŸ©ã
;; morphological-analysisé¢æ°ã§åŸããããã¯ã¿ã®äžãã ;; åè©ã®ã¿ã«çµã蟌ã (defn select-nominal [tokenized-seq] (filter #(re-find #"åè©" (% :part-of-speech)) tokenized-seq))
ããããå ã»ã©ã®é¢æ°åŒã³åºãã«ç¹ããŸãã
(->> (morphological-analysis (str "ClojureãšLucene-Kuromojiã䜿ã£ãŠã" "ããã¹ãã圢æ çŽ è§£æããŠã¯ãŒãã«ãŠã³ããè¡ãã" "Clojureã«ããããã¹ããã€ãã³ã°ã«ãã£ã¬ã³ãžããããšæããŸã")) (select-nominal) (println))
çµæã
( {:token clojure, :reading nil, :part-of-speech åè©-åºæåè©-çµç¹, :base nil, :inflection-type nil, :inflection-form nil} {:token lucene, :reading nil, :part-of-speech åè©-åºæåè©-çµç¹, :base nil, :inflection-type nil, :inflection-form nil} {:token kuromoji, :reading nil, :part-of-speech åè©-äžè¬, :base nil, :inflection-type nil, :inflection-form nil} {:token ããã¹ã, :reading ããã¹ã, :part-of-speech åè©-äžè¬, :base nil, :inflection-type nil, :inflection-form nil} {:token 圢æ çŽ , :reading ã±ã€ã¿ã€ãœ, :part-of-speech åè©-äžè¬, :base nil, :inflection-type nil, :inflection-form nil} {:token 解æ, :reading ã«ã€ã»ã, :part-of-speech åè©-ãµå€æ¥ç¶, :base nil, :inflection-type nil, :inflection-form nil} {:token ã¯ãŒã, :reading ã¯ãŒã, :part-of-speech åè©-äžè¬, :base nil, :inflection-type nil, :inflection-form nil} {:token ã«ãŠã³ã, :reading ã«ãŠã³ã, :part-of-speech åè©-ãµå€æ¥ç¶, :base nil, :inflection-type nil, :inflection-form nil} {:token clojure, :reading nil, :part-of-speech åè©-åºæåè©-çµç¹, :base nil, :inflection-type nil, :inflection-form nil} {:token ããã¹ã, :reading ããã¹ã, :part-of-speech åè©-äžè¬, :base nil, :inflection-type nil, :inflection-form nil} {:token ãã€ãã³ã°, :reading ãã€ãã³ã°, :part-of-speech åè©-ãµå€æ¥ç¶, :base nil, :inflection-type nil, :inflection-form nil} {:token ãã£ã¬ã³ãž, :reading ãã£ã¬ã³ãž, :part-of-speech åè©-ãµå€æ¥ç¶, :base nil, :inflection-type nil, :inflection-form nil})
åè©ãèœãšãããŸããããããšã衚瀺ãã·ãŒã±ã³ã¹ã«ãªããŸãããâŠã
åèªã®ã¿ã®æœåº
ãã®åŸãã¯ãŒãã«ãŠã³ãè¡ãããã§ããã圢æ çŽ è§£æã§åŸãããä»ã®æ å ±ã¯äžèŠãªã®ã§ãããã§åèªã®ã¿ã®ã·ãŒã±ã³ã¹ã«ããŸãã
;; morphological-analysisé¢æ°ã§åŸããããã¯ã¿ã®äžãã ;; åèªã®ã¿ãæœåºãã (defn token-only [tokenized-seq] (map #(% :token) tokenized-seq))
ã§ãç¹ããŠå®è¡ã
(->> (morphological-analysis (str "ClojureãšLucene-Kuromojiã䜿ã£ãŠã" "ããã¹ãã圢æ çŽ è§£æããŠã¯ãŒãã«ãŠã³ããè¡ãã" "Clojureã«ããããã¹ããã€ãã³ã°ã«ãã£ã¬ã³ãžããããšæããŸã")) (select-nominal) (token-only) (println))
ã¯ããåèªã®ã¿ã«ãªããŸããã
(clojure lucene kuromoji ããã¹ã 圢æ çŽ è§£æ ã¯ãŒã ã«ãŠã³ã clojure ããã¹ã ãã€ãã³ã° ãã£ã¬ã³ãž)
ã¯ãŒãã«ãŠã³ã
ãããŸã§ã§åŸãããåèªã®ã·ãŒã±ã³ã¹ã«å¯ŸããŠãã¯ãŒãã«ãŠã³ããè¡ããŸããå ·äœçã«ã¯ãåèªãããŒã«åºçŸåæ°ãå€ã«ããããããäœæããŸãããã®é¢æ°å®çŸ©ã
;; æååã®ãã¯ã¿ããåèªãšåºçŸåæ°ã®ãããã«å€æãã (defn word-count [token-seq] (reduce (fn [words word] (assoc words word (inc (get words word 0)))) {} token-seq))
ç¹ããŸãã
(->> (morphological-analysis (str "ClojureãšLucene-Kuromojiã䜿ã£ãŠã" "ããã¹ãã圢æ çŽ è§£æããŠã¯ãŒãã«ãŠã³ããè¡ãã" "Clojureã«ããããã¹ããã€ãã³ã°ã«ãã£ã¬ã³ãžããããšæããŸã")) (select-nominal) (token-only) (word-count) (println))
çµæã
{lucene 1, ãã€ãã³ã° 1, clojure 2, kuromoji 1, 解æ 1, ãã£ã¬ã³ãž 1, ã«ãŠã³ã 1, ããã¹ã 2, 圢æ çŽ 1, ã¯ãŒã 1}
ãœãŒã
åŸããããããããåèªã®åºçŸåæ°ã®éé ã«ãœãŒãããŸãããã
;; word-counté¢æ°ã®çµæããåºçŸåæ°ã®éé ã«ãœãŒããã (defn sort-desc-words [word-counted-map] (reverse (sort-by second word-counted-map)))
ç¹ããŸãã
(->> (morphological-analysis (str "ClojureãšLucene-Kuromojiã䜿ã£ãŠã" "ããã¹ãã圢æ çŽ è§£æããŠã¯ãŒãã«ãŠã³ããè¡ãã" "Clojureã«ããããã¹ããã€ãã³ã°ã«ãã£ã¬ã³ãžããããšæããŸã")) (select-nominal) (token-only) (word-count) (sort-desc-words) (println))
çµæã
([ããã¹ã 2] [clojure 2] [ã¯ãŒã 1] [圢æ çŽ 1] [ã«ãŠã³ã 1] [ãã£ã¬ã³ãž 1] [解æ 1] [kuromoji 1] [ãã€ãã³ã° 1] [lucene 1])
ã¡ãã£ãšãããã£ãœããªã£ãŠããŸãããïŒ
äžäœNãæœåº
ããã¯ããããŸã§ã®çµæã«takeé¢æ°ã§å é NåãååŸããã°ããã§ãã
äŸãã°ãäžäœ5件ã®å Žåã¯
(->> (morphological-analysis (str "ClojureãšLucene-Kuromojiã䜿ã£ãŠã" "ããã¹ãã圢æ çŽ è§£æããŠã¯ãŒãã«ãŠã³ããè¡ãã" "Clojureã«ããããã¹ããã€ãã³ã°ã«ãã£ã¬ã³ãžããããšæããŸã")) (select-nominal) (token-only) (word-count) (sort-desc-words) (take 5) (println))
ãšãªããŸãã
çµæã
([ããã¹ã 2] [clojure 2] [ã¯ãŒã 1] [圢æ çŽ 1] [ã«ãŠã³ã 1])
ã°ã©ã衚瀺
ããã§ã¯ããããŸã§ã§åŸãããçµæãIncanterã䜿ã£ãŠã°ã©ã衚瀺ããŠã¿ãŸãããã
å ã»ã©ãŸã§æžããŠããé¢æ°åŒã³åºãã®é£éãã以äžã®æ§ã«å€æŽããŸãã
(let [wc (->> (morphological-analysis (str "ClojureãšLucene-Kuromojiã䜿ã£ãŠã" "ããã¹ãã圢æ çŽ è§£æããŠã¯ãŒãã«ãŠã³ããè¡ãã" "Clojureã«ããããã¹ããã€ãã³ã°ã«ãã£ã¬ã³ãžããããšæããŸã")) (select-nominal) (token-only) (word-count) (sort-desc-words) (take 5))] (c/view (ch/bar-chart (keys wc) (vals wc))))
ã¡ãªã¿ã«ãäœãããªããšããã°ã©ã ãèµ°ãæããŠã°ã©ããããã«æ¶ããŠããŸãã®ã§ãEnterãæŒããšããã°ã©ã ãçµäºããããã«ããŸããã
;; çµäºåŸ ã¡ (println "EnterããããšçµäºããŸã") (read-line)
ããã§å®è¡ãããšâŠ
å
šç¶å€§ããããšãããŸããããããã£ãœãçµæãåºãŸãããïŒïŒ
ããå°ãã倧ããªããŒã¿ã«å¯ŸããŠå®è¡ãã
以åãšåæ§ãåã¡ãããå ¥åãšããŠããŒã¿è§£æããããšæããŸãã
åã£ã¡ãã
http://www.aozora.gr.jp/cards/000148/files/752_14964.html
ã§ãååã¯ãã®ããã¹ãããã¡ã€ã«ãšããŠããŠã³ããŒãããŠå®è¡ããŠããã®ã§ãããä»åã¯HTTPã§ååŸããããã«ããŸãããã
ããã§ã¯ãClojure Soupã䜿çšããŠã¿ãŸãã
Clojure Soup
https://github.com/mfornos/clojure-soup
Clojure Soupã䜿çšããããšã§ã以äžã®ã³ãŒãã§å ã«çŽ¹ä»ããåã¡ããã®æ¬æãååŸããŸãïŒã«ããå ¥ã£ãŠãŸããâŠïŒã
(js/$ (js/get! "http://www.aozora.gr.jp/cards/000148/files/752_14964.html") "div.main_text" (js/text) (clojure.string/join "")
ã§ãååã®ãšã³ããªã§ã¯äžäœ10ãšäžäœ100ãååŸããã®ã§ãä»åãããã«ç¿ã£ãŠãããªã³ãŒãã«ããŸããã
(let [^String text (js/$ (js/get! "http://www.aozora.gr.jp/cards/000148/files/752_14964.html") "div.main_text" (js/text) (clojure.string/join ""))] (let [wc (->> (morphological-analysis text) (select-nominal) (token-only) (word-count) (sort-desc-words)) top10 (take 10 wc) top100 (take 100 wc)] (c/view (ch/bar-chart (keys top10) (vals top10) :title "é »åºåèª äžäœ10äœãšåºçŸæ°" :x-label "åèª" :y-label "åºçŸæ°")) (c/view (ch/bar-chart (keys top100) (vals top100) :title "é »åºåèª äžäœ100äœãšåºçŸæ°" :x-label "åèª" :y-label "åºçŸæ°")))) ;; çµäºåŸ ã¡ (println "EnterããããšçµäºããŸã") (read-line)
çµæãååãšèŠãæãå€ãããïŒãããããã ïŒã
ä»åäœæããã³ãŒãã¯ããã¡ãã«ã¢ããããŠããŸãã
https://github.com/kazuhira-r/lucene-examples/blob/master/lucene-clojure-word-count/lucene-clojure-word-count.clj
ååãšæ¯ã¹ãŠãå°ãã¯èŠããããªã£ããšæãã®ã§ãããã©ãããªãâŠïŒ
ãšã¯ãããæºè¶³ãã£ãŠãªãéšåããã£ãŠâŠ
- 圢æ çŽ è§£æã®ãšããã§ãloopïŒrecurã䜿ã£ãŠããŸã£ãïŒrepeatedlyã§ããããšããŠãAnalyzerãããŸãåãããªãã£ãïŒ
- Clojure Soupã®åŒã³åºãéšãé¢æ°åãããšããªããããŸãåããªãã£ãïŒã»ã¬ã¯ã¿æå®ã®éšåãå€æ°ã«å ¥ãããšããªããåããå€ãããŸãããâŠïŒïŒ
ãšãããšãããå¿æ®ãã§ã¯ãããŸããããšãããããããããã®ãã®ã§ããããã
ãã®ãšã³ããªã§ãClojureãLuceneã圢æ
çŽ è§£æãªã©ã«èå³ãæãããæ¹ãããã£ãããã°å¹žãã§ãã
ïŒçµ±èšè§£æã¯ãèªåã觊ã£ãã°ãããªã®ã§åŒ·ãèšããŸããâŠ