안녕하세요. sng2c(쑹이씨)라고 합니다.
처음 글을 올려봅니다.
웹사이트내에서 제공되는 컨텐츠들은 대부분 템플릿을 치환하는 형태로 생성됩니다.
같은 Template에 의해서 생성된 결과물들을 서로 비교해서
역으로 Template을 뽑아내는 라이브러리인
웹페이지 크롤링과 파싱을 자동화할수 있다는 믿음으로 시작한 프로젝트 인데요.
원래
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 하게 만들어서, 큰 문서간 비교에도 부담이 없게 만드는 것을 다음 목표로 하고 있습니다.
관심 있으신 분들의 참여 환영합니다. ^^