2010/08/26

Common Lisp から MeCab を手抜きで使う方法(SBCL 限定)

(defun run-mecab (string)
(with-output-to-string (out)
(with-input-from-string (in string)
(sb-ext:run-program "mecab" nil :search t :input in :output out))))

(defun mecabaku (string)
(with-input-from-string (in (run-mecab string))
(loop for i = (read-line in)
until (string= "EOS" i) collect (collect-mecabu-output i))))

(defmacro collect-mecabu-output-macro ()
(let ((x '(表層形 品詞 品詞細分類1 品詞細分類2 品詞細分類3 活用形 活用型 原形 読み 発音)))
`(defun collect-mecabu-output (one-line)
(ppcre:register-groups-bind ,x
("(.*)\\t(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*)" one-line)
(list ,@(loop for i in x
append `(',i ,i)))))))
(collect-mecabu-output-macro)

(mecabaku "桜が咲く。")
;; => ((表層形 "桜" 品詞 "名詞" 品詞細分類1 "一般" 品詞細分類2 "*" 品詞細分類3 "*" 活用形 "*" 活用型 "*" 原形 "桜" 読み "サクラ" 発音 "サクラ")
;; (表層形 "が" 品詞 "助詞" 品詞細分類1 "格助詞" 品詞細分類2 "一般" 品詞細分類3 "*" 活用形 "*" 活用型 "*" 原形 "が" 読み "ガ" 発音 "ガ")
;; (表層形 "咲く" 品詞 "動詞" 品詞細分類1 "自立" 品詞細分類2 "*" 品詞細分類3 "*" 活用形 "五段・カ行イ音便" 活用型 "基本形" 原形 "咲く" 読み "サク" 発音 "サク")
;; (表層形 "。" 品詞 "記号" 品詞細分類1 "句点" 品詞細分類2 "*" 品詞細分類3 "*" 活用形 "*" 活用型 "*" 原形 "。" 読み"。" 発音 "。"))

(loop for i in (mecabaku "桜が咲く。") collect (getf i '原形))
;; => ("桜" "が" "咲く" "。")

0 件のコメント: