University stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

oppgave.scm 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. (load "prekode3a.scm")
  2. ;;;;;;;
  3. ;; 1 ;;
  4. ;;;;;;;
  5. ;; A
  6. (define (list-to-stream lst)
  7. (if (null? lst)
  8. '()
  9. (cons-stream (car lst) (list-to-stream (cdr lst)))))
  10. (define (stream-to-list stream . n)
  11. (cond ((stream-null? stream)
  12. the-empty-stream)
  13. ((null? n)
  14. (cons (stream-car stream) (stream-to-list (stream-cdr stream))))
  15. ((= (car n) 0)
  16. the-empty-stream)
  17. (else (cons (stream-car stream)
  18. (stream-to-list (stream-cdr stream) (- (car n) 1))))))
  19. ;; B
  20. (define (stream-map proc . argstreams)
  21. (define (streams-done? streams)
  22. (cond ((null? streams) #f)
  23. ((stream-null? (car streams)) #t)
  24. (else (streams-done? (cdr streams)))))
  25. (if (streams-done? argstreams)
  26. the-empty-stream
  27. (cons-stream
  28. (apply proc
  29. (map stream-car argstreams))
  30. (apply stream-map
  31. (cons proc (map stream-cdr argstreams))))))
  32. ;; C
  33. ;; En stream kan være uendelig lang. Hvis vi for eksempel prøver å fjerne
  34. ;; duplikater fra nats-strømmen, strømmen med alle naturlige tall, vil vi
  35. ;; aldri bli ferdige med å sjekke om det første elementet forekommer flere
  36. ;; steder i strømmen.
  37. ;; D
  38. ;; (stream-ref x 5):
  39. ;; 0
  40. ;; 1
  41. ;; 2
  42. ;; 3
  43. ;; 4
  44. ;; 5
  45. ;; 5
  46. ;; Det viser alle tallene fra 0 til 5 med show (fordi strømmen er laget med
  47. ;; (stream-map show ...)), og så viser det siste tallet (5) fordi det er det
  48. ;; uttrykket returnerer (fordi 5 er verdien til posisjon 5 i strømmen).
  49. ;; (stream-ref x 7):
  50. ;; 6
  51. ;; 7
  52. ;; 7
  53. ;; Strømen x har allerede gått igjennom tallene 0 til 5, så den viser bare 6 og 7.
  54. ;; Det siste tallet er igjen her to ganger fordi uttrykket returnerer 7.
  55. ;;;;;;;
  56. ;; 2 ;;
  57. ;;;;;;;
  58. ;; Make table (implemented as a binary tree).
  59. ;; Arguments:
  60. ;; eq: Predicate for equality.
  61. ;; lt: Predicate for less than.
  62. (define (make-table eq lt)
  63. ;; Node for the binary tree table.
  64. ;; Arguments:
  65. ;; k: Key
  66. ;; v: Value
  67. ;; l: Left child
  68. ;; r: Right child
  69. (define (make-node k v l r)
  70. (list k v l r))
  71. (define (node-k n) (car n))
  72. (define (node-v n) (cadr n))
  73. (define (node-l n) (caddr n))
  74. (define (node-r n) (cadddr n))
  75. (define (node-k! n key) (set-car! n key))
  76. (define (node-v! n val) (set-car! (cdr n) val))
  77. (define (node-l! n left) (set-car! (cddr n) left))
  78. (define (node-r! n right) (set-car! (cdddr n) right))
  79. (define (node-lookup n k)
  80. (cond ((null? n) #f)
  81. ((null? (node-k n)) #f)
  82. ((eq k (node-k n)) (node-v n))
  83. ((lt k (node-k n)) (node-lookup (node-l n) k))
  84. (else (node-lookup (node-r n) k))))
  85. (define (node-insert! n k v)
  86. (cond ((null? (node-k n))
  87. (node-k! n k)
  88. (node-v! n v))
  89. ((eq k (node-k n))
  90. (node-v! n v))
  91. ((lt k (node-k n))
  92. (if (null? (node-l n))
  93. (node-l! n (make-node k v '() '()))
  94. (node-insert! (node-l n) k v)))
  95. (else
  96. (if (null? (node-r n))
  97. (node-r! n (make-node k v '() '()))
  98. (node-insert! (node-r n) k v)))))
  99. (define (node-iter n proc)
  100. (if (not (null? (node-v n)))
  101. (proc (node-k n) (node-v n)))
  102. (if (not (null? (node-l n)))
  103. (node-iter (node-l n) proc))
  104. (if (not (null? (node-r n)))
  105. (node-iter (node-r n) proc)))
  106. ;; I would've used (make-node) here, but would've had to complicate
  107. ;; everything, as you can't use the function to define a variable in
  108. ;; the same function body.
  109. (define root (list '() '() '() '()))
  110. (define (lookup k)
  111. (node-lookup root k))
  112. (define (insert! k v)
  113. (node-insert! root k v))
  114. (define (iter proc)
  115. (node-iter root proc))
  116. (lambda (symbol . args)
  117. (cond ((eq? symbol 'lookup) (apply lookup args))
  118. ((eq? symbol 'insert!) (apply insert! args))
  119. ((eq? symbol 'iter) (apply iter args))
  120. (else (error "Invalid symbol")))))
  121. (define (table-lookup tbl k)
  122. (tbl 'lookup k))
  123. (define (table-insert! tbl k v)
  124. (tbl 'insert! k v))
  125. (define (table-iter tbl proc)
  126. (tbl 'iter proc))
  127. (define (make-string-table) (make-table string=? string<?))
  128. ;; A
  129. (define (make-lm)
  130. (define tbl (make-string-table))
  131. (define total 0)
  132. (define (lookup s1 s2)
  133. (let ((sub (table-lookup tbl s1)))
  134. (if (eq? sub #f)
  135. 0
  136. (let ((freq (table-lookup sub s2)))
  137. (if (null? freq)
  138. 0
  139. freq)))))
  140. (define (record-create-sub! s1 s2)
  141. (let ((sub (make-string-table)))
  142. (table-insert! sub s2 1)
  143. (table-insert! tbl s1 sub)
  144. (set! total (+ total 1))))
  145. (define (record! s1 s2)
  146. (if (eq? (table-lookup tbl s1) #f)
  147. (record-create-sub! s1 s2)
  148. (let ((sub (table-lookup tbl s1)))
  149. (if (table-lookup sub s2)
  150. (table-insert! sub s2 (+ (table-lookup sub s2) 1))
  151. (table-insert! sub s2 1))
  152. (set! total (+ total 1)))))
  153. (define (count s1)
  154. (let ((sub (table-lookup tbl s1)))
  155. (define count 0)
  156. (define (iter key val)
  157. (set! count (+ count val)))
  158. (if (eq? sub #f)
  159. 0
  160. (begin
  161. (table-iter sub iter)
  162. count))))
  163. (lambda (symbol . args)
  164. (cond ((eq? symbol 'lookup) (apply lookup args))
  165. ((eq? symbol 'record!) (apply record! args))
  166. ((eq? symbol 'total) total)
  167. ((eq? symbol 'count) (apply count args))
  168. (else (error "Invalid symbol")))))
  169. (define (lm-lookup-bigram lm s1 s2)
  170. (lm 'lookup s1 s2))
  171. (define (lm-record-bigram! lm s1 s2)
  172. (lm 'record! s1 s2))
  173. ;; For C
  174. (define (lm-total lm)
  175. (lm 'total))
  176. (define (lm-count lm s1)
  177. (lm 'count s1))
  178. ;; B
  179. (define (lm-train! lm sentences)
  180. (define (learn-sentence! lm sentence)
  181. (cond ((null? sentence)
  182. '())
  183. ((string=? (car sentence) "</s>")
  184. '())
  185. (else
  186. (lm-record-bigram! lm (car sentence) (cadr sentence))
  187. (learn-sentence! lm (cdr sentence)))))
  188. (cond ((null? sentences)
  189. '())
  190. (else
  191. (learn-sentence! lm (car sentences))
  192. (lm-train! lm (cdr sentences)))))
  193. ;; C
  194. ;; Det å gjøre at lm holder styr på antall par gjør denne delen unødvendig...
  195. ;; Jeg trenger bare en funksjon som regner ut sannsynligheten til et par
  196. ;; basert på frekvensen og antall par.
  197. (define (lm-prob lm s1 s2)
  198. (let ((total (lm-total lm))
  199. (count (lm-count lm s1))
  200. (freq (lm-lookup-bigram lm s1 s2)))
  201. (cond ((eq? freq #f) (/ 1 total))
  202. ((= freq 0) (/ 1 total))
  203. (else (/ freq count)))))
  204. ;; D
  205. (define (lm-score lm sentence)
  206. (if (string=? (car sentence) "</s>") 1
  207. (* (lm-prob lm (car sentence) (cadr sentence))
  208. (lm-score lm (cdr sentence)))))
  209. ;; Find most likely sentence
  210. (let ((lm (make-lm)))
  211. (lm-train! lm (read-corpus "brown.txt"))
  212. (define pairs (map (lambda (sentence)
  213. (cons sentence (lm-score lm sentence)))
  214. (read-corpus "test.txt")))
  215. (define most-likely (car pairs))
  216. (define (iter pairs)
  217. (cond ((null? pairs) '())
  218. (else
  219. (if (> (cdr (car pairs)) (cdr most-likely))
  220. (set! most-likely (car pairs)))
  221. (iter (cdr pairs)))))
  222. (iter (cdr pairs))
  223. (display "Most likely sentence, according to brown.txt:")
  224. (newline)
  225. (display (car most-likely))
  226. (newline))
  227. ;; Den mest sannsynlige setningen, ifølge brown.txt:
  228. ;; It dismissed unfair, fundamentally illegal evidence, as the court approached the case.
  229. ;; E
  230. ;; Alle setningene er veldig usannsynlige, fordi sannsynligheten til alle
  231. ;; parene ganges sammen, og fordi for eksempel "As the" og "as the" telles som
  232. ;; forskjellige par (noe som er meningen ifølge piazza).
  233. ;; Vi ser likevel at en del av setningene blir mer annsynlige etter å ha lest
  234. ;; inn brown.txt.
  235. (let ((lm (make-lm)))
  236. ;; Only wsj
  237. (lm-train! lm (read-corpus "wsj.txt"))
  238. (display "Only wsj:")
  239. (newline)
  240. (define (iter lm sentences)
  241. (cond ((null? sentences) '())
  242. (else
  243. (display (car sentences))
  244. (display ": ")
  245. (display (lm-score lm (car sentences)))
  246. (newline)
  247. (iter lm (cdr sentences)))))
  248. (iter lm (read-corpus "test.txt"))
  249. ;; wsj + brown
  250. (lm-train! lm (read-corpus "brown.txt"))
  251. (display "wsj + brown:")
  252. (newline)
  253. (define (iter2 lm sentences)
  254. (cond ((null? sentences) '())
  255. (else
  256. (display (car sentences))
  257. (display ": ")
  258. (display (lm-score lm (car sentences)))
  259. (newline)
  260. (iter2 lm (cdr sentences)))))
  261. (iter2 lm (read-corpus "test.txt")))