University stuff.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

oppgave.scm 8.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  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. ;; Tabell fra 2b
  59. ;; (define (make-table)
  60. ;; (list '*table*))
  61. ;;
  62. ;; (define (table-lookup key table)
  63. ;; (let ((record (assoc key (cdr table))))
  64. ;; (and record (cdr record))))
  65. ;;
  66. ;; (define (table-insert! key value table)
  67. ;; (let ((record (assoc key (cdr table))))
  68. ;; (if record
  69. ;; (set-cdr! record value)
  70. ;; (set-cdr! table
  71. ;; (cons (cons key value) (cdr table))))))
  72. ;; Node for the binary tree table.
  73. ;; Arguments:
  74. ;; k: Key
  75. ;; v: Value
  76. ;; l: Left child
  77. ;; r: Right child
  78. ;; Make table (implemented as a binary tree).
  79. ;; Arguments:
  80. ;; eq: Predicate for equality.
  81. ;; lt: Predicate for less than.
  82. (define (make-table eq lt)
  83. (define (make-node k v l r)
  84. (list k v l r))
  85. (define (node-k n) (car n))
  86. (define (node-v n) (cadr n))
  87. (define (node-l n) (caddr n))
  88. (define (node-r n) (cadddr n))
  89. (define (node-k! n key) (set-car! n key))
  90. (define (node-v! n val) (set-car! (cdr n) val))
  91. (define (node-l! n left) (set-car! (cddr n) left))
  92. (define (node-r! n right) (set-car! (cdddr n) right))
  93. (define (node-lookup n k)
  94. (cond ((null? n) #f)
  95. ((null? (node-k n)) #f)
  96. ((eq k (node-k n)) (node-v n))
  97. ((lt k (node-k n)) (node-lookup (node-l n) k))
  98. (else (node-lookup (node-r n) k))))
  99. (define (node-insert! n k v)
  100. (cond ((null? (node-k n))
  101. (node-k! n k)
  102. (node-v! n v))
  103. ((eq k (node-k n))
  104. (node-v! n v))
  105. ((lt k (node-k n))
  106. (if (null? (node-l n))
  107. (node-l! n (make-node k v '() '()))
  108. (node-insert! (node-l n) k v)))
  109. (else
  110. (if (null? (node-r n))
  111. (node-r! n (make-node k v '() '()))
  112. (node-insert! (node-r n) k v)))))
  113. (define (node-iter n proc)
  114. (if (not (null? (node-v n)))
  115. (proc (node-k n) (node-v n)))
  116. (if (not (null? (node-l n)))
  117. (node-iter (node-l n) proc))
  118. (if (not (null? (node-r n)))
  119. (node-iter (node-r n) proc)))
  120. ;; I would've used (make-node) here, but would've had to complicate
  121. ;; everything, as you can't use the function to define a variable in
  122. ;; the same function body.
  123. (define root (list '() '() '() '()))
  124. (define (lookup k)
  125. (node-lookup root k))
  126. (define (insert! k v)
  127. (node-insert! root k v))
  128. (define (iter proc)
  129. (node-iter root proc))
  130. (lambda (symbol . args)
  131. (cond ((eq? symbol 'lookup) (apply lookup args))
  132. ((eq? symbol 'insert!) (apply insert! args))
  133. ((eq? symbol 'iter) (apply iter args))
  134. (else (error "Invalid symbol")))))
  135. (define (table-lookup tbl k)
  136. (tbl 'lookup k))
  137. (define (table-insert! tbl k v)
  138. (tbl 'insert! k v))
  139. (define (table-iter tbl proc)
  140. (tbl 'iter proc))
  141. (define (make-string-table) (make-table string=? string<?))
  142. ;; A
  143. (define (make-lm)
  144. (define tbl (make-string-table))
  145. (define total 0)
  146. (define (lookup s1 s2)
  147. (let ((sub (table-lookup tbl s1)))
  148. (if (eq? sub #f)
  149. 0
  150. (let ((freq (table-lookup sub s2)))
  151. (if (null? freq)
  152. 0
  153. freq)))))
  154. (define (record-create-sub! s1 s2)
  155. (let ((sub (make-string-table)))
  156. (table-insert! sub s2 1)
  157. (table-insert! tbl s1 sub)
  158. (set! total (+ total 1))))
  159. (define (record! s1 s2)
  160. (if (eq? (table-lookup tbl s1) #f)
  161. (record-create-sub! s1 s2)
  162. (let ((sub (table-lookup tbl s1)))
  163. (if (table-lookup sub s2)
  164. (table-insert! sub s2 (+ (table-lookup sub s2) 1))
  165. (table-insert! sub s2 1))
  166. (set! total (+ total 1)))))
  167. (define (count s1)
  168. (let ((sub (table-lookup tbl s1)))
  169. (define count 0)
  170. (define (iter key val)
  171. (set! count (+ count val)))
  172. (if (eq? sub #f)
  173. 0
  174. (begin
  175. (table-iter sub iter)
  176. count))))
  177. (lambda (symbol . args)
  178. (cond ((eq? symbol 'lookup) (apply lookup args))
  179. ((eq? symbol 'record!) (apply record! args))
  180. ((eq? symbol 'total) total)
  181. ((eq? symbol 'count) (apply count args))
  182. (else (error "Invalid symbol")))))
  183. (define (lm-lookup-bigram lm s1 s2)
  184. (lm 'lookup s1 s2))
  185. (define (lm-record-bigram! lm s1 s2)
  186. (lm 'record! s1 s2))
  187. ;; For C
  188. (define (lm-total lm)
  189. (lm 'total))
  190. (define (lm-count lm s1)
  191. (lm 'count s1))
  192. ;; B
  193. (define (lm-train! lm sentences)
  194. (define (learn-sentence! lm sentence)
  195. (cond ((null? sentence)
  196. '())
  197. ((string=? (car sentence) "</s>")
  198. '())
  199. (else
  200. (lm-record-bigram! lm (car sentence) (cadr sentence))
  201. (learn-sentence! lm (cdr sentence)))))
  202. (cond ((null? sentences)
  203. '())
  204. (else
  205. (learn-sentence! lm (car sentences))
  206. (lm-train! lm (cdr sentences)))))
  207. ;; C
  208. ;; Det å gjøre at lm holder styr på antall par gjør denne delen unødvendig...
  209. ;; Jeg trenger bare en funksjon som regner ut sannsynligheten til et par
  210. ;; basert på frekvensen og antall par.
  211. (define (lm-prob lm s1 s2)
  212. (let ((total (lm-total lm))
  213. (count (lm-count lm s1))
  214. (freq (lm-lookup-bigram lm s1 s2)))
  215. (cond ((eq? freq #f) (/ 1 total))
  216. ((= freq 0) (/ 1 total))
  217. (else (/ freq count)))))
  218. ;; D
  219. (define (lm-score lm sentence)
  220. (if (string=? (car sentence) "</s>") 1
  221. (* (lm-prob lm (car sentence) (cadr sentence))
  222. (lm-score lm (cdr sentence)))))
  223. ;; Find most likely sentence
  224. (let ((lm (make-lm)))
  225. (lm-train! lm (read-corpus "brown.txt"))
  226. (define pairs (map (lambda (sentence)
  227. (cons sentence (lm-score lm sentence)))
  228. (read-corpus "test.txt")))
  229. (define most-likely (car pairs))
  230. (define (iter pairs)
  231. (cond ((null? pairs) '())
  232. (else
  233. (if (> (cdr (car pairs)) (cdr most-likely))
  234. (set! most-likely (car pairs)))
  235. (iter (cdr pairs)))))
  236. (iter (cdr pairs))
  237. (display "Most likely sentence, according to brown.txt:")
  238. (newline)
  239. (display (car most-likely))
  240. (newline))
  241. ;; Den mest sannsynlige setningen, ifølge brown.txt:
  242. ;; It dismissed unfair, fundamentally illegal evidence, as the court approached the case.
  243. ;; E
  244. ;; Alle setningene er veldig usannsynlige, fordi sannsynligheten til alle
  245. ;; parene ganges sammen, og fordi for eksempel "As the" og "as the" telles som
  246. ;; forskjellige par (noe som er meningen ifølge piazza).
  247. ;; Vi ser likevel at en del av setningene blir mer annsynlige etter å ha lest
  248. ;; inn brown.txt.
  249. (let ((lm (make-lm)))
  250. ;; Only wsj
  251. (lm-train! lm (read-corpus "wsj.txt"))
  252. (display "Only wsj:")
  253. (newline)
  254. (define (iter lm sentences)
  255. (cond ((null? sentences) '())
  256. (else
  257. (display (car sentences))
  258. (display ": ")
  259. (display (lm-score lm (car sentences)))
  260. (newline)
  261. (iter lm (cdr sentences)))))
  262. (iter lm (read-corpus "test.txt"))
  263. ;; wsj + brown
  264. (lm-train! lm (read-corpus "brown.txt"))
  265. (display "wsj + brown:")
  266. (newline)
  267. (define (iter2 lm sentences)
  268. (cond ((null? sentences) '())
  269. (else
  270. (display (car sentences))
  271. (display ": ")
  272. (display (lm-score lm (car sentences)))
  273. (newline)
  274. (iter2 lm (cdr sentences)))))
  275. (iter2 lm (read-corpus "test.txt"))
  276. (lm-lookup-bigram lm "illegal," "unfair"))