私はRacketのNLPプロジェクトに取り組んでいます。このラケットコードでtraceを使用するには?
このコードは正常に動作します。しかし、私はそれを辿ることができればと思います。
私はgenerate-next関数の動作をトレースするのに問題があります。
私のコードです:
#lang racket
(require racket/trace)
(require rackunit)
(define english-1
'((Initial (1))
(Final (9))
(From 1 to 1 by NP)
(From 1 to 2 by DET)
(From 1 to 3 by NP)
(From 2 to 3 by N)
(From 3 to 4 by BV)
(From 4 to 5 by ADV)
(From 4 to 5 by |#|)
(From 5 to 6 by DET)
(From 5 to 7 by DET)
(From 5 to 8 by |#|)
(From 6 to 7 by ADJ)
(From 6 to 6 by MOD)
(From 7 to 9 by N)
(From 8 to 8 by MOD)
(From 8 to 9 by ADJ)
(From 9 to 4 by CNJ)
(From 9 to 1 by CNJ)
(From 9 to 2 by CNJ)
(From 9 to 3 by CNJ)
(From 9 to 6 by CNJ)))
(define (getf x y)
(if (eq? (car x) y)
(cadr x)
(getf (cdr x) y)))
(define (initial-nodes network)
(list-ref (assoc 'Initial network) 1))
(define (final-nodes network)
(list-ref (assoc 'Final network) 1))
(define (transitions network)
(filter (lambda (x) (eq? (car x) 'From)) network))
(define (trans-node transition)
(getf transition 'From))
(define(trans-newnode transition)
(getf transition 'to))
(define (trans-label transition)
(getf transition 'by))
(define abbreviations
'((NP kim sandy lee)
(DET a the her)
(N consumer man woman)
(BV is was)
(CNJ and or)
(ADJ happy stupid)
(MOD very)
(ADV often always sometimes)))
(define (recognize network tape)
;; returns t if sucessfully recognizes tape - nil otherwise
(call/cc (lambda (return)
(define (recognize-next node tape network)
(if (null? tape)
(if (member node (final-nodes network))
(return #t)
(return '())); success
(for ([transition (transitions network)])
;; try each transition of the network
(when (equal? node (trans-node transition)) ; if it starts at the right node
(for ([newtape (recognize-move (trans-label transition) tape)])
;; try each possible new value of tape
(recognize-next (trans-newnode transition) newtape network)))))(trace recognize-next))
(for ([initialnode (initial-nodes network)])
(recognize-next initialnode tape network))
null))) ; failed to recognize
(define (recognize-move label tape)
(if (or (eq? label (car tape))
(member (car tape) (or (assoc label abbreviations) '())))
(list (cdr tape))
(if (eq? label '|#|)
(list tape)
null)))
私が呼ぶとき:
(recognize english-1 '(sandy is a happy woman))
トレースが正常に動作し、私が予想される出力があります何かを追跡しようとしたとき、しかし
>(recognize-next
3
'(is a happy woman)
'((Initial (1))
(Final (9))
(From 1 to 1 by NP)
(From 1 to 2 by DET)
(From 1 to 3 by NP)
(From 2 to 3 by N)
(From 3 to 4 by BV)
(From 4 to 5 by ADV)
(From 4 to 5 by |#|)
(From 5 to 6 by DET)
(From 5 to 7 by DET)
(From 5 to 8 by |#|)
(From 6 to 7 by ADJ)
(From 6 to 6 by MOD)
(From 7 to 9 by N)
(From 8 to 8 by MOD)
(From 8 to 9 by ADJ)
(From 9 to 4 by CNJ)
(From 9 to 1 by CNJ)
(From 9 to 2 by CNJ)
(From 9 to 3 by CNJ)
(From 9 to 6 by CNJ)))
> (recognize-next
4
'(a happy woman)
'((Initial (1))
(Final (9))
(From 1 to 1 by NP)
(From 1 to 2 by DET)
(From 1 to 3 by NP)
(From 2 to 3 by N)
(From 3 to 4 by BV)
(From 4 to 5 by ADV)
(From 4 to 5 by |#|)
(From 5 to 6 by DET)
(From 5 to 7 by DET)
(From 5 to 8 by |#|)
(From 6 to 7 by ADJ)
(From 6 to 6 by MOD)
(From 7 to 9 by N)
(From 8 to 8 by MOD)
(From 8 to 9 by ADJ)
(From 9 to 4 by CNJ)
(From 9 to 1 by CNJ)
(From 9 to 2 by CNJ)
(From 9 to 3 by CNJ)
(From 9 to 6 by CNJ)))
> >(recognize-next
5
'(a happy woman)
'((Initial (1))
(Final (9))
(From 1 to 1 by NP)
(From 1 to 2 by DET)
(From 1 to 3 by NP)
(From 2 to 3 by N)
(From 3 to 4 by BV)
(From 4 to 5 by ADV)
(From 4 to 5 by |#|)
(From 5 to 6 by DET)
(From 5 to 7 by DET)
(From 5 to 8 by |#|)
(From 6 to 7 by ADJ)
(From 6 to 6 by MOD)
(From 7 to 9 by N)
(From 8 to 8 by MOD)
(From 8 to 9 by ADJ)
(From 9 to 4 by CNJ)
(From 9 to 1 by CNJ)
(From 9 to 2 by CNJ)
(From 9 to 3 by CNJ)
(From 9 to 6 by CNJ)))
> > (recognize-next
6
'(happy woman)
'((Initial (1))
(Final (9))
(From 1 to 1 by NP)
(From 1 to 2 by DET)
(From 1 to 3 by NP)
(From 2 to 3 by N)
(From 3 to 4 by BV)
(From 4 to 5 by ADV)
(From 4 to 5 by |#|)
(From 5 to 6 by DET)
(From 5 to 7 by DET)
(From 5 to 8 by |#|)
(From 6 to 7 by ADJ)
(From 6 to 6 by MOD)
(From 7 to 9 by N)
(From 8 to 8 by MOD)
(From 8 to 9 by ADJ)
(From 9 to 4 by CNJ)
(From 9 to 1 by CNJ)
(From 9 to 2 by CNJ)
(From 9 to 3 by CNJ)
(From 9 to 6 by CNJ)))
> > >(recognize-next
7
'(woman)
'((Initial (1))
(Final (9))
(From 1 to 1 by NP)
(From 1 to 2 by DET)
(From 1 to 3 by NP)
(From 2 to 3 by N)
(From 3 to 4 by BV)
(From 4 to 5 by ADV)
(From 4 to 5 by |#|)
(From 5 to 6 by DET)
(From 5 to 7 by DET)
(From 5 to 8 by |#|)
(From 6 to 7 by ADJ)
(From 6 to 6 by MOD)
(From 7 to 9 by N)
(From 8 to 8 by MOD)
(From 8 to 9 by ADJ)
(From 9 to 4 by CNJ)
(From 9 to 1 by CNJ)
(From 9 to 2 by CNJ)
(From 9 to 3 by CNJ)
(From 9 to 6 by CNJ)))
> > > (recognize-next
9
'()
'((Initial (1))
(Final (9))
(From 1 to 1 by NP)
(From 1 to 2 by DET)
(From 1 to 3 by NP)
(From 2 to 3 by N)
(From 3 to 4 by BV)
(From 4 to 5 by ADV)
(From 4 to 5 by |#|)
(From 5 to 6 by DET)
(From 5 to 7 by DET)
(From 5 to 8 by |#|)
(From 6 to 7 by ADJ)
(From 6 to 6 by MOD)
(From 7 to 9 by N)
(From 8 to 8 by MOD)
(From 8 to 9 by ADJ)
(From 9 to 4 by CNJ)
(From 9 to 1 by CNJ)
(From 9 to 2 by CNJ)
(From 9 to 3 by CNJ)
(From 9 to 6 by CNJ)))
#t
をそれはネットワーク上にない、トレースは奇妙な動作をしています。たとえば、私が電話するとき:
(recognize english-1 '(not defined on the network))
出力は '(正しい)です。しかし、私はより詳細な情報を期待していました。
'()
私はコマンドをどこに置くべきか疑問に思っていました。私は認識 - 次の定義の終わりの直前にそれを置く。これが適切な場所であるかどうかは不明です。
ありがとう!それは正常に働いた。私が理解できないもう一つのことがあります。キムが私の略語の定義にあるので、なぜ呼び出す(英語-1 '(キム)を認識すると)空を返すのですか? –
@fallowzito私は気づいていないと私は認めています。私はあなたのコードを実際には読んでいませんでした。ちょうど 'ラケット/トレース 'に関連する部分です。 ;)私はあなたがそれを理解することができると確信しています:私は彼らが間違っているのを把握するためにREPLであなたの機能を試してみるでしょう。また、 'debug'パッケージを見てみましょう。これは、プログラムのデバッグに役立ついくつかの便利なフォームを提供します。 –