2015년 7월 20일 월요일

국어사전, 한영사전 등록 단어 수, 영어 단어 특징 분석, 빠른 검색기 제작

나중에 번역 도움이, 작문 도움이 만들 때 참고할 내용이다. 어느 컴퓨터 사전에 등록된 단어를 분석한 것이다. 어학 사전의 단어 수는 거의 대동소이할 것이다. 

  • 영한사전에 등록된 단어 : 약13만6천개 = 단일 약8만4천개 + 복합 약5만2천개
  • 국어사전에 등록된 단어 : 약5만3천개
  • 발음파일 있는 영어단어 : 약1만1천개

한국어의 경우 동사, 형용사의 단어 변형(굴절, 파생어)이 포함되어 있지 않다. 원형만 알면 문법 규칙으로 변형을 알 수 있기 때문이다. 단어 수가 영어보다 적은 게 아니다.

예) 아름답다(형.서술) ↔ 아름다운(형.수식) ↔ 아름다움(명) ↔ 아름답기(명) ↔ 아름답게(부)

영어의 경우 동사, 형용사의 파생어까지 포함되어 있어서 단어 수가 많아 보인다. 거기에 2개 이상 단어가 뭉친 복합 단어(공백이나 -로 구분)도 포함되어 있다. 두 단어가 어떤 구분 기호 없이 바로 붙은 경우도 있는데 기계적으로 구분이 불가능하여 여기서 단일 단어로 취급했다. 원형만 알면 파생어 유추가 가능하니 실제론 영어 단어 수는 많지 않다.

예) beauty(명) ↔ beautiful(형) ↔ beautifully(부) ↔ beautify(동)

보통 약 1만개의 단어를 알면 어휘에는 문제가 없다. 실제로 전자 사전에 발음 음성 파일이 등록된 경우가 거의 1만1천개이다. 나머지 대부분의 단어가 사용되지 않는 죽은 단어거나 전문분야에서 사용하는 전문용어이다.





단어 특징 분석



빠른 검색을 위해선 단어 목록의 처음부터 비교하는 것이 아니라 단어 특징에 따라 검색표를 세분하고 단어 특징을 분석해서 해당 검색표로 가서 비교하는 것이다. 우리도 사전을 찾을 때 첫 글자를 보고 그 글자로 시작하는 부분부터 찾는다. 고로 단어 특징을 보도록 하자.




한국어는 2음절 단어가 가장 많다. 중국의 한자어의 경우도 대체로 2음절인 경우가 가장 많다. 1음절이 100개의 소리만 나도 2음절이면 1만의 단어가 된다. 영어는 8개 문자(약 3~4음절)인 경우가 가장 많다. "초성+중성+종성=음절"이라고 보면 영어에선 2~3문자가 1음절이다.




발음 파일이 등록된 자주 사용하는 약 1만1천개의 영어 단어의 경우는 길이가 6개 문자인 경우(2~3음절)가 가장 많다. 한국어, 중국어 평균 음절 수와 거의 비슷하다. 역시 자주 사용하는 단어에선 2~3음절이 대세다.



발음 음성 파일이 등록된 자주 사용하는 약 1만1천개의 영어 단어에서 기계적으로 음절을 계산한 결과 역시 2음절이 가장 많다. (그럼 그렇지) 여기서 음절이란 대충 단모음, 이중모음 등 모음이 뭉친 덩어리의 개수를 말한다. 한국어나 영어나 결국 대부분의 단어는 5음절 미만이다.





단어의 첫 글자를 보고 사전에서 단어를 찾는 것처럼 검색표를 분할하면 검색 속도가 빠르다. 수가 적은 j+k+q+x+y+z 6개는 뭉쳐도 된다. 단어의 끝 글자의 경우 빈부격차가 심하다. 역시 어느 나라 말이나 어미에 특징이 있어서 어미만 알아들어도 그 언어가 뭔지 알 수 있다. 접미사나 어미는 자주 반복되기 때문이지. 고로 어미를 특징으로 잡으면 검색이 어렵겠다.




단어 앞에 나오는 이중 자음도 하나의 글자처럼 취급한다고 하자. 로마 알파벳이 모자라서 2개 철자를 뭉쳐 하나의 소리를 표현하는 경우는 흔하다. 예를 들어 영어의 sh~, ch~, th~, ph~, st~, sk~, sp~, sq~ 등을 하나의 자음으로 취급하면 검색표를 더 세분할 수 있다. 비슷한 원리를 좀 더 확장하면 첫 모음 부분까지 포함해서 특징으로 삼는 것이다. 기계적으로 자음 모음을 구분할 수 있기 때문에 첫모음까지를 특징으로 삼아도 된다.




단어 특징 = 시작 알파벳 + 단어 길이로 했을 경우 beautiful은 b6 또는 6b 검색표에 포함 된다. 숫자 0 ~ 9는 단어 길이 3 ~ 12에 대응한다. 3 이하와 12 이상은 수가 적으니 뭉친다.

이렇게 하면 시작 문자 특징 21개 * 10길이 = 210개의 작은 검색표가 만들어지는데 최악의 경우 s5 표의 270개 단어만 비교하면 1만 개의 단어 중에 원하는 단어를 찾을 수 있다. 여기서 s5 표만 더 잘게 자를 수도 있다.

여기에 단어 출현 빈도로 정렬을 해 두면 검색 속도가 더 빨라진다. 문법 단어인 관사, 대명사, 의문사, 접속사, 전치사, 첨사, 조동사 등은 출현 빈도가 매우 높다. 이런 것들은 검색표의 앞부분에 배치한다. 또는 프로그램 코드에 삽입해 버린다.

단어가 원형+s , 원형+ing, 원형+ed, 원형+er로 끝나는 규칙적인 경우는 꼬리를 잘라내면 원형을 쉽게 얻을 수 있다. 그 외의 유명한 접두사(예: re~)와 접미사(예: ~ment, ~ful)의 경우는 단어 특징 분석 후에 원형을 추출하여 찾을 수 있다. 그러나 항상 예외가 문제인데 예외는 암기 외엔 답이 없다. 고로 단어 형태 분석은 기계적으로 안 하는 게 좋다. 변형 그 자체로 검색하여 원형을 찾는 게 더 안전하다. 어차피 단어를 보고 규칙/예외를 구분해야 하니 계산보단 기억을 이용하는 게 낫다.





모든 단어는 거의 최소한 2개 글자 이상이다. 고로 앞의 2개 글자 조합을 특징으로 삼아 검색표를 만들 수도 있다. 표를 보면 자음+모음=음절, 모음+자음=음절의 경우가 많다. 자음+자음=2중자음, 모음+모음=2중모음인 경우는 드물다. 자음+자음인 경우 하나의 자음처럼 쓰이는 것들이 있다. 이런 것은 2개 자음을 하나의 자음으로 취급하고 앞 3개 글자를 특징으로 취할 수도 있다. 아니면 자음/모음 뭉치를 구분 해서 첫음절을 취할 수도 있다.

최악의 경우 co~ 조합에서 522회의 비교를 해야 한다. 자주 사용하는 접두사와 접미사가 있어 특정 철자에 단어들이 많이 모인다. 이런 경우 검색 특징으로는 좋지 못 하다. 고로 접두사와 접미사를 감안해서 더 세분하는 작업이 필요하다. 모두에게 기계적으로 같은 규칙을 적용할 필요는 없다. 세력과 규모에 따라 비례하여 처리하는 게 좋다.




접두사보다는 접미사 쪽이 더 빈부격차가 심하다. 이 말은 상당히 많은 단어들이 접미사가 붙은 파생어란 의미고, 대부분의 언어에서 단어의 엉덩이 부분에 반복되는 패턴이 나타난다. 그러나 예외가 있기 때문에 기계적으로 단어의 엉덩이 부분을 분석해서 원형을 찾는 방식은 좋지 않다. ~er, ~ing, ~ion, ~ment, ~ly 등에 압도적으로 집중 되어 있다.

기초 단어들도 엉덩이 부분이 비슷한 것들이 많은데 발음도 거의 비슷해서 규칙성이 있다. 예를 들어 "자음+모음+자음+e"로 끝나는 짧은 단어들을 보면 모음 발음이 대단히 규칙적이다. (이건 영어 발음에도 규칙 있다는 글 참고)





반복 되는 접두사와 접미사가 많지만 그 둘이 함께 나타나기는 드물다. 고로 첫 글자와 끝 글자를 조합해서 특징을 삼아 검색표를 만들 수도 있다. 첫 글자와 끝 글자 사이에는 자음과 모음으로 음절을 만드는 상관성도 없다. 이 경우는 s~e 검색표에서 최악 285회의 비교를 해야 한다. 앞에서 본 것들보단 검색 특징으로서 좋은 편이다.

앞의 검색 특징을 모두 활용하면 26개 시작 문자 * 26개 끝 문자 * 10단계 길이 구분 = 6760개 검색표가 만들어진다. 거의 특징 1개에 평균 2개 단어가 할당되어 검색을 총알같이 할 수 있다. 실제론 빈부 격차가 있기 때문에 단어가 전혀 없는 표도 있어서 검색표는 그리 많지 않다.

문제는 2~3개 단어가 연속으로 나타나서 한 단어처럼 쓰이는 숙어, 또는 서로 떨어져서 호응관계인 숙어의 경우 첫 단어를 보고 그 다음 단어를 함께 검색할 것인지 판단할 필요가 있다. 이 경우도 2개 ~ 3개 단어 조합의 숙어가 가장 많을 것으로 예상할 수 있고, 이 경우도 같은 방법으로 검색표를 만들 수 있다.



빠른 사전 검색기 만들기


보통 전자 사전에 키보드로 입력을 하여서 찾는데 타자가 느리면 불편하다. Excel과 HTML5를 이용해서 종이 사전에서 검색하는 것처럼 만들 수 있다. 100개씩 100페이지면 1만개의 단어이다. 첫 페이지에서 100개 단어 중에 1개를 선택하면 다음 페이지에서 100개 단어 중에 검색 단어를 찾는 방식이다.





ABC순서로 정렬하여 100개씩 끊을 때 갑자기 단어 길이가 짧아지는 지점을 찾아 끊으면 파생어끼리 묶여 같은 페이지에 들어가게 된다. 이 원리를 이용해서 마우스 클릭 단 2회로 1만개 단어 중에서 원하는 것을 찾는 사전을 만들 수 있다.

전자 사전의 경우 전문적으로는 해시 함수(hash function) 이용. 앞에 보인 여러 특징들이 해시 값에 해당한다. 앞과 뒤와 길이를 섞으면 적절한 해시 값이 됨을 보였다.

간단하고 직접적인 해시 함수를 보면 영어의 각 문자를 숫자(a~z=0~25)로 바꾸고, 문자열의 길이는 진수(26)로 반영하는 것이다. abc는 0*26² + 1*26¹ + 2 또는 0 + 1*26¹ + 2*26²이 되는 방식이다. 이렇게 하면 모든 문자열은 오직 하나의 독특한 숫자를 가지게 되는데 공간 낭비가 너무 많다. 단어의 길이가 평균 9라면 26의 9승인 5,4295,0367,8976(5조)를 곱하게 되어 숫자가 너무 커지는 문제(오버플로우)가 발생한다. 그래서 진수를 26이 아닌 더 작은 값으로 취하는 방법도 있다. 또한 덧셈이 아닌 XOR을 시키는 방법도 있다.
  • 16비트라면 6,5536(6만)까지 표현 가능하다. 
  • 32비트라면 42,9496,7296(42억)까지는 표현 가능하다.
  • 64비트라면 1844,6744,0737,0955,1616(1844경)까지 표현 가능하다.  
평균 10개의 단어가 같은 해시 값을 가지게 하려면 단어 1만개를 1000개의 작은 표로 분할한다. 해시 값을 1000으로 나누어 나머지만 취하는 방법이 있는데 이건 결국 뒤의 몇 글자 또는 앞의 몇 글자만 취해서 해시 값을 만든 것과 다름없다. 접두사와 접미사는 자주 사용되기 때문에 몰리는 현상이 있어 좋지 않았다. 그래서 시작과 끝의 몇 글자를 지우고 중간(어간)만 가지고 해시 값을 구하기도 한다. 또는 시작과 끝의 몇 글자를 묶어 하나의 정수(문자)로 취급하는 방법도 있다.

아래는 사용한 HTML5 코드이다. (HTML 문법 모호한 부분이 정말 많다.)

Text 파일을 UTF-8, UTF-16로 저장한 후 확장자를 HTML로 바꾸면 정상동작한다.
네이버 다음에서 일어/중어의 경우 한자 검색, 소리(가나/병음) 검색 2가지 모두 가능함.
일어/중어 기타 언어의 경우 유니코드를 사용해야 검색이 된다. ANSI나 옛날 코드는 무시.
영단어/중단어/일단어 부분에 검색할 단어를 넣으면 된다.



<!DOCTYPE html>
<html>
<head>
<title>네이버 다음 사전 검색법</title>
  <meta charset="UTF-8">
</head>
<body>
<a href="http://dic.daum.net/search.do?q=영단어&dic=eng" target=_blank>영단어</a>
<a href="http://dic.daum.net/search.do?q=일단어&dic=jp" target=_blank>일단어</a>
<a href="http://dic.daum.net/search.do?q=중단어&dic=ch" target=_blank>중단어</a>
<a href="https://endic.naver.com/search.nhn?query=영단어" target=_blank>영단어</a>
<a href="https://ja.dict.naver.com/search.nhn?query=일단어" target=_blank>일단어</a>
<a href="https://zh.dict.naver.com/#/search?query=중단어" target=_blank>중단어</a>
</body>
</html>



<!DOCTYPE html>
<html>
<frameset cols="50%,50%"> 또는 <frameset rows="50%,50%">
  <frame name=이름A src="frame_a.htm">
  <frame name=이름B src="frame_b.htm">
</frameset>
</html>



<!DOCTYPE html>
<html>
<body>
<iframe src="단어목록파이름.html" name=이름 width=폭 height=높이> 
오류설명 
</iframe>
</body>
</html>



<table>
<colgroup>
<col span=적용칼럼A width=칼럼폭>
<col span=적용칼럼B width=칼럼폭>
<col span=적용칼럼C width=칼럼폭>
</colgroup>
<tr valign=상하중 align=좌우중>
<td>단어A<BR id="단어위치"></td>
<td>단어B<BR id="단어위치"></td>
<td>단어C<BR id="단어위치"></td>
</tr>
</table>




<a href="단어목록파일이름.html#단어위치" target="위치지정">단어</a>

  • _blank : 새 창과 탭에서 열기
  • _self : 디폴트, 현재 프레임에서 열기
  • _parent : 부모 프레임에서 열기
  • _top : 윈도우 전체에서 열기
  • framename : 지정한 이름의 프레임에서 열기



<audio controls>
<source src="단어발음파일이름.mp3" type="audio/mpeg">
</audio> 단어




아래는 스마트폰에서도 사용할 수 있을 정도로 직접 만든 것이다. 수 많은 페이지를 표로 만들며 링크를 걸어야 하기 때문에 Excel 계산과 Macro를 섞어 잘 활용해야 만들 수 있다. 10 페이지 정도는 사람이 직접 만들 수 있다. 그런데 100페이지 이상이라면? 만들다 보면 머리가 몽롱해진다. 클릭 3회면 원하는 결과에 도달할 수 있다. 이렇게 하려면 적당한 크기로 분류하는 기술이 필요하다. 마지막 단어 설명 파일은 한컴 사전을 베끼면 된다. 재미 있어서 역순 검색(엉덩이 비슷한 것들), 운모 검색(초성을 제외한 모음+받침 소리가 비슷한 것들)도 만들었지. ㅋㅋㅋㅋ








 
 한국에 없는 것이 3가지 있다. 정의, 양심, 처녀!?

하늘은 독재 잔당이 덮고, 땅은 보수 꼴통이 덮고, 그 사이에 처녀는 쥐도 새도 모르게 멸종했다고 한다. 고아 수출 1위? 참 훌륭한 나라다. 역시 한국 놈들은 믿을 놈들이 못 된다. 학자도, 의사도, 판사도, 검사도, 변호사도, 언론인도, 국민도 독재 잔당 밑에서 잘 길들여졌다. 한국인의 말은 한국인도 믿지 않는다.

국세충이 여러분의 잠지를 감시하고 있으니 조심하라. 꼴린통은 공화당의 미인계에 넘어가 1개월 만에 루인새끼 엉덩이를 쑤셨다고 한다. 과연 보수 우익이 진보 좌파보다 더 도덕적일까? 그들은 우릴 볼 수 있지만 우린 그들을 볼 수 없다. 젊고 예쁜 여자가 접근하면 뭔가 이상한 것이다. 처녀였다 하더라도 의심해야 한다. 처녀막 재생 수술한 요원일 수도 있다. 

한국은 조상도 간첩으로 만드는 나라다.

댓글 없음:

댓글 쓰기