clj-template-reverse 소개

34 views
Skip to first unread message

sng2...@gmail.com

unread,
Sep 7, 2015, 4:38:36 AM9/7/15
to Korean Clojure User Group
안녕하세요. sng2c(쑹이씨)라고 합니다.

클로저 유저그룹에 제가 만든 라이브러리를 소개드리고자~ 
처음 글을 올려봅니다.

웹사이트내에서 제공되는 컨텐츠들은 대부분 템플릿을 치환하는 형태로 생성됩니다.
같은 Template에 의해서 생성된 결과물들을 서로 비교해서 
역으로 Template을 뽑아내는 라이브러리인
Template Reverse(https://github.com/sng2c/clj-template-reverse ; 이하 TR) 를 소개드리려고 합니다.

웹페이지 크롤링과 파싱을 자동화할수 있다는 믿음으로 시작한 프로젝트 인데요. 
원래 perl로 작성하던 것을 lisp로 구현하면 더욱 견고해지는 경험을 하면서 아예 클로저로 작성중입니다.

첫번째 기능은 두 리스트를 비교해서 공통적인 요소와 치환되는 요소들을 찾아내는 것이구요.

(deftest diff-test
(testing "diff 결과테스트"
(is (= '(\A \B \C) (diff "ABC" "ABC")))
(is (= '(\A \B :*) (diff "ABC" "AB")))
(is (= '(\A \B :*) (diff "ABC" "ABD")))
(is (= '(\A :* \C) (diff "ABC" "A1C")))
(is (= '(\A :* \C \D) (diff "ABCD" "A123CDE")))
(is (= '(\A :* \C :* \E) (diff "ABCDE" "A123CE")))
))

ABCDE 와 A1C2E 를 비교하면, A*C*E 를 뽑아내 줍니다. 그러면 그 뒤에는 A와C, C와E 사이에 있는 것은 치환되는 요소라고 볼수 있겠죠?



두번째 기능은 하나의 리스트의 처음 요소로 시작하는 반복패턴을 찾아내는 것입니다.

(deftest freq-test
(testing "freq test"

(is (= '({:key (\A), :freq ({:off 0, :cnt 4} {:off 1, :cnt 2} {:off 2, :cnt 2})} {:key (\A \A), :freq ({:off 0, :cnt 2})})
(find-key-frequency (seq "AAAA"))))
(is (= '({:key (\A), :freq ({:off 2, :cnt 3} {:off 5, :cnt 2})} {:key (\A \B), :freq ({:off 1, :cnt 3} {:off 4, :cnt 2})})
(find-key-frequency (seq "AB1AB2AB"))))
))
 
AAAA 일 경우는 A 로 시작하는 경우와 AA로 시작하는 경우 2가지가 있겠죠?(AAA는 전체 길이의 반을 넘어서므로 반복이 불가능합니다.)
A의 경우는 
바짝붙어서(offset 0), 4번 반복 (A A A A)
1칸씩 건너뛰면서(offset 1) 2번 반복 (A ? A ?)
2칸씩 건너뛰면서(offset 2) 2번 반복 (A ? ? A)

A A 의 경우는
바짝붙어서(offset 0), 2번 반복( AA AA )

임을 알 수 있습니다. 

주어진 리스트에서 패턴의 가능성이 있는지 ( 문서내에서 for loop로 생성한 부분이 있는지 ^^ ) 알아내는데 도움이 됩니다.

위 두가지 기능으로 웹페이지 크롤링(url리스트 추출) 및 파싱(문서간 비교로 의미있는 데이터 추출)에 도움이 될거라 생각하구요.

입력에 필요한 리스트는 Lexer를 통해서 의미있게 잘라내어 사용하면, TR의 기능이 완성될수 있습니다.

이 코드들을 lazy 하게 만들어서, 큰 문서간 비교에도 부담이 없게 만드는 것을 다음 목표로 하고 있습니다.

관심 있으신 분들의 참여 환영합니다. ^^

pego...@gmail.com

unread,
Sep 7, 2015, 4:33:47 PM9/7/15
to Korean Clojure User Group
Levenshtein distance 인가요? 테스트 자체만 보면 그런 거 같은데, 간단한 응용단 테스트 케이스가 있다면 명확하겠네요.

sng2c

unread,
Sep 7, 2015, 7:21:58 PM9/7/15
to Korean Clojure User Group
음.. 차이가 얼마나 나는지를 보는게 아니고
diff를 뜨는거예요~
Reply all
Reply to author
Forward
0 new messages