Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 6.38 KB | None | 0 0
  1. (load "prekode3a.scm")
  2.  
  3.  
  4. ;;en liten abstraksjonsbarriere for å gjøre koden litt lettere å lese
  5. (define fall-back 10000);;forenkling for nå
  6.  
  7. (define (word-root tree)
  8.   (car(cdr tree)))
  9.  
  10. (define (pair-root tree)
  11.   (car(cdr(cdr tree))))
  12.  
  13. (define (left branch)
  14.   (car branch))
  15.  
  16. (define (right branch)
  17.   (cadr branch))
  18.  
  19. (define (word-pair node)
  20.   (car(cdr(cdr node))))
  21.  
  22. (define (word-pair-freq node)
  23.   (car(cdr(cdr(cdr node)))))
  24.  
  25. (define (deeper-than-root? branch)
  26.   (if (string=? (car(word-pair branch)) "root")
  27.       #f
  28.       #t))
  29.  
  30. (define (make-lm) ;; lager et tree som egentlig er to forskjellige binærtrær, podet sammen på toppen. et for par, og et for ord. Hodet består av et label '*head* og en peker til hver rot. ('*word-root* og '*pair-root*)
  31.   (list
  32.    '*head*
  33.    (list '*word-root* '() (cons "root" "word") 0) ;;roten består av et label, en peker til subtreet, et cons-par(redundant) og et tall (redundant)
  34.    (list '*pair-root* '() (cons "root" "pair") 0))) ;;samme som over
  35.  
  36. (define tree (make-lm))
  37.  
  38. ;;sjekker om to noder har identiske cons-par ved å sjekke (car node1) mot (car node2) og (cdr node1) mode (cdr node2)
  39. (define (node=? n1 n2)
  40.   (if (or(null? n1)(null? n2))
  41.       '()
  42.       (if (and (string=? (car(word-pair n1))(car(word-pair n2)))
  43.                (string=? (cdr(word-pair n1))(cdr(word-pair n2))))
  44.           #t
  45.           #f)))
  46. ;;sjekker om n1 er mindre enn node2  
  47. (define (node<? n1 n2)
  48.   (if (or (null? n1)(null? n2))
  49.       '()
  50.       (cond ((string=? (car(word-pair n1))(car(word-pair n2)))
  51.              (string<? (cdr(word-pair n1))(cdr(word-pair n2))))
  52.             (else (string<? (car(word-pair n1))(car(word-pair n2)))))))
  53.  
  54. ;;wrapper-funksjon for å finne frekvensen til et bigram
  55. (define (lm-lookup-bigram btree w1 w2)
  56.   (if (not(null? (lm-lookup (list '() '() (cons w1 w2) 0) (right(pair-root btree)))))
  57.       (word-pair-freq (lm-lookup (list '() '() (cons w1 w2) 0) (right(pair-root btree))))
  58.       (/ 1 fall-back)))
  59.  
  60. ;;wrapper for å finne ordfrekvens
  61. (define (lm-lookup-word btree w1)
  62.   (if (not(null? (lm-lookup (list '() '() (cons w1 "") 0) (right(word-root btree)))))
  63.       (word-pair-freq (lm-lookup (list '() '() (cons w1 "") 0) (right(word-root btree))))))
  64.  
  65.  
  66. ;;leter i treet, starter på node branch, og leter etter node
  67. (define (lm-lookup node branch)
  68.   (if (or (null? node)(null? branch)(and (not(deeper-than-root? branch))(null? (cadr branch))))
  69.       '()
  70.       (if (node=? node branch)
  71.           branch
  72.           (if (and(node<? node branch)(deeper-than-root? branch))
  73.               (lm-lookup node (car branch))
  74.               (lm-lookup node (cadr branch))))))
  75.  
  76. ;;Denne metoden er ansvarlig for å bygge binærtreet fra topp og ned
  77. (define (lm-record-bigram w1 w2 tree)
  78.   (define (func node branch)
  79.    
  80.     (define (insert node branch)
  81.       (if (and (string=? (car(word-pair branch)) "root")(null? (cadr branch))) ;; sjekker om branch er root(og bare root)
  82.           (set-car! (cdr branch) node) ;;hvis branch er root, setter vi inn noden med en gang
  83.           (if (and(node<? node branch)(deeper-than-root? branch))
  84.               (if (null? (left branch))
  85.                   (set-car! branch node)
  86.                   (insert node (left branch)))
  87.               (if (null? (right branch))
  88.                   (set-car! (cdr branch) node)
  89.                   (insert node (right branch))))))
  90.              
  91.              
  92.     (let ((record (lm-lookup node branch)))
  93.       (if (not (null? record))
  94.           (set-car! (cdr(cdr(cdr record))) (+ (word-pair-freq record) 1)) ;;increasing freq by one
  95.           (insert node branch))))
  96.  
  97.   (func (list '() '() (cons w1 w2) 1)(pair-root tree)) ;;legger til ordparet
  98.   (func (list '() '() (cons w1 "") 1)(word-root tree)));; legger til enkeltordet w1 i egen del av binærtreet
  99.  
  100.  
  101. ;;Signaturen er litt anderledes enn oppgaven for letter å kombinere filer i en og samme språkmodell
  102. (define (lm-train! tree table)
  103.   (define (table-rec table)
  104.     (define (list-rec wlist)
  105.       (if (string=? (car wlist)"</s>")
  106.           '()
  107.           (begin (lm-record-bigram (car wlist) (cadr wlist) tree) (list-rec (cdr wlist)))))
  108.     (if (null? table)
  109.         '()
  110.         (list-rec (car table)))
  111.     (if (null? (cdr table))
  112.         '()
  113.         (table-rec (cdr table))))
  114.   (table-rec table))
  115.  
  116. ;;estimate
  117. (define (lm-estimate! lm)
  118.   (define (recur branch)
  119.     (set-car! (cdr(cdr(cdr branch))) (/    ;;deler frekvensene til w1 på frekvensen til w2, og lagrer resultatet der ordparets frekvens lå.
  120.                                       (word-pair-freq branch)
  121.                                       (lm-lookup-word lm (car(word-pair branch)))))
  122.     (if (not(null? (left branch)))
  123.         (recur (left branch))
  124.         '())
  125.     (if (not(null? (right branch)))
  126.         (recur (right branch))
  127.         '()))
  128.  
  129.   (recur (right (pair-root lm)))) ;;sender med første element i par-treet
  130.  
  131. (define (lm-score-table lm table) ;;tar inn en korpusfil, og sender setninger til lm-score
  132.   (if (null? table)
  133.       '()
  134.       (lm-score lm (car table)))
  135.   (if (null? (cdr table))
  136.       '()
  137.       (lm-score-table lm (cdr table))))
  138.  
  139. ;;finner sannsynligheten for hver setning i en korpusfil ved å sende en og en setning til lm-score
  140. (define (lm-table-score lm table)
  141.   (if (null? table)
  142.       '()
  143.       (cons
  144.        (lm-score lm (car table))
  145.        (lm-table-score lm (cdr table)))))
  146.  
  147. ;;finner total sannsynlighet til en setning
  148. (define (lm-score lm s)
  149.   (define (recur wlist)
  150.     (if (string=? (car wlist) "</s>")
  151.         1
  152.         (*
  153.          (lm-lookup-bigram lm (car wlist) (cadr wlist))
  154.          (recur (cdr wlist)))))
  155.   (recur s))
  156.  
  157. (define test (read-corpus "test.txt"))
  158. (define wsj (read-corpus "wsj.txt"))
  159.    
  160. (lm-train! tree test)
  161.  
  162. (lm-estimate! tree)
  163.  
  164. (lm-table-score tree test)
  165. test
  166. ;;2d
  167. ;;Trent med kun test.txt virker som at metoden synes at setning #19 er mest sannsynlig: "<s>" "Fundamentally" "illegal," "unfair" "evidence" "was" "dismissed" "by" "it," "as" "the" "case" "was" "approached" "by" "the" "court." "</s>")
  168.  
  169. ;;2e
  170. ;;(define 2e-tre (make-lm))
  171. ;;(lm-train! 2e-tre test)
  172. ;;(lm-train! 2e-tre wsj)
  173. ;;(lm-estimate! 2e-tre)
  174. ;;(lm-table-score 2e-tre test)
  175.  
  176. ;; trent med både test.txt og wsj.txt synes metoden at setning #14 er mest sannsynlig: "<s>" "It" "dismissed" "fundamentally" "illegal," "unfair" "evidence," "as" "the" "case" "was" "approached" "by" "the" "court." "</s>")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement