Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[Java] 하이라이팅(HL, highlight) 개선 Computer & Program

우리가 쓰던 하이라이팅(HL, lighlight)에 성능 문제가 있는듯 싶어서 고민 중..
하이라이팅은 이런 조건을 만족해야 한다.
1. 여러 단어를 하이라이팅할 수 있다.
2. 하이라이팅 단어 중 포함되는 단어가 있을 수 있다.
3. 포함되는 단어가 있을 경우 더 긴 단어를 하이라이팅한다.
예, 아래 사진처럼 "신발"과 "신발장"이 있는 경우 "신발장"만을 하이라이팅
(아래 사진은 "신발 신발장 발장"을 구글에서 검색 후 저장된 페이지 보기를 한 결과이다.)



이걸 오뜨케 요리 할끄나~?? 번뜩 떠오른 생각!!
1. 여러 단어를 한 번에 변경하기 위해 정규식을 사용해보자. - OR(|) 사용
2. 정규식의 OR(|)가 모든 언어에서 short-circuit이 적용되는지는 모르겠지만, 적어도 java라면 short-circuit을 지원하지 않을까?? short-circuit이 적용된다면, "신발"과 "신발장"을 하이라이팅 해야하는 경우 "신발장"을 더 앞에 두면 "신발장"이 하이라이팅되지 않을까??


테스트는 간단하다.
String str = "나는 신발장을 가진 신발장발장이다";
System.out.println(str.replaceAll("(신발장)|(신발)|(발장)", "<em>$0</em>"));
System.out.println(str.replaceAll("(신발)|(신발장)|(발장)", "<em>$0</em>"));


결과는?? 대만족!! 다른 언어까지는 모르겠는데, 적어도 java만큼은 regex를 사용할 때 short-circuit이 적용된다. 때문에 처음 replaceAll()의 결과는 신발장이 하이라이팅 됐는데, 두번째 replaceAll()은 신발이 하이라이팅된다. 포함되는 단어가 있는 경우라면 더 긴 단어를 OR(|)연산의 left hand쪽으로 넣자.
나는 <em>신발장</em>을 가진 <em>신발장</em><em>발장</em>이다
나는 <em>신발</em>장을 가진 <em>신발</em>장<em>발장</em>이다


자.. 이제 더 고민해 볼 것은..
1. "신발", "신발장"처럼 포함되는 단어를 어떻게 체크해서 left hand로 넣느냐?? trie 구조로 중복을 확인한다거나.. list를 뱅글뱅글 돌면서 startsWith()로 확인하거나..
2. regex가 적어도 java에서는 short-circuit을 탄다는 것을 알았으니, 이를 이용해서 성능을 올려보자. 자주 나오는 단어나 긴 단어를 left hand로 보내 더 빠른 검색이 되도록 유도해 성능을 끌어올린다.

덧글

댓글 입력 영역

Google AdSense (text/image)