programming 한글식 regular expression의 필요

babbab의 이미지

한 한달전 제가 생각했는데
지금 현재 존재하는 한글을 지원하는 regex library등으로는 한글의 모든 패턴을 표현하기엔 부족한것 같습니다.
영어는 문자가 단어의 최소단위여서 abc등 알파벳으로 모든걸 표현할수 있는데
한글은 문자가 최소 단위가 아니라고 생각합니다
한글은 문자가 있고 예) 한
문자 안에는 초성 중성 종성의 기호들이 있습니다 예) ㅎ, ㅏ, ㄴ
그리고 ㅏ ㅑ ㅗ ㅕ ㅚ ㅟ ㅒ 등의 중성에는 ., ㅣ, ㅡ 중성 기호의 반복으로 이루어져 있습니다.
그래서 예를 들어
양파 껍질처럼 한 한글의 문자는 문자안에 기호, 기호안에 중성기호로 건설되있습니다.

제가 말씀드리고 싶은건…

.,ㅣ,ㅡ 기호의 집합으로 모든 중성기호를 표현하며
ㄱ, ㅏ , ㄴ 등의 기호로 모든 한 문자를 표현하며
[간글] 로 모든 단어의 조합을 표현하는게 원하는 바입니다.

그래서 한글의 한 문자는 세개의 껍질의 겹으로 여러가지를 표현할수 있습니다.

closure * 가 모든 중성기호나 초성중성종성기호나 문자의 집합이고
^ 이 NOT 이고
| 이 OR 이면..

ㅏ 는 [ㅣ.] - 기호의 조합으로 표현,
ㅏ,ㅑ는 [ㅣ*] - ㅣ 기호와 closure로 표현,
ㅜ ㅠ 는 [-*] - ㅡ 기호와 closure 표현할수 있다고 생각합니다
., ㅣ, ㅡ기호와 closure, not, or 로 조합할수 있는 기호의 수가 현재 쓰고 있는 중성기호의 수보다 많이 표현할수 있습니다.

[ㄱ,*,ㄴ] 의 조합은 간, 긴, 건, 갼,걘, 군, 근, …. 등으로 ㄱ이 초성이고 ㄴ이 종성인 모든 한 한글문자를 표현할수 있습니다.
[^ㄱ,ㅏ,^ㄴ] 의 조합은 초성이 ㄱ이 아니고 중성은 ㅏ 이고 종성이 ㄴ이 아닌 모든 문자를 표현합니다.

그리고 마지막 단어 단위에선 현재 regex에서 쓰는것 같이 [간거다] - 한 한글의 문자가 '간' 이거나, '거'이거나, '다'란 문자를 표현하지요.
현재의 regex는 영문에 쓰기가 최상이고 한글에 쓰이기에는 모든 한글의 조합을 표현하기에는 미흡하다고 생각해서
한글식 regex 개발이 필요하다고 생각되 이렇게 몇자 적어 봤습니다.

아직 생각의 시작단계여서 제 모든 생각이 정리되지 않았고 전달이 부족할 수 있음을 먼저 양해 드립니다.

그리고 한글과 영어는 단순이 다릅니다.

익명 사용자의 이미지

'초성이 ㄱ이 아니고 중성은 ㅏ 이고 종성이 ㄴ이 아닌 모든 문자를 표현' 같은 검색이 언제 쓸모가 있나요? 할 수 있는가의 문제가 아니라, 할 필요가 있는가의 문제입니다. 할 필요가 없으면 할 수 없어도 상관없습니다.

qiiiiiiiip의 이미지

a가 아닌 것으로 시작하고, 두번째가 b이고 세번째가 c가 아닌 모든 문자를 표현하는 검색이
필요한 것과 동일한 이유로 필요합니다.

해당 논의는 아주 오래전부터 많이 있어왔습니다만,
아직 좋은 방법을 못 찾고 있는 것이죠..

https://kldp.org/node/67773

익명 사용자의 이미지

글쎄요. 이 글이나 링크해주신 글이나 왜 필요한 지에 대한 실제적인 예는 없군요. 영문자에 대해서는 ACGT로 이루어진 염기서열 데이타에 대해 그런 검색이 필요할 것 같다는 생각도 듭니다. 그런데 한글에서 왜 그럴 필요가 있는지 여전히 모르겠습니다.

익명 사용자의 이미지

그리고, "a가 아닌 것으로 시작하고, 두번째가 b이고 세번째가 c가 아닌 모든 문자를 표현하는 검색이 필요한 것과 동일한 이유"는 "'가'가 아닌 것으로 시작하고 두번째가 '나'이고 세번째가 '다'가 아닌 모든 문자를 표현하는 검색"에 매칭될 것 같습니다.

qiiiiiiiip의 이미지

예를 들어 한국어 사전 분석에 있어서,

예쁘다라는 뜻의 단어가 들어간 문장의 개수를 세는 문제가 있다면

ㅇ ㅖ ㅃ(-[ㄴㄹ]|ㅓ)

이라고 할 수 있겠지요..

물로 예(쁘|쁜|쁠|뻐) 라고 해도 됩니다..

전자로 안하고 후자로 하는 이유는 아직 편리하게 전자를 할 수 있는 방법이 없어서이겠지요.

이런것 이외에도 실제로 자모 조합이 많이 사용되는지 통계를 내고,

통계로 맞춤법 교정기에 활용할 수도 있겠지요.

물론 프로그램을 짜도 됩니다.

문제는 얼마나 편리하게 사용할 수 있느냐 겠지요.

기술이 있으면 사용할 분야는 얼마든지 있습니다.

--

기술적으로 복잡한 일은 아닌 것은 맞습니다.

간단하게는 한글을 풀어쓰고 영어 정규 엔진을 그대로 돌려도 됩니다.

문제는 프로그램 짜는 거 대비 얼마나 간단하냐의 문제겠지요.

qiiiiiiiip의 이미지

그리고, /abc/ 가 /가나다/ 에 매칭된다는 주장에 대해서는,

한글을 이루는 최소단위가 음소가 아니라 음절이라는 주장인데요..

이경우 한글의 심볼의 개수가 자모 24개( 겹자음, 이중모음 등을 치면 더 많지만 )가 아니라,

수천개의 음절이라는 주장입니다.

이게 완성형 코드에서 하는 짓이긴한데, 그렇게 처리할 수도 있겠지요.

안된다는 것은 아닙니다만,

심볼의 수가 늘어나면 범용성이나 확장성의 측면에서 효율이 떨어지게 마련이죠..

익명 사용자의 이미지

좋은 답변 감사드립니다. 이제 이해가 됩니다.

익명 사용자의 이미지

저도 예전에 생각한적 있었는데, 필요하지 않은게 아니라 "분명 있으면 쓸정도로 필요합니다."

하지만 기술적으로 어렵지는 않습니다. 귀찮아서 아무도 안할 뿐.

유니코드 보다보면 완성형 만든 인간들 때려죽이고 싶을 때가 종종 있습니다.

babbab의 이미지

귀찮아도 이런건 했으면 좋겠습니다. 저는 실력이 없어서 건들질 못합니다.
영어 regex implementation 관한 책이나 문서를 찾아 읽고 있는데 영어 regex 작동하는 과정이
전부다 이해가 않됩니다. 읽다보면 복잡해 지더라고요...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.