用lisp来让计算机学会写作

【简单介绍下Lisp的学习历程】 🌊Lisp 是一种历史悠久的编程语言,由约翰·麦卡锡(John McCarthy)在 1958 年开发,以其前瞻性的功能在计算机科学界走向传奇。Lisp 语言家族包含了多种方言,其中最著名的包括 Common Lisp 和 Scheme。 阅读详情

        大部分的代码、思路参考了《Ansi Common Lisp》P138~P141。

问题:给一篇英文文本,如何让计算机依据此文本而生成随机但可读的文本。如:

|Venture|

  The National Venture Capital Association estimates that wealth associated with a deal a big spending by regulations that will spend one another's main reason these projects . 

这是计算机学习了Paul Graham的一些文章后生成的随机文本。它根据Venture这个单词向两边延伸成一个句子。令人惊喜的是,文本常常是可读的。


  算法:记录每个单词后面出现的单词以及出现的次数,如I leave在原文中出现了5次,I want出现了3次,除此之外,其它地方没有出现过I,所以在生成随机文章的时候,当遇到I,有5/8的概率选择leave为下一个单词。假如选择了leave的话,则看看leave后面出现过哪些单词,重复以上过程。


现用lisp来解决问题。

lisp里的符号类型,即symbol,可以很好记录各种字符串还有标点符号,所以采用它来记录。采用内附的hashtable来建立列表:

        (defparameter *words* (make-hash-table :size 10000))

那如何建立列表呢?

(let ((prev '|.|))
  (defun see (sym)
    (let ((pair (assoc sym (gethash prev *words*))))
      (if pair
	  (incf (cdr pair))
	  (push (cons sym 1) (gethash prev *words*))))
    (setf prev sym)))

以当前单词为keyword,以assoc-list关系列表为该keyword下的值。

        如I下有( (|leave| . 5) (|want| . 3) )。没有单词word的话,则push入(word . 1)。

        如何随机选一个词呢?

(defun random-word (word ht)
  (let* ((choices (gethash word ht))
	 (x (random (reduce #'+ choices :key #'cdr))))
    (dolist (pair choices)
      (decf x (cdr pair))
      (if (minusp x)
	  (return (car pair))))))

        这里巧妙用了reduce函数。


        现在再来思考,如何将给定一个词向两侧延伸成一句话呢?

1)先将文本反向,得到一个反向的列表,也即I leave,I want变成leave I,want I。

2)将hashtable反向,得到另外一个hashtable,以后一个单词为关键字,前面可能出现的单词及次数构成assoc-list。

3)碰运气,从一个标点开始延续文章,直到出现给定单词为止。

        我用了第二个方法:

(defparameter *r-words* (make-hash-table :size 10000))

(defun push-words (w1 w2 n)
  (push (cons w2 n) (gethash w1 *r-words*)))

(defun get-reversed-words ();a cat -> cat a
  (maphash #'(lambda (k lst)
	       (dolist (pair lst)
		 (push-words (car pair) k (cdr pair))))
	   *words*))

         遍历原来的hashtable,再把每一对单词先后换个位置插入另外一个hashtable。

给出双向延伸句子的自动生成文本代码:

(defparameter *words* (make-hash-table :size 10000))
(defconstant maxword 100)
(defparameter nwords 0)
(defconstant debug nil)
(let ((prev '|.|))
  (defun see (sym)
    (incf nwords)
    (let ((pair (assoc sym (gethash prev *words*))))
      (if pair
	  (incf (cdr pair))
	  (push (cons sym 1) (gethash prev *words*))))
    (setf prev sym)))

(defun check-punc (c);char to symbol
  (case c
    (#\. '|.|) (#\, '|,|)
    (#\; '|;|) (#\? '|?|)
    (#\: '|:|) (#\! '|!|)))

(defun read-text (pathname)
  (with-open-file (str pathname :direction :input)
    (let ((buf (make-string maxword))
	  (pos 0))
      (do ((c (read-char str nil 'eof)
	      (read-char str nil 'eof)))
	  ((eql c 'eof))
	(if (or (alpha-char-p c)
		(eql c #\'))
	    (progn
	      (setf (char buf pos) c)
	      (incf pos))
	    (progn
	      (unless (zerop pos)
		(see (intern (subseq buf 0 pos)))
		(setf pos 0))
	      (let ((punc (check-punc c)))
		(if punc
		    (see punc)))))))))

(defun print-ht (ht)
  (maphash #'(lambda (k v)
		(format t "~A ~A~%" k v))
	     ht))

(defparameter *r-words* (make-hash-table :size 10000))

(defun push-words (w1 w2 n)
  (push (cons w2 n) (gethash w1 *r-words*)))

(defun get-reversed-words ();a cat -> cat a
  (maphash #'(lambda (k lst)
	       (dolist (pair lst)
		 (push-words (car pair) k (cdr pair))))
	   *words*))

(defun print-a-word (word ht)
  (maphash #'(lambda (k lst)
	       (if (eql k word)
		   (format t "~A ~A~%" k lst)))
	   ht))

(if debug
    (print-a-word '|leave| *r-words*))

(defun punc-p (sym);symbol to char,nil when fails.
  (check-punc (char (symbol-name sym) 0)))

(defun random-word (word ht)
  (let* ((choices (gethash word ht))
	 (x (random (reduce #'+ choices :key #'cdr))))
    (dolist (pair choices)
      (decf x (cdr pair))
      (if (minusp x)
	  (return (car pair))))))

(defun gen-former (word str)
  (let ((last (random-word word *r-words*)))
    (if (not (punc-p last))
	(progn 
	  (gen-former last str)
	  (format str "~A " last)))))

(defun gen-latter (word str)
  (let ((next (random-word word *words*)))
    (format str "~A " next)
    (if (not (punc-p next))
        (gen-latter next str))))

;(gen-latter '|leave| t)

(defun get-a-word (ht);get a random word
  (let ((x (random nwords)))
    (maphash #'(lambda (k v)
		 (dolist (pair v)
		   (decf x (cdr pair))
		   (if (minusp x)
		       (return-from get-a-word (car pair)))))
	     ht)))
;(get-a-word *words*)
(defun gen-sentence (word str)
  (gen-former word str)
  (format str "~A " word)
  (gen-latter word str))

(defun test ()
  (setf nwords 0)
  (read-text "essay.txt")
  (get-reversed-words)
  (let ((word (get-a-word *words*)))
    (print word)
    (gen-sentence word t)))
(test)

     文本语料库、lisp源代码见: Here

【简单介绍Lisp的学习历程】 🌊Lisp 是一种历史悠久的编程语言,由约翰·麦卡锡(John McCarthy)在 1958 年开发,以其前瞻性的功能在计算机科学界走向传奇。Lisp 语言家族包含了多种方言,其中最著名的包括 Common Lisp 和 Scheme。 阅读详情

相关推荐

Ubuntu22.04中通过conda快速部署PyTorch开发环境(CPU/GPU双版本实战)

本文详细介绍了在Ubuntu22.04系统中,如何利用Conda高效部署PyTorch开发环境。文章分别提供了CPU与GPU双版本的实战教程,涵盖环境创建、镜像加速、版本匹配及深度验证等关键步骤,旨在帮助开发者快速搭建稳定、兼容的深度学习环境,从而专注于模型开发。

rose2的博客 556

lisp-push

* (defvar *mylist* (list 11 22 33)) *MYLIST** (push `222 *mylist*) (222 11 22 33)*

深未来技术 243

【MDC开发者课程】MDC功能软件-归控算法介绍

规控算法

博客标题不能为空我也没办法 1844

Lisp(歷史上拼寫為LISP),是具有悠久歷史的計算機編程語言家族,有獨特的完全用圓括號的前綴符號表示法

Lisp最初是為計算機程序創建的實用數學表示法,當時借鑒過阿隆佐·邱奇的lambda表示法。它很快成為人工智能研究中最受歡迎的編程語言。作為早期的高階編程語言之一,Lisp開創了計算機科學領域的許多概念,包括树结构、自動記憶體管理、动态类型、条件表达式、高階函數、遞迴、自主編譯器、讀取﹣求值﹣輸出循環(REPL)。"LISP"名稱源自「列表處理器」(英語:)的縮寫。列表是Lisp的主要數據結構之一,Lisp編程代碼也同樣由列表組成。

weixin_40191861的博客 2595

ZYNQ裸机LWIP双网口实现

文章目录前言一、LWIP双网口二、使用步骤1.部分说明2.部分代码总结 前言 一、LWIP双网口 由于项目需要多通讯口,查阅资料发现lwip支持多网口操作。于是,就开搞了。 二、使用步骤 1.部分说明 利用xemac_add函数在网卡链表中添加一个网卡,即使用netif块重复xemac_add操作。 先用轮询的方式实现双网口,后期修改为中断模式 2.部分代码 导入官方例程LWip echo server, 修改main函数,增加一个netif块 #if LWIP_IPV6==0 #if L..

weixin_35865280的博客 1万+

【水文学法总结】河道内生态流量计算方法(含MATLAB实现代码)

简介水文学法实现河道内生态流量计算

WW、forever的博客 5015

为啥commonlisp习惯用push nreverse

我想大概是因为列表是单向的,如果每次都在尾部追加元素,要么每次都遍历一遍列表,要么动态存储列表尾部的位置,对于小规模数据,列表的push nreverse的方式是可接受的。 转载于:ht...

chutui3058的博客 225

趋势跟踪策略

/ 绘制K线图的下跌部分,使用绿色标记 stickline(close>=open,high,close,1,1,colorgreen);end // 在图表上绘制当前趋势的图标,如果trend=1或-1 drawicon(trend=1,stopprice,10);end // 绘制K线图的上涨部分,使用红色标记 stickline(close>=open,high,close,1,1,colorred);

2401_84919512的博客 354

计算机程序的构造和解释//LISP概览

首先本课的提纲:三大主题:(1)黑盒抽象(black      box)(2)约定接口(convertional interfaces)(3)元语言抽象LISP概览黑盒抽象将一个过程封装起来,我们不需要知道盒子里面是怎么实现的,只需要输入然后得到输出就OK了,因此我们可以以此来建立更大的盒子。面向对象的编程,是很多的对象通过消息串联在一起的,然后还有“流”“元语言抽象”需要我们查询理解,明天会补上...

ChrisQin123的博客 390

XILINX RFSoC全面解析(五)—— Zynq UItrascale+ RF Data Converter IP核详解

这期我们来看看RFSoC独有的IP核——Zynq UItrascale+ RF Data Converter如何使用。 我使用的VIVADO版本是2018.3,这个是最低版本,要开发RFSoC,VIVADO版本必须不低于2018.3。 另外电脑配置也需要很高,64位,8核@3.4GHz CPU,16GB内存,固态硬盘基本就是低配,跑起来很勉强。建议有条件的朋友使用工作站或者服务器。 首先在VIVADO中新建一个工程,因为我使用的是xilinx官方的开发板,所以可以直接设定选board就行。 在I

1万+

三极管电平转换电路

摘要:本文介绍了三种基于三极管的电平转换电路方案。第一种采用双NPN三极管实现3.3V转5V反相电平转换;第二种使用单NPN三极管完成5V转3.3V同相转换;第三种利用单PNP三极管实现3.3V转5V同相转换。各方案均通过三极管的开关特性配合电阻网络实现电压域适配,具有结构简单、成本低的优点,适用于不同逻辑电平设备(如MCU与外设)间的信号兼容传输。文中详细分析了各电路的工作原理、元件作用和特性,并通过Multisim仿真验证了其功能有效性。

XU157303764的博客 1855

Lisp入门

Lisp语言最初是由美国的 John McCarthy 在 1958 年提出来的,是最早的计算机语言之一。

Talk is cheap,show me the code. 4331

在 MATLAB/Simulink 中构建一个固定地面站天线指向控制系统的完整仿真模型

在卫星通信系统中,地面站天线负责与在轨卫星建立高增益、高稳定性的通信链路。对于固定地面站(如卫星测控站、深空站、VSAT主站),天线必须具备高精度指向能力,以确保波束始终对准卫星。然而,卫星(尤其是低轨卫星)在天空中快速移动,地面站天线必须实时跟踪其轨迹。此外,环境扰动(风载、热变形、机械误差)也会导致指向偏差。因此,设计一个高精度、高鲁棒性的天线指向控制系统(Antenna Pointing Control System)至关重要。本文将手把手教你如何在中构建一个固定地面站天线指向控制系统。

amy_mhd的博客 133

[转载]我眼中的Common Lisp

原文链接:我眼中的Common Lisp 第一次遇到Lisp这个名字,也许是在大一上计算机科学导论的时候,从书上介绍编程语言的那一章中看到的。那时候记得是在纠结过程式语言与函数式语言的区别,当时总觉得C语言也是函数式的,因为C语言也是有一个个的函数组成的,殊不知道编程语言的范式并不是以这么简单的方式进行区分的。因为好奇,当时还对着书上描述Lisp的短短一段文字看了一会儿,心里很好奇,

u011409389的专栏 1227

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Clojure与Lisp

Clojure与Lisp "Lisp 不是一门语言,它是一种构建素材。" (艾伦·凯) "任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。"(格林斯潘第十定律(Greenspun's Tenth Rule)) Clojure是一门Li...

AI天才研究院 8864

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

很想学Lisp

今天看了Paul Graham的一篇文章BEATING THE AVERAGES , 其中有一句话:"the truly serious hacker should consider learning Lisp"我原来在看人工智能时,学了一下,结果没学会lisp也没有懂多少人工智能的东西。不过对lisp代码里满屏的括号还是留下很深的印象。Lisp是由John McCarthcy(计算机领域诸神之一)发明的函数式程序语言,后来成为人工智能领域的流行编程语言。所以这样的语言肯定还是值得去学习一下的。不过

opencv和机器视觉的专栏 1387

python perl lisp_C,C++,Lisp,Java,Perl,Python

(译注:圣经记载:在远古的时候,人类都使用一种语言,全世界的人决定一起造一座通天的塔,就是巴别塔,后来被上帝知道了,上帝就让人们使用不同的语言,这个塔就没能造起来。 巴别塔不建自毁,与其说上帝的分化将人类的语言复杂化,不如说是人类自身心灵和谐不再的分崩离析。之所以后来有了翻译,不仅是为了加强人类之间的交流,更寄达了一种愿望,希望能以此消除人际的隔阂,获求来自心灵的和谐及慰藉。真正的译者,把握血脉,...

weixin_39664746的博客 302

在AI时代,用Lisp为自己保留一片思想的自由之地

在AI时代,作者选择回归Lisp语言,视其为思想的自由之地。从Emacs到Chez Scheme,作者发现Lisp不仅是工具,更是一种思维方式——程序可以是递归的诗,数据与代码可以互换。面对AI生成代码的潮流,作者坚持用Lisp构建自己的工具系统,拒绝被模板化思维驯化。这是一场重新学习思考的旅程,旨在保持人类独特的直觉与创造力。作者邀请同样感受到Lisp独特魅力的人,共同探索这个极简而深邃的编程世界,用代码真实地表达自我。

Winter的专栏 347

lisp scheme 果壳_几个免费的Scheme(Lisp)解释器

Lisp 是一个古老的函数式编程语言,Scheme则起源于MIT的一种Lisp方言。当前编程语言的一些特性,如尾递归、匿名函数、动态改变代码的功能等等,不少是受到了Lisp的启发。这里介绍几个能在Windows下使用的免费Scheme语言或Lisp语言的环境。DrScheme。这个是我一直在用的Scheme解释器,界面设计得既漂亮又方便。调试、括号匹配功能我也相当喜欢。而且带有大量的文档资料,如果...

weixin_42501161的博客 288

李继刚Lisp提示词灵感之源:压缩推动进步

前面在文章《 访谈李继刚:从哲学层面与大模型对话 》中提到,继刚总结去年写提示词的核心理念是“清晰表达”,而今年则是“压缩表达”,既而才有火爆全网的Lisp风格提示词呈现给大家。 那么,为什么是压缩,或者说压缩表达的灵感来源是什么?从接下来的这篇文章中,我们可以对Lisp风格的提示词来源略窥一二。 这篇⽂章的作者是德国计算机科学家尤尔根·施密德胡⻉尔,他在⼈⼯智能领域有着深远的影响。施密德胡...

weixin_42216454的博客 244

Common Lisp编程初步---环境搭建和外部lisp代码运行

1 介绍Lisp是世界上第二古老的语言,第一古老语言是Fortran。Lisp语言的创立者为John McCarthy,一位人工智能领域里的先驱。该语言自创立以来经历了50多年而不衰,是一种很有生命力的语言。该语言的发展和使用与CMU和MIT两所高校密不可分,在相当长的时期内是这两所高校的大学计算机课程指定语言。在该语言创立之初,除了创建者外,还有其他的一些高校著名学者也参与到了Lisp语言的发展完

陈广智的专栏 1万+

Lisp语言发明者 人工智能奠基人 John McCarthy

图灵奖获得者,Lisp语言的发明者,人工智能的奠基者之一,计算机科学家John McCarthy昨日病逝。John McCarthy生于美国马萨诸塞州波士顿,计算机科学家。他因在人工智能领域的贡献而在1971年获得图灵奖。实际上,正是他在1955年的达特矛斯会议上提出了“人工智能”这个概念。 麦卡锡发明了LISP并于1960年将其设计发表在《美国计算机学会通讯》(en:Commun

ttwwok的专栏 6363

Joel Spolsky给计算机系学生的建议

Joel Spolsky给计算机系学生的建议 http://post.baidu.com/f?kz=74095956虽然大概一两年前我还在夸夸其谈桌面应用程序是将来的潮流,大学生们现在还是偶尔向我请教职业发展的问题。所以我把我的建议写下来。以供学生们阅读,嘲笑,忽略。 大多数锐气十足的学生从来不向前辈征求意见。在计算机科学领域,这样做是正确的。因为前辈们很可能说些“在2010年前,市场对于

fengsanshao的专栏 1178

几个免费的Scheme(Lisp)解释器

几个免费的Scheme(Lisp)解释器 关键字: lisp scheme Lisp是一个古老的函数式编程语言,Scheme则起源于MIT的一种Lisp方言。当前编程语言的一些特性,如尾递归、匿名函数、动态改变代码的功能等等,不少是受到了Lisp的启发。这里介绍几个能在Windows下使用的免费Scheme语言或Lisp语言的环境。DrSche

skyremember的专栏 1万+
上一篇: 优秀的年轻企业家Sam Altman给19岁满怀壮志的青年的建议
下一篇: 利用hashtable和time函数加速Lisp程序
lzw_java
博客等级 码龄15年 49粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值