-1

テキスト ファイルから文字列を読み取ろうとしています。スキームを使用して各単語の出現に関する「統計」を提供し、最も使用されている単語を提供します。

式:

string = "one two, tree  one two"

そして取得:

one: 2
two: 2
tree: 1

単純な関数カウンターを使用して各単語をカウントし、結果を画面に表示することはできますが、この結果を使用して、たとえば巨大な入力テキストで最も使用されている 5 つの単語を表示する方法が見つかりません-本例えば-。

アップデート :

これが私の質問に対する私の解決策ですが、入力は次のようにソートする必要があります(aaaabbbbbmmm)

 (define frequency (lambda(ls) 
           (if (null? ls) '() (freq_aux (car ls) 1 (cdr ls) '() ))))
           (define freq_aux (lambda(l n ls tmp ) ( if(null? ls)
           (cons (cons n l) tmp) (if(equal? l (car ls)) 
           (freq_aux l (+ 1 n) (cdr ls) tmp) 
           (freq_aux (car ls) 1 (cdr ls) (cons (cons n l) tmp))))))
4

1 に答える 1

1

別の StackOverflow の質問からのヒントを次に示します (見つかりません)。

(define (tokenize file)
  (with-input-from-file file
    (lambda ()
      (let reading ((lines '()) (words '()) (chars '()))
        (let ((char (read-char)))
          (if (eof-object? char)
              (reverse lines)
              (case char
                ((#\newline) (reading (cons (reverse (cons (reverse chars) words)) lines) '() '()))
                ((#\space)   (reading lines (cons (reverse chars) words) '()))
                (else        (reading lines words (cons char chars))))))))))

これは、文字のリストである単語のリストである行のリストを返します。次のように文字列のリストを取得できます。

(map list->string (apply append (tokenize <someffile>)))

それから:

(define (frequency-alist words)
  (let ((alist '()))
    (let scanning ((words words))
      (if (null? words
          alist
          (let ((word (car words)))
            (cond ((assoc word alist)
                   => (lambda (al-item)
                         (set-cdr! al-item (+ 1 (cdr al-item)))))
                  (else (set! alist (cons (cons word 1) alist))))
            (scanning (cdr words)))))))
于 2013-05-02T02:20:07.063 に答える