2007년 03월 11일
TRIE에 대해서...
그래도 전산과에서 해줄 수 있는 일은, 컴퓨터에서 동작되도록 해주는 일인것 같습니다. 그중에 가장 자주 사용되는 (저만 일수도..) 자료구조가 TRIE 입니다.
TRIE에 대해서는 누군가 블로그에 잘 써놓은 글을 읽어보시면 될 것같습니다. [TRIE] 혹은 여러 검색엔진에서 검색하면 정의나 뭐 그런것 들이 나오겠지요. 그건 기본이니깐.
최근에 제가 해낸 것이 하나 있어서 ^^;;
일본에서 개발한 것인데, Double Array TRIE라는 것이 있습니다.

속도도 빠르고 나름데로 좋은 것 같습니다. 프로그램 소스도 있으니까 이것을 익히면 될 것도 같습니다.
double array trie 는 일본에서 개발한 것이라서, 자존심상 좀 더 좋은 것을 가지고 있고 싶었습니다. 이전에 가지고 있던 것과 비교를 해보니, 화일 Size는 제것이 훨씬 작은데, 속도는 좀 느리더군요....

이 TRIE는 구현이 정말 쉽습니다. 메모리에 모두 Loading을 했다가, 각 노드별로 화일에 써주면 Compile된 TRIE가 생성됩니다. 이때 Link address를 미리 계산해서 link를 char array의 address로 해주면 됩니다. 화일은 char array와 똑 같습니다. fseek(i) 하는 것과 str [i]하는 것이 동일하니까요.....

그런데 Search Time에 걸려있는 모든 노드를 linear search 하는 방식이라서 속도가 좀 늦었던 것 같습니다. (50만건 탐색에 3초정도)
그래서 Darts에는 지지 않고 싶어서 머리를 짜냈습니다. Binary Search로 하면 아무래도 빠를테니깐....

이렇게 그림을 바꾸어 놓고 보면 뭐, 별차이는 아니지만 속도가 대략 2배 이상 빨라집니다. ^^

그림에는 나타나지 않았지만, 각 노드에는 하나의 글자(character)가 들어가는 것으로 Building은 하고 String Optimize(중간 글자 node를 지우고, 앞 노드에 글자를 붙여주는 것)하면 쓸데없이 중간에 끼어 있는 노드는 없어집니다. 그러니까, 위의 그림에서 노드에는 String이 들어 가게 됩니다. (선수만 이해하려나???)

이제 50만건 탐색에 1.4초정도 걸리면서도 Darts 보다 공간은 30% 정도만 사용하는 TRIE를 만드는 알고리즘입니다.

논문으로 쓰려다가 블로그도 논문과 무엇이 다를까 싶어서, 그리고 논문보다 딱딱하지 않아도 되고, 교수도 아닌 제가 논문 편수를 높이는게 뭐 그리 중요할까 싶어서... 간단하게 블로그-논문을 올려보네요...
# by | 2007/03/11 17:43 | NLP | 트랙백(2) | 덧글(4)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
제목 : TRIE에 대하여
내가 지금 사용하고 있는 트라이는 하가모니님이 만드신것이 처음 뿌리이다. 그분에게서 배워와서 약간이 수정(객체 비스므리)을 거쳐 사용하고 있는데 공간효율을 위해서 노드간의 포인터를 연결하는 방식을 ......more
제목 : trie
이건 prefix 검색이 되고 string matching이 좀 빠르다는 장점이 있어서 형태소 분석기 사전에 많이 쓰인다. exact matching 자체는 hash table보다 느리고 메모리도 상상을 초월할 정도로 많이 먹는 등... prefix 검색이 아니라면 그리 좋은 구조는 아니다.사실 내가 직접 형태소 분석기를 개발할 일이 없었기 때문에 그냥 교과서에서만 대충 보고 지나쳤고 탑코더 연습문제로 간단하게 짜본 거 외에 직접 구현해본 적은......more
공력이 아직 부족해서.....
한글가지고 실험했는데 무난한것 같습니다.
(뭐.. 자소는 고려안하고 음절까지만 고려하는 경우입니다만..)
급하게 실험이나 survey해서 가능성이나 결과만 보고 싶을때는 Perl script로
대강 처리해서 결과만 보고나서 처리하는 것도 좋은 솔루션이라 생각합니다.
음..오늘은 무지 한가해서 이것저것 참견하게 되는군요..^^