kiyoka.2011_07_13 RSSPLAIN

Related pages: !kiyoka.blog.list Sekka.ReleaseNote kiyoka.2011_08_10 kiyoka.2011_08_24 Sekka.FAQ !kiyoka.blog.2011_08 !kiyoka.blog.2011_07
5555555555555555555555555555555555555555555555555555555555555555555555555555555555555554455555555555555555555555555555555555555555
5

[Sekka] 平仮名フレーズ辞書を追加してみようかな(3)

5
 NbpKsE
5

先日来のエントリ 

5
 「kiyoka.2011_07_06[Sekka] 平仮名フレーズ辞書を追加してみようかな(1)」
5
 「kiyoka.2011_07_07[Sekka] 平仮名フレーズ辞書を追加してみようかな(2)」
5

の続き。

5

 

5

実際にWebコーパスの6-gramのデータの中から、文末に出てくる定型フレーズを集めるスクリプトを書いてみた。

5

文末で、且つ、平仮名のみで構成されている形態素を連結した文字列をSekka用フレーズとした。

5

文末は </S> (文境界マーク) で判断した。

5

 

5
 入力例
5
% が 加算 さ れ て    1152
5
% が 加算 さ れ ます   1463
5
% しか あり ませ ん </S>       1995
5
% だっ た そう です </S>       1554
5
% だっ た の が 、    1142
5
% だっ た の に対し 、  3496
5
% で 、 環境 問題 に   1898
5
% で あっ た が 、    2212
5
, と し て いる </S> 1007
5
, と 思い まし た </S>        1780
5

 

5
 出力例
5
しかありません    ;;  7 ;; ("!%" "しか" "あり" "ませ" "ん" "</S>" "1995")
5
だったそうです    ;;  7 ;; ("!%" "だっ" "た" "そう" "です" "</S>" "1554")
5
としている    ;;  5 ;; ("!," "と" "し" "て" "いる" "</S>" "1007")
5
ました    ;;  3 ;; ("!," "と" "思い" "まし" "た" "</S>" "1780")
5

 

5

 

5

プログラムはNendoで書いたが、非常に計算が重い。(処理系の問題)

5

Gaucheでも動くポータブルなコードにすべきだったかも。まあ何回も動かすわけではないからいいか。

5
#!/bin/sh
5
:; #-*- mode: nendo; syntax: scheme -*-;;
5
:; exec /usr/local/bin/nendo $0 $*
5
5
(use srfi-1)
5
(use sekka.roman-lib)
5
5
(define (hiragana-filter words)
5
  (define (hiras lst)
5
    (cond
5
     ((null? lst)
5
      lst)
5
     ((is-hiragana (car lst))
5
      (cons
5
       (car lst)
5
       (hiras (cdr lst))))))
5
     
5
  (let1 lst (cdr (reverse words))
5
    (reverse (hiras lst))))
5
5
5
(define (include-slash-s? lst)
5
  (any
5
   (lambda (x y)
5
     (and
5
      (string=? "</S>" y)
5
      (is-hiragana     x)))
5
   (cons "" lst)
5
   lst))
5
   
5
5
(define (grep-last-phrase filename)
5
  (with-open
5
   filename
5
   (lambda (f)
5
     (for-each
5
      (lambda (line)
5
        (let* ([lst   (to-list (line.chomp.split #/[ \t]+/))]
5
               [freq  (take-right lst 1)]
5
               [words (drop-right lst 1)])
5
          (when (include-slash-s? words)
5
            (let1 phrase (apply + (hiragana-filter words))
5
              (printf "%s    ;; %2d ;; %s\n"
5
                      phrase
5
                      phrase.size
5
                      (write-to-string lst))))))
5
      (f.readlines.to_list)))))
5
5
(define (main argv)
5
  (if (> 1 (length argv))
5
      (error "hiragana_phrase.nnd requires [6gram web corpus file]")
5
      (grep-last-phrase (car (to-list argv)))))
5

 

5

 

5

この処理のあと、「ー」が含まれるフレーズや、「っぁぃぅぇぉ」などで終わるフレーズは固い文章を書いている時に出てくると困るので、外している。

4

例えば、「どーも」とか「よろしくっ」とかが頻繁にサジェストされてると非常に困る。そういうくだけた表現は自分で故意に入力すればいい。

4

また、辞書の語彙として有意なものに限定するため 2文字から7文字までの長さのフレーズに絞り込んだ。

5

 

5

プログラムはこちら。

5
#!/bin/sh
5
:; #-*- mode: nendo; syntax: scheme -*-;;
5
:; exec /usr/local/bin/nendo $0 $*
5
5
(define (writing-phrase? str)
5
  (not
5
   (or
5
    (rxmatch #/ー/ str)
5
    (rxmatch #/[ぁぃぅぇぉゃゅょっー]$/ str))))
5
  
5
(define (writing-phrase-filter filename)
5
  (with-open
5
   filename
5
   (lambda (f)
5
     (for-each
5
      (lambda (line)
5
        (let* ([lst   (to-list (line.chomp.split #/[ \t]+/))]
5
               [word  (car lst)])
5
          (when (and (<= 2 (word.size))
5
                     (<= (word.size) 7)
5
                     (writing-phrase? word))
5
            (printf "%s  //\n" word))))
5
      (f.readlines.to_list)))))
5
5
(define (main argv)
5
  (if (> 1 (length argv))
5
      (error "writing_phrase_filter.nnd requires file as 'hiragana  ;; ....' ")
5
      (writing-phrase-filter (car (to-list argv)))))
5

 

5

ファイルから読みこんで1行ずつ処理するプログラムを書くことが多いので、もっと便利な関数を作りたくなってきた。

5

Gaucheに習って Nendo に port->string-list を作るかな。

5

あっ、そうか portの概念をどうする決めかねていて止まっているんだった。どうするかなぁ。

5

とりあえず これでお茶を濁してportとしてしまうかー。いいのかな。

5

 

5
  class LispPort < File
5
  end
5

 

5

 

5

...comment disabled...