낭패

전설상의 동물이 있다. 낭(狼)과 패(狽)다. 둘 다 다리 두 개가 없거나 짧다. 뒷다리 두 개가 없거나 짧은 것이 낭이다. 앞다리 두 개가 없거나 짧은 것이 패다. 낭은 용맹하나 꾀가 없다. 패는 꾀가 많으나 겁이 많다. 그래서 이 둘은 항상 같이 다녀야 제 구실을 할 수 있다. 따로 가면 넘어진다. 여기서 나온 말이 낭패다. 계획한 일이 실패로 돌아가거나 기대에 어긋나 매우 딱하게 되는 것을 뜻하는 단어가 됐다.

정치에서 명분은 낭이다. 구도는 패다. 낭과 패가 그렇듯이, 명분과 구도는 함께 가야 한다. 하나만으로는 안 된다. 쇄신 세력은 명분을 쥐고 있었다. 재보궐 선거에서 진 데다, 당 지지율도 급전직하하지 않았던가. 하지만 그들은 명분을 담보할 구도를 만들지 못했다. 오히려 공동보조를 취해야 할 친박을 결과적으로 쇄신 반대로 몰아버렸다. 결국, 한나라당 쇄신파는 낭패를 자초한 것이다. 이런 능력으로 어떻게 이미 뿌리 내리고 있는 체제를 혁신할 수 있으랴.




by 단상 | 2009/06/24 10:40 | 트랙백 | 덧글(0)

Lucene 한글 복합명사 처리

Lucene 에서 한글 복합명사를 처리할 때 발생하는 난감한 상황입니다. 한글 처리는 korlucene 을 이용했습니다.
복합명사로 검색할 때와 명사를 띄어 써서 검색할 때 검색 결과가 다르게 나타납니다.
그 이유를 설명드리겠습니다.

name 이란 필드에서 "만성간염" 이란 단어를 검색한다고 가정하겠습니다. 
현재는 "만성간염"을 KoreanFilter 로 처리하면,

term position1
term text간염
만성간염
만성

처럼 나옵니다. term position 이 동일한 것들은 유의어 처럼 처리를 합니다.
따라서, 최종적으로 생성되는 Query 는 BooleanQuery 이고, 이를 String 형태로 보면

name:간염 name:만성간염 name:만성

이 됩니다. 따라서, "간염", "만성간염", "만성" 이 세 개의 단어 중 하나라도 들어있는 문서가 검색이 됩니다.
즉, OR 검색이 되는 것이죠. 이것은 solr 에서

<solrQueryParser defaultOperator="AND"/>

와 같이 설정을 하였더라도 유의어로 보기 때문에 위와 같이 Query 가 생성이 됩니다.

그 다음 "만성 간염"으로 띄워서 쓰면 어떻게 될까요? solr analysis 에서 보면 아래와 같습니다.

term position12
term text만성간염

Query 를 생성할 때는 "만성", "간염"을 먼저 분리한 후, name 필드를 각각 적용하게 됩니다.
그래서 defaultOperator 가 AND 일 때

+name:만성 +name:간염

으로 Query 가 생성됩니다. "만성"과 "간염"이 동시에 들어있는 문서가 검색 결과로 나옵니다.
defaultOperator 가 OR 이면,

name:만성 name:간염

으로 Query 가 생성이 되고, "만성" 또는 "간염" 이 들어있는 문서가 검색됩니다.

만약에 KoreanFilter 를 수정해서 term position 을 달리하면 어떻게 될까요? 실제로 KoreanFilter 를 수정을 해서 실험을 해보았습니다.

term position12
term text만성간염
만성간염

하나의 token 이 term position 이 다른 여러 개의 token 들로 쪼개질 때는
BooleanQuery 가 아닌, PhraseQuery 가 생성됩니다. (위 경우엔 엄밀하게 MultiPhraseQuery 입니다.)
즉, 최종 Query 의 스트링은

name:"만성 (간염 만성간염)"

으로 생성이 됩니다. 엉뚱하게도 "만성 (간염 만성간염)"으로  exact 매칭을 시도하기 때문에,
이런 경우엔 "만성간염"이 당연히 결과에 나오지 않습니다.

만약, "만성간염"을 

term position12
term text만성간염

이렇게 필터링이 되게 했을 때도 PhraseQuery 가 생성이 되고,

name:"만성 간염"

으로 검색을 하기 때문에 "만성 간염"으로 exact 매칭을 하여 "만성간염"은 검색되지 않습니다.

조금 내용이 헛갈리실 수도 있는데, 결론적으로 말씀드리면, lucene 의 기본 QueryParser 클래스를 이용해서는 복합명사에 대해 AND 검색이 안 된다는 점입니다.
"만성간염"을 입력했을 때, "만성간염", "만성 간염" 뿐만 아니라, "B형간염", "A형간염", "간염" 등의 결과가 같이 나올 수 밖에 없습니다.

KoreanFilter 를 사용하지 않았을 때는 반대로 "만성간염"을 입력해서 "만성 간염"을 찾을 수 없게 됩니다.

아무래도 복합명사 AND 검색이 가능하게 하려면, query parser 를 별도로 하나 만들어야 할 거 같습니다.
by 단상 | 2009/03/27 23:10 | Lucene / Solr | 트랙백 | 덧글(2)

크롬 오류 메시지창

quicktime 플레이어가 동작하다가 먹통이 되길래 프로그램을 강제 종료시켰더니, 이런 메시지가 덨다.



헉!
by 단상 | 2008/09/05 11:37 | 구글 | 트랙백 | 덧글(2)

로또리치 과연...

로또리치라는 로또 사이트에서 이번에 로또 1등을 맞췄다고 한다.

관련기사) http://news.nate.com/Service/news/ShellView.asp?ArticleID=2008080509520013213&LinkID=1&lv=10

기사 내용 중 "유동회귀법"이란 용어가 나와서 구글에서 찾아봤더니, 위 기사 내용만 검색이 되고, 정작 "유동회귀법"이 뭔지는 찾을 수 없었다.

로또 사이트에서 회원을 모집하고, 1등 번호를 찍기 위해서는 가장 중요한 건 바로 회원들에게 나눠주는 로또 번호가 겹치지 않게 하는 게 아닐까 싶다.

이런 저런 공식을 붙여서 로또 번호를 만들어내고, 과거 당첨 번호는 제외하고, 이 번호들을 회원들에게 차례로 나눠주는 것이다.

중복을 허용하지 않음으로써, 사이트 전체적으로 봤을 때 당첨 확률은 높아지게 된다.

만에 하나 당첨이라도 되면, 대대적으로 기사를 뿌려서, 여기에 혹한 사람들을 끌어모은다.

이렇게 해서 전체적인 당첨 확률은 또 높아진다. 회사의 수익은 또 높아진다.

그야말로 시간이 갈수록 앉아서 돈버는 매력적인 BM 이 아닐 수 없다.

by 단상 | 2008/08/05 13:26 | 트랙백 | 덧글(1)
<< 이전 페이지 다음 페이지 >>