마크 왓슨 (2024) #하이랭: #파이썬 #리스프 #튜토리얼
2024-06-25 Bibliography aprj bib hylang tutorial c005- “hy 하이랭 파이썬 리스프 프로그래밍” 마크 왓슨 2024
- Python, Lisp, AI, Hy HyLang, artificial intelligence, deep learning, TensorFlow, Keras, knowledge graphs, RDF, linked data, OpenAI, GPT, LangChain
- A Lisp Programmer Living in Python-Land: The Hy Programming Language
- Hy 프로그래밍 언어 - 파이썬 랜드에 사는 리스프 프로그래머
- A Lisp Programmer Living in Python-Land: The Hy Programming Language
#참고코드
#코드카타 Leetcode
https://github.com/jethack23/leetcode-daily
오일러 프로젝트 - 문제 풀이 하이랭 버전
jethack23/projecteuler - github.com
About the Book 책 소개
Added a chapter with examples using Open AI GPT-3.5 APIs Open AI GPT-3.5 API를 사용하는 예제가 포함된 장을 추가했습니다. Added a chapter using the LangChain library LangChain 라이브러리를 사용하여 장을 추가했습니다. While this is a book on the Hy Lisp language. 이것은 Hy Lisp 언어에 관한 책입니다.
In addition to being a tutorial and cookbook on using the Hy language, longer examples explore a variety of different applications and tools. The current structure of the book is: Hy 언어 사용에 대한 튜토리얼 및 요리책일 뿐만 아니라, 더 긴 예제에서는 다양한 애플리케이션과 도구를 탐색합니다. 현재 책의 구성은 다음과 같습니다.
Introduction to the Hy Language Hy 언어 소개 Why use Lisp? Advantages of bottom up development using macros and closures 왜 리스프를 사용하는가? 매크로와 클로저를 사용한 상향식 개발의 장점 Relational databases 관계형 데이터베이스 Web app development 웹 앱 개발 Web scraping 웹스크래핑 Using the Bing search APIs Bing 검색 API 사용 Accessing semantic web and linked data sources like Wikipedia, DBpedia, and Wikidata Wikipedia, DBpedia, Wikidata와 같은 시맨틱 웹 및 연결된 데이터 소스에 액세스 Automatically constructing Knowledge Graphs from text documents, semantic web and linked data 텍스트 문서, 시맨틱 웹, 링크된 데이터로부터 지식 그래프를 자동으로 구축합니다. Deep Learning (predictive model from spreadsheet data and a LSTM-based English text language model) 딥러닝(스프레드시트 데이터를 이용한 예측 모델 및 LSTM 기반 영어 텍스트 언어 모델) Natural Language Processing (NLP) using Deep Learning 딥러닝을 활용한 자연어 처리(NLP) Creating Knowledge Graphs from text data 텍스트 데이터에서 지식 그래프 만들기 Hy language implementation of the author’s Knowledge Graph Navigator project 저자의 Knowledge Graph Navigator 프로젝트의 Hy 언어 구현 OpenAI GPT-3.5 APIs OpenAI GPT-3.5 API LangChain 랭체인
영문 목차
DONE Preface
• Setting Up Your Development Environment • What is Lisp Programming Style? • Hy is Python, But With a Lisp Syntax • How This Book Reflects My Views on Artificial Intelligence and the Future of Society and Technology • About the Book Cover • A Request from the Author • Acknowledgements
Introduction to the Hy Language
- Using Python Libraries
- Global vs. Local Variables
- Using Python Code in Hy Programs
- Using Hy Libraries in Python Programs
- Replacing the Python slice (cut) Notation with the Hy Functional Form
- Iterating Through a List With Index of Each Element
- Formatted Output
- Importing Libraries from Different Directories on Your Laptop
- Hy Looks Like Clojure: How Similar Are They?
- Plotting Data Using the Numpy and the Matplotlib Libraries
- Bonus Points: Configuration for macOS and ITerm2 for Generating Plots
- Inline in a Hy REPL and Shell
Why Lisp?
• I Hated the Waterfall Method in the 1970s but Learned to Love a Bottom-Up Programming Style
• First Introduction to Lisp
• Commercial Product Development and Deployment Using Lisp
• Performing Bottom Up Development Inside a REPL is a Lifestyle Choice
Writing Web Applications
• Getting Started With Flask: Using Python Decorators in Hy
• Using Jinja2 Templates To Generate HTML
• Handling HTTP Sessions and Cookies
• Deploying Hy Language Flask Apps to Google Cloud Platform AppEngine
• Wrap-up
Responsible Web Scraping
• Using the Python BeautifulSoup Library in the Hy Language
• Getting HTML Links from the DemocracyNow.org News Web Site
• Getting Summaries of Front Page from the NPR.org News Web Site
Deep Learning
• Simple Multi-layer Perceptron Neural Networks
• Deep Learning
• Using Keras and TensorFlow to Model The Wisconsin Cancer Data Set
• Using a LSTM Recurrent Neural Network to Generate English Text Similar to the Philosopher Nietzsche’s Writing
Natural Language Processing
• Exploring the spaCy Library
• Implementing a HyNLP Wrapper for the Python spaCy Library
• Wrap-up
Datastores
• Sqlite
• PostgreSQL
• RDF Data Using the “rdflib” Library
• Wrap-up
Linked Data, the Semantic Web, and Knowledge Graphs
• Understanding the Resource Description Framework (RDF)
• Resource Namespaces Provided in rdflib
• Understanding the SPARQL Query Language
• Wrapping the Python rdflib Library
Knowledge Graph Creator
• Recommended Industrial Use of Knowledge Graphs
• Design of KGCreator Application
• Problems with using Literal Values in RDF
• Revisiting This Example Using URIs Instead of Literal Values
• Wrap-up
Knowledge Graph Navigator
• Review of NLP Utilities Used in Application
• Utilities to Colorize SPARQL and Generated Output
• Text Utilities for Queries and Results
• Finishing the Main Function for KGN
• Wrap-up
Using OpenAI GPT and Hugging Face APIs
• OpenAI Text Completion API
• Coreference: Resolve Pronouns to Proper Nouns in Text Using Hugging Face
APIs
Using LangChain to Chain Together Large Language Models
• Installing Necessary Packages
• Basic Usage and Examples
• Creating Embeddings
• Using LangChain Vector Stores to Query Documents
• LangChain Wrap Up
Large Language Models Experiments Using Google Colab
이맥스 하이랭 환경 설치와 이글랏 연동
서문: 하이랭 개발 환경 구축
많이 최신 버전으로 사용할 수 있는데 안쓸 이유가 없다. 파이썬과 리스프를 하나로 통합해서 이해할 수 있다면 이 보다 효과적인 방법이 어디있겠는가?! 왓슨의 서문을 본다. 이런. 개인이 어떻게 인공지능을 활용할 지에 대한 틀에서 쓴다고 한다. 코드는 파이썬 AST 로 컴파일 된다.
- Preface • Setting Up Your Development Environment • What is Lisp Programming Style? • Hy is Python, But With a Lisp Syntax • How This Book Reflects My Views on Artificial Intelligence and the Future of Society and Technology • About the Book Cover • A Request from the Author • Acknowledgements
다루는 주제들
- 관계형 및 그래프 데이터베이스
- 웹 앱 개발, 웹 스크래핑, 시맨틱 웹 및 위키피디아, 위키데이터 등의 연결 된 데이터 소스에 접근하는 방법
- 텍스트, 시멘틱 웹, 연결 데이터로 부터 지식 그래프를 자동으로 구성하는 방법
- 딥 러닝을 이용한 자연어 처리
주제는 저자의 오랜 경험을 바탕으로 결정 된 것. 리스프 언어의 상향식 개발 스타일이 주는 행복과 생산성을 맞보라. 코드 작성과 API 탐색에 REPL 을 적극적으로 활용한다.
리스프 프로그래밍 스타일이란? 그리고 하이랭 활용?
REPL 을 적극 이용. 상향식 접근 방법이 더 개발에 효과적이다. 사전 계획 설계에 시간을 많이 할애 하는 것 보다 적극적인 실험 정신. 파이썬 라이브러리를 검색하고 Hy 로 레퍼를 작성하거나 직접 호출하는 방식.
인공지능과 사회와 기술의 미래와 하이랭
저자는 AGI 를 구현하기 위해서는 딥러닝 뿐만 아니라 심볼링 AI 도 필요하다고 본다.
그러기에 파이썬으로 대표되는 딥러닝 프레임워크와 심볼링 프로그래밍의 통합이 중요하다. 그래서 저자의 수십년 경험에 비추어 리스프 활용이 중요해졌다. 여기에 하이랭은 파이썬으로 변환되기 때문에 더 투명한 접근이 가능하다.
물론 저자의 다른 언어 책에서도 파이썬과 연동하여 문제를 다루지만… 하이랭은 파이썬 그 자체이므로 장점이다.
Even though most of my professional work in the last five years has been in Deep Learning (and before that I worked with the Knowledge Graph at Google on a knowledge representation problem and application), I believe that human level Artificial General Intelligence (AGI) will use hybrid Deep Learning, “old fashioned” symbolic AI, and techniques that we have yet to discover.
This belief that Deep Learning will not get us to AGI capabilities is a motivation for me to use the Hy language because it offers transparent access to Python Deep Learning frameworks with a bottom-up Lisp development style that I have used for decades using symbolic AI and knowledge representation.
NO 콘다 활용 설치
하이랭 언어 소개
좋다. 이제 설치가 완료 되었다. 콘다 환경에 0.28를 콕 찝어서 lsp 서버까지 넣어두었다.
Read A Lisp Programmer Living in Python-Land: The Hy Programming Lang-
- Introduction to the Hy Language
- Using Python Libraries
- Global vs. Local Variables
- Using Python Code in Hy Programs
- Using Hy Libraries in Python Programs
- Replacing the Python slice (cut) Notation with the Hy Functional Form
- Iterating Through a List With Index of Each Element
- Formatted Output
- Importing Libraries from Different Directories on Your Laptop
- Hy Looks Like Clojure: How Similar Are They?
- Plotting Data Using the Numpy and the Matplotlib Libraries
- Bonus Points: Configuration for macOS and ITerm2 for Generating Plots
- Inline in a Hy REPL and Shell
파이썬 라이브러리 사용
이 부분이 가장 큰 장점이다. BeautifulSoup 라이브러리 활용 관련 파이썬과 하이랭 코드 비교 아 그전에 코다 설정을 켜야 겠다. conda-env-activate
from bs4 import BeautifulSoup
raw_data = '<html><body><a href="http://markwatson.com">Mark</a></body></html>'
soup = BeautifulSoup(raw_data)
a_tags = soup.find_all("a")
print("a tags:", a_tags)
그러면 하이랭을 해본다. 책에서는 래플을 실행했다. 아래와 같이 했다.
$ coda-activate pydata
$ hy
Hy 0.28.0 using CPython(main) 3.10.14 on Linux
=> (import bs4 [BeautifulSoup])
=> (setv raw-data "<html><body><a href=\"http://markwatson.com\">Mark</a></body></html>")
=> (setv soup (BeautifulSoup raw-data "lxml"))
=> (setv a (.find-all soup "a"))
=> (print "atags:" a)
atags: [<a href="http://markwatson.com">Mark</a>]
=> (type a)
<class 'bs4.element.ResultSet'>
=> (dir a)
["__add__" "__class__" "__class_getitem__" "__contains__" "__delattr__" "__delitem__" "__dict__" "__dir__" "__doc__" "__eq__" "__format__" "__ge__" "__getattr__" "__getattribute__" "__getitem__" "__gt__" "__hash__" "__iadd__" "__imul__" "__init__" "__init_subclass__" "__iter__" "__le__" "__len__" "__lt__" "__module__" "__mul__" "__ne__" "__new__" "__reduce__" "__reduce_ex__" "__repr__" "__reversed__" "__rmul__" "__setattr__" "__setitem__" "__sizeof__" "__str__" "__subclasshook__" "__weakref__" "append" "clear" "copy" "count" "extend" "index" "insert" "pop" "remove" "reverse" "sort" "source"]
그렇다면
hy 블록은? 잘 된다.
(import bs4 [BeautifulSoup])
(setv raw-data "<html><body><a href=\"http://markwatson.com\">Mark</a></body></html>")
(setv soup (BeautifulSoup raw-data "lxml"))
(setv a (.find-all soup "a"))
(print "atags:" a)
똑같은 결과다. 하나 더 하이랭은 ‘-’ 을 사용할 수 있다. 그리고 파이썬과 같이 type과 dir을 사용할 수 있다.
전역 변수와 로컬 변수 : Global vs. Local Variables
아직 깃리포는 건들 필요 없다. 그러니 그냥 편하게 코드 블록 만들면 된다.
잠시만 파이썬 블록이 저게 아니였는데?! 그래. 넣었다.
로컬 변수를 전역으로 내보내는 것. 편할 경우도 있다고 한다.
(defn foo []
(global x)
(setv x 1)
(print x))
(foo)
x
하이랭에서 파이썬 코드 사용 Using python code in hy programs
같은 디렉토리에 test.py 라는 파이썬 소스가 있을 경우, import test 로 가져올 수 있다.
def factorial (n):
if n < 2:
return 1
return n * factorial(n - 1)
파이썬에서는
import test
print(test.factorial(5))
하이랭으로 바꾸면,
(import test)
(print (test.factorial 5))
물론 인터렉티브 쉘에서 실행 가능하다.
반대로, 파이썬 프로그램에서 하이랭 라이브러리 사용한다면
hy-lisp-python/use_hy_in_python 참고.
(import argparse os)
(import urllib.request [Request urlopen])
(defn get-raw-data-from-web [aUri [anAgent
{"User-Agent" "HyLangBook/1.0"}]]
(setv req (Request aUri :headers anAgent))
(setv httpResponse (urlopen req))
(setv data (.read httpResponse))
data)
(defn main_hy []
(print (get-raw-data-from-web "http://markwatson.com")))
기본 값을 제공하는 선택전 인수 anAgent 주목. 하이랭은 추상 구문 트리 AST로 컴파일 되면 파이썬과 동일하다.
import hy
from get_web_page import main_hy
main_hy()
결국 하이랭과 파이썬이 구문은 다르지만 실제로 같으며, 함께 사용할 수 있다는 점을 강조한다.
파이썬 슬라이스(잘라내기) 표기법을 하이랭 함수형으로 바꾸기
Replacing the Python slice (cut) Notation with the Hy Functional Form
와. 순조롭게 진행 된다. 재미있다. 이게 글이 아니고 뭐인가?! 그나저나 하이랭 쓰는 사람이 누가 있더라… 삼천포로 잠시만… 얻을 것이 없더라. 그냥 가자. hy-mode 는 관리가 안되는데 뭐 일단 사용하다 보면 알겠지.
파이썬이라면,
s = '0123456789'
s[2:4] # 23
s[-4:] # 6789
s[-4:-1] # 678
하이랭에서는
(setv s "0123456789")
(cut s 2 4)
(cut s -4)
(cut s -4 -1)
목록을 변경할 수도 있다.
=> (setv x [0 1 2 3 4 5 6 7 8])
=> x
[0, 1, 2, 3, 4, 5, 6, 7, 8]
=> (cut x 2 4)
[2, 3]
=> (setv (cut x 2 4) [22 33])
=> x
[0, 1, 22, 33, 4, 5, 6, 7, 8]
TODO Iterating Through a List With Index of Each Element
각 요소의 인덱스로 목록을 순회하기
lfor 를 사용한 예제. 인덱스를 폼하는 목록으로 만드는 예제
=> (setv sentence "The ball rolled")
=> (lfor i (enumerate sentence) i)
[(0, 'T'), (1, 'h'), (2, 'e'), (3, ' '), (4, 'b'), (5, 'a'), (6, 'l'), (7, 'l'), (8,\
' '), (9, 'r'), (10, 'o'), (11, 'l'), (12, 'l'), (13, 'e'), (14, 'd')]
=> (setv vv (lfor i (enumerate sentence) i))
=> vv
[(0, 'T'), (1, 'h'), (2, 'e'), (3, ' '), (4, 'b'), (5, 'a'), (6, 'l'), (7, 'l'), (8,\
' '), (9, 'r'), (10, 'o'), (11, 'l'), (12, 'l'), (13, 'e'), (14, 'd')]
=> (for [[a b] vv]
... (print a b))
0 T
1 h
2 e
3
4 b
5 a
6 l
7 l
8
9 r
10 o
11 l
12 l
13 e
14 d
=>
Formatted Output 포멧팅 된 출력
Importing Libraries from Different Directories on Your Laptop
Hy Looks Like Clojure: How Similar Are They?
Plotting Data Using the Numpy and the Matplotlib Libraries
Bonus Points: Configuration for macOS and ITerm2 for Generating Plots
Inline in a Hy REPL and Shell
#관련링크
The Hy programming language
Hy is a Lisp dialect that’s embedded in Python. http://hylang.org/
Learn hy in Y Minutes
https://learnxinyminutes.com/docs/hy/
Hy is a lisp dialect built on top of python. This is achieved by converting hy code to python’s abstract syntax tree (ast). This allows hy to call native python code or python to call native hy code as well