(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 件のコメント:
コメントを投稿