Autohotkey에서 DTW(Dynamic Time Warping) 를 사용한 글자 매칭


Autohotkey 는 간단한 단축키 활용에 쓰기 좋지만 복잡한 알고리즘 들도 만들어 사용하기 편리 합니다. 

우리가 프로그래밍 시에 사용하는 웬만한 데이터 타입들은 대부분 제공을 해 주고 Class 등도 만들 수도 있으니

프로그래밍 언어로 사용하지 않을 이유가 없는거죠.


요즘 저는 영어 단어에서 틀린 글자가 있는지 찾는 작업을 하고 있습니다. 


예를 들어 Autohotkey 라는 단어가 맞는 표현인데 Autuhotkey, autohutky 와 같이 잘못 씌여진 경우에 대해 찾아보는 작업 입니다.


Autohotkey, Autoit, Python, Powershell, Ruby 와 같은 단어가 정상적인 단어의 세트라고 할때


위 단어 셋트 중에 Autuhotkey 라고 잘못 쓴 단어가 어떤 단어와 얼마나 유사한지를 확인해 보고 싶은 겁니다.


이를 위해 패턴인식 책에 있는 알고리즘 중 DTW(Dynamic Time Warping)을 적용해 봐야 겠다고 생각 했습니다.


DTW(Dynamic Time Warping) 는 시계열 데이터 즉, 순서가 있는 데이터의 유사성을 측정하는 알고리즘입니다. 


https://en.wikipedia.org/wiki/Dynamic_time_warping


우리가 사용하는 단어도 사실은 순서가 매우 중요하죠. 


Autohotkey 라는 단어와 Atuoohtkey 라는 단어는 글자수나 그 구성된 알파벳은 같지만 엄밀히 다른 단어라고 볼 수 있습니다. Atuoohtkey 는 Autohotkey 를 잘못 타이핑 했을 가능성이 높은 단어인 거죠.


인간이 타이핑을 하다보면 이렇게 오타를 내는 경우는 비일 비재 하고 이런 오타들을 DTW와 같은 알고리즘을 이용해서 찾을 수 있을 거라고 생각 했습니다. 


이 이외에도 언듯 생각할 수 있는 분야는 다운로드 받은 드라마를 폴더 별로 정리한다던지 하는 등의 분류 작업 들입니다.


DTW 에 대한 공부를 위해 아래 웹 페이지들을 참조했고, 


http://www.speech.zone/exercises/dtw-in-python/


https://nipunbatra.github.io/blog/2014/dtw.html


http://www.smallake.kr/?p=17918


https://jeremykun.com/2012/07/25/dynamic-time-warping/


유사한 단어를 찾는 것이므로 dtw 의 Backtracking  과정은 생각 했습니다.


결과적으로 다음과 같은 dtw(ByRef testV) 함수를 만들 수 있었고 코드는 아래와  같습니다. 

reference 로 할 단어의 셋은 아래와 같이 설정했고~ 

refArray := ["Autohotkey", "Autoit", "Python", "Powershell", "Ruby"]


각 단어들을 dtw 알고리즘을 사용하여 어떤 단어와 가장 유사한가를 추천 받을 수 있습니다. 

아래와 같이 실행하면 

dtw("Autuhotkey")

dtw("autohutky")

dtw("Pithon")


각 단어들이 다음과 같이 어떤 reference 단어 셋과 일치하는 지를 확인 할 수 있습니다. 


Regular Expression 을 사용하는 경우 항상 테스트가 필요 합니다.

정규 표현식을 잘못 사용하면 돌이킬 수 없는 문제들이 발생 할 수도 있기 때문이죠.

그래서 오늘은 정규 표현식 테스트 사이트들에 대해 간단히소개 하려 합니다.

제가 구글링 해 본 바로는 Python 정규표현식 테스트 사이트로 아래 3개의 사이트가 나오더군요.




나머지 두 사이트는 파이썬 정규 표현식을 테스트만 할 수 있었습니다.

Cheat Sheet 가 있어서 정규표현식 문법이 생각 안날 때 참조하며 할 수 있다는 측면에서는 좋아 보였습니다. 

그런데 첫번째 링크인  https://regex101.com/ 의 경우 테스트 뿐만 아니라 코드 생성도 해 주더군요. 

모든 워드에 _postfix 라는 글자를 넣고 싶다고 해보죠~ 

다음과 같이 정규 표현식을 입력해서 테스트 해보면 모든 워드에 _postfix 를 넣을 수 있습니다.



다음으로 밑에 있는 code generator 버튼을 눌러 보면~ 방금 작성한 정규 표현식에 대해 Python 코드가 나옵니다. 


위 사이트에서 보시면 javascript, php, python, csharp, java, ruby, rust, golang, perl 에 대해 코드 생성을 해주네요~

정규 표현식 사용시 필수 사이트가 될 것 같습니다.



Windows 환경에서 ruby를 설치하는 방법에 대해 기록한다.

 

Ruby 설치를 위한 Windows binary 는 아래 주소에서 다운로드 할 수 있다.

 

http://rubyinstaller.org/downloads/

 

현재 2.2.4 버전이 최신 버전이다.

 

위 download 페이지의 설명에 나와 있지만 잘 모르겠을 때는 32비트를 설치하는 게 좋다.

 

(x64) 라는 글자가 붙지 않은 파일들이 32비트용이다.

 

설치 시 아래 그림과 같이 path 환경변수에 등록하도록 설정한다.

 

컴파일 환경을 갖추기 위해 각자 버전에 맞는 DEVELOPMENT KIT도 설치 한다.

 

다운로드 받은 exe 파일을 더블 클릭하면 압축이 해제 되는데~ C:\RubyDevKit 와 같은 폴더를 만들고 해당 폴더에 압축을 해제 하도록 한다.

 

다음으로 DEVELOPMENT KIT 을 초기화 하고 설치하기 위해 CMD 창에서 C:\RubyDevKit 폴더로 이동후에 아래 명령어를 순서대로 써서 설치를 완료 한다.

ruby dk.rb init

ruby dk.rb install

 

 

아래 명령어를 통해 현재 설치된 ruby 버전을 확인 할 수 있다.

 

ruby –v

 


ABAP, ActionScript, Ada, ADSO/IDSM, AMPLE, ant, Apex Trigger, Arduino Sketch, ASP, ASP.NET, Assembly, autohotkey, awk, blank, Bourne Again Shell, Bourne Shell, C, C shell, c#, C++, C/C++ Header, C:\Windows, CCS, choco, chocolatey, cloc, cloc-1.62.exe, cloc-1.62.pl, cloc.exe, Clojure, ClojureScript, cmake, COBOL, CODE, CoffeeScript, coldfusion, ColdFusion CFScript, COMMENT, css, CUDA, cython, d, Dal, dart, DOS Batch, dtd, ECPP, erlang, expect, F#, focus, fortran 77, Fortran 90, fortran 95, Go, Grails, Groovy, Haml, Handlebars, harbour, Haskell, HLSL, HTML, IDL, install, InstallShield, Java, javascript, JavaServer Faces, JCL, JSON, jsp, kermit, Korn Shell, Kotlin, less, LEX, LISP, Lisp/OpenCL, LiveLink OScript, LUA, M4, make, matlab, maven, Modula3, MSBuild script, mumps, Mustache, MXML, NAnt script, NASTRAN DMAP, Objective C, Objective C++, Ocaml, Oracle Forms, oracle reports, pascal, Pascal/Puppet, Path, Patran Command Language, perl, php, PHP/Pascal, Pig Latin, PL/I, PowerShell, python, QML, r, Racket, Razor, Rexx, RobotFramework, ruby, Ruby HTML, rust, SASS, Scala, sed, Skill, SKILL++, SMARTY, Softbridge Basic, sourceforge, SQL, SQL Data, SQL Stored Procedure, strip-comments, Swift, Tcl/Tk, Teamcenter met, Teamcenter mth, TypeScript, Unity-Prefab, Vala, Vala Header, Velocity Template Language, Verilog-SystemVerilog, VHDL, vim script, Visual Basic, Visualforce Component, Visualforce Page, Windows Message File, Windows Module Definition, Windows Resource File, WiX include, WiX source, WiX string localization, XAML, xBase, xBase Header, xml, xquery, xsd, XSLT, yacc, YAML, 라인수, 코드

이전 포스팅에서 powershell 을 사용한 코드 라인수 세기 방식에 대해 소개한 적이 있는데요~

 

http://iamaman.tistory.com/1577

 

검색을 해보니 역시나…… cloc 라는 프로그램이 있더군요.

 

cloc 의 홈 페이지는 아래와 같습니다.

 

http://cloc.sourceforge.net/

 

또는 이전에 소개했던 Chocolatey 을 사용하여 아래와 같이 설치 할 수 도 있더군요.

 

choco install cloc

 

다운로드 주소는 아래와 같습니다.

 

http://sourceforge.net/projects/cloc/files/cloc/


현재 최신 버전은 1.62 입니다.

 

 

현재 저는 윈도우 64비트를 사용 중이라 위 그림과 같은 페이지에서 cloc-1.62.exe 을 다운로드 받았습니다.


Perl 에 관심이 있는 분들은 cloc-1.62.pl 파일을 다운로드 받아서 소스를 살펴보는 것도 좋은 공부가 될 듯 하네요.

 

다운로드 받은 cloc-1.62.exe 파일을 cloc.exe 라는 이름의 심볼릭 링크로 해서 C:\Windows 와 같이 path 로 설정된 폴더에 넣거나 cloc.exe 로 파일명을 변경 한 후에 path 로 설정된 폴더에 넣습니다.

 

사용법은 굉장히 간단한데요~

 

CMD 창을 연 다음 아래 그림과 같이 cloc 파일명을 넣어 주고 엔터를 때리면~ 각 확장자 별로 code, blank, comment 줄 수 별로 카운트를 해서 목록으로 알려 줍니다.

 

 

위에 그림은 C++ 파일과 헤더 파일 MATLAB 파일의 Code, Blank, Comment 줄 수를 나타내 주는 것을 확인 할 수 있습니다. cloc 는 아래 주소에서 확인 할 수 있는 바와 같이 정말 다양한 언어에 대해 줄 수를 파악해 줍니다.

 

http://cloc.sourceforge.net/#Languages

 

ABAP, ActionScript, Ada, ADSO/IDSM, AMPLE, Ant, Apex Trigger, Arduino Sketch, ASP, ASP.Net, Assembly, AutoHotkey, awk, Bourne Again Shell, Bourne Shell, C, C Shell, C#, C++, C/C++ Header, CCS, Clojure, ClojureScript, CMake, COBOL, CoffeeScript, ColdFusion, ColdFusion CFScript, CSS, CUDA, Cython, D, DAL, Dart, DOS Batch, DTD, ECPP, Erlang, Expect, F#, Focus, Fortran 77, Fortran 90, Fortran 95, Go, Grails, Groovy, Haml, Handlebars, Harbour, Haskell, HLSL, HTML, IDL, InstallShield, Java, Javascript, JavaServer Faces, JCL, JSON, JSP, Kermit, Korn Shell, Kotlin, LESS, lex, Lisp, Lisp/OpenCL, LiveLink OScript, Lua, m4, make, MATLAB, Maven, Modula3, MSBuild script, MUMPS, Mustache, MXML, NAnt script, NASTRAN DMAP, Objective C, Objective C++, OCaml, Oracle Forms, Oracle Reports, Pascal, Pascal/Puppet, Patran Command Language, Perl, PHP, PHP/Pascal, Pig Latin, PL/I, PowerShell, Python, QML, R, Racket, Razor, Rexx, RobotFramework, Ruby, Ruby HTML, Rust, SASS, Scala, sed, SKILL, SKILL++, Smarty, Softbridge Basic, SQL, SQL Data, SQL Stored Procedure, Swift, Tcl/Tk, Teamcenter met, Teamcenter mth, TypeScript, Unity-Prefab, Vala, Vala Header, Velocity Template Language, Verilog-SystemVerilog, VHDL, vim script, Visual Basic, Visualforce Component, Visualforce Page, Windows Message File, Windows Module Definition, Windows Resource File, WiX include, WiX source, WiX string localization, XAML, xBase, xBase Header, XML, XQuery, XSD, XSLT, yacc, YAML

 

--strip-comments 같은 옵션을 사용하면 comment 을 지울 수도 있더군요. 외부에 코드를 보낼 때 종종 활용하게 될 것 같네요.


전세계의 사람들은 어떤 프로그래밍 언어를 주로 이용할까에 대한 궁금함을 항상 가지고 있었다.

인터넷 검색을 통해 이런 궁금증을 해결해 줄 수 있는 사이트를 발견했다.

TIOBE 소프트웨어라는 회사의 홈페이지에는 한 달에 한번씩 프로그래밍 언어의 인기도에 대한 순위를 올려 놓는다.

아래 순위의 출처는 http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html 다.

이번 달의 프로그래밍 언어 인기도는 다음과 같다.

 

역시나 이번에도 1등은 자바다.

2~3 등을 하고 있는 C/C++ 야 뭐 워낙에 기본이 되는 프로그램 이니깐 할 말이 없고, 파이썬C#의 약진이 눈에 뜬다.

작년 까지만 해도 파이썬이 저 정도는 아니었던 것 같은데…… 요즘 진짜 많이 사용하는 프로그램 같다.

뭐 문법도 편리하고 여기 저기 안 붙는 데가 없으니 정말 좋은 언어라는 생각이 많이 든다.

파이썬 같은 스크립트 언어는 여러 모로 도움이 되니 프로그래밍을 하시는 분들은 꼭 한번 공부해 보시길

비트토렌트아나콘다 trac 같은 프로그램이 파이썬으로 만들어 졌고, 뭐 구글을 비롯해 NASA같은 데서도 많이 이용된다 하니 더 관심이 가는 언어 중에 하나다.

일단…… 파이썬은 공짜다. 뭐 리눅스 윈도 이런 거 안 가리고 잘 돌아가는 너무 좋은 언어다.

파이썬도 책 조금 보다 말았는데 이제 조금씩 다시 시작을 해야 하나 하는 생각이 든다.

 

요즘 관심을 가지고 공부하고 있는 perl 이 아직 순위권 내에 있는 게 반갑다. 뭐 Perl은 두말할 나위 없는 언어다…… 특히 텍스트 처리에 있어서는 타의 추종을 불허 하는 펄…… 너무 좋다. 그리고 코드가 무지 짧다. 가끔은 더럽기도.. ㅋㅋ

거기다 There's more than one way to do the same thing. 라는 펄의 철학도 넘~ 넘~ 멋지다. 난 저 한 줄에 꽂혀서 펄을 시작했다. 아직 많이 알지는 못하지만 언젠간 꼭 고수가 되었음 하는 게 펄이다.

 

이번 달에는 좀 특이한 게 NXT-G 라는 정말 듣고 보도 못한 프로그램이 순위 안에 올라 왔다.

좀 알아보니 National Instruments 라는 회사에서 만든 그래픽 프로그래밍 툴이란다. National Instruments 사는 너무나 유명한 labview 를 만든 회사다

정말 세상에는 너무 다양한 언어가 있고 공부할게 너무 많다.

저 리스트만 봐도 숨이 막힌다. 욕심 나는 언어들은 많은데…… 내 능력은 너무 보잘 것 없고….

Perl, Python, LISP, Ruby, Delphi 까지는 어케든 공부 하고 싶은데…… 아 ~~

ㅋㅋ 선택과 집중을 해야 하나……

 

현재 내가 밥 벌어 먹고 살게 해주고 있는 MATLAB 이 몇 등인지 살펴 봤다.

예전에 봤을 때는 20위권 안에 있었는데…… 지금은 29위로 밀려났다.

MATLAB 가격이 좀 싸지면 순위가 올라 갈라나……

50위 권의 순위에서는 Haskell , Fortran, Tcl, Labview 정도 욕심 난다.


+ Recent posts