Clojure로 텍스트의 문자 수 세기
지난 번에 작성한 것은 단순히 '가'부터 '힣'까지 차례로 출력하는 코드였다.
이번에는 저장된 웹페이지로부터 한글 유니코드만 읽어들여 각 문자 별로 몇 개 발생했는 지 그 수를 세는 코드를 작성한다.
다음은 file.html에 저장된 파일 내용을 읽어들여 그 중에서 한글 유니코드만 시퀀스로 만들어주는 코드이다.
slurp
는 파일을 읽어들여 그 내용을 리스트로 만들어주는 함수로, 아주 큰 파일(한도가 얼마인 지는 세보지 못했다)만 아니면 유용하게 사용할 수 있다고 한다.
파일 경로 뿐 아니라 http url을 넣어주면 바로 웹 페이지를 읽어들일 수도 있다.
(filter
(fn [x] (and (>= (int x) (int \가)) (<= (int x) (int \힣))))
(slurp "/somewhere/in/file.html"))
다음은 각 문자 별로 발생 갯수를 세서 더하는 함수로, 아직 clojure 실력이 미천하다 보니(...) 어떻게 작성할까 검색하다가 발견한 코드이다. 다음은 clojuredocs의 update-in
예제 코드에서 사용된 함수이다. 1.2.0부터 지원하는 함수인 듯 하다.
fnil
도 같이 봐두면 좋다.
(defn char-cnt [s]
"Counts occurrence of each character in s"
(reduce
(fn [m k]
(update-in m [k] (fnil inc 0)))
{}
(seq s)))
char-cnt
함수를 돌린 결과는 다음과 같다.
(char-cnt (filter
(fn [x] (and (>= (int x) (int \가)) (<= (int x) (int \힣))))
(slurp "/somewhere/in/file.html")))
{\가 86, \저 9, \퀀 1, \될 7, \낀 1, \좀 3, \풀 1, \겠 2, ...
여기에 sort까지 해주면 모양새가 더 좋겠지만 이번에 하려는 작업에서는 필요 없기 때문에 생략.
— END OF POST.