-
Notifications
You must be signed in to change notification settings - Fork 0
3. 구문 (syntax)
In short, it is the process that uncovers the hidden structure of linguistic input.
파싱을 하기 위해서는 언어의 문법구조에 대한 이해가 필요하기 때문에 학습데이터를 이용한 supervised parsing이 대부분을 이룬다.
파싱의 과정에서는 많은 종류의 '모호성(ambiguity)'가 발생한다. 파싱의 과정은 처음부터 끝까지 '모호성과의 싸움'이라고 말하여도 틀린 말은 아니다. 한글의 경우 '이'라는 글자는 대명사일 수도 이빨을 뜻는 명사일수도, 혹은 두 개를 의미하는 수사일수도 있다. '이'라는 글자만을 보고서는 이를 알 수 없으며, 문맥 정보를 이용하여 '이 의자는'의 '이'는 지칭 형용사라는 것을 판단할 수 있다. 이와 같이 한 단어에 대하여 여러 개의 형태소가 있을 경우 어떤 형태소가 정확한지 그 모호성을 해결해야 한다.
그러나 이 과정은 part of speech tagging 과정과도 유사하다. 파싱의 목적은 그 뿐이 아니라, provide a structural description that identifies such a break in the intonation. 이는 paraphrasing과도 비슷하며, (x IS-A y) 관계와 같은 knowledge acquisition을 위해서도 선행되어야 하는 작업이다.
(Concept discovery from text, COLING02)는 knowledge acquisition 논문으로 읽어봐도 좋을 것이다
(Syntactic) parsing은 주어진 단어열 W=[w1, ... , wn]의 구조를 파악하기 위한 과정이다. 이 때에는 국소 단어열 (sub word sequences)의 tag sequence가 필요하다. 예를 들어 [조사, 부사]는 나올 수 없지만, [조사, 명사]는 말이 됨을 알아야 한다. 이와 같은 문법구조를 바탕으로 parsing을 하는 방법을 Context Free Grammer (CFG)라 하고, 이에 대하여 단어열과 범주열의 확률을 고려하는 probablistic CFG (PCFG)가 제안되었다. 이에 대해서는 Dan. Jurafsky의 저서와 강의자료를 참고하기 바란다.
CFG의 search space는 hierarchical clustering과 같기 때문에 O(n3)이고, 이 중에서 말이 될법한 syntactic structure는 사실 그리 많지 않다. 그렇기 때문에 PCFG를 하는 과정에서 확률값이 적은 결과들을 사전에 제거하는 dynamic programming 방식의 알고리즘들이 이용되고 있다. 또한 probability가 제공되기 때문에 k-best syntac analyses를 결과물로 만들 수도 있다.
여하튼 CFG나 PCFG를 하기 위해서는 학습데이터가 필요한데, 이를 위한 데이터 형태를 treebank라 한다.
![treebank image](image ttt)
In fact, the parser does not necessarily need any explicit grammer rules as long as it can faithfully produce a syntac analysis for an input sentence, although the information usd by the rained parser can be said to represent a set of implicit grammer rules.
treebank representation은 (1) dependency graph와 (2) phrase structure tree가 있다.
TBD
TBD
TBD
encoding 해결: 문장 종료(.)와 같은 encoding이 각각 다를 수 있음. 그 외에 우리가 겪을만한 encoding 관련 문제는 무엇이 있는가?
- Java를 Windows에서 Eclipse를 이용하여 작업할 경우, 기본 encoding은 cp949(euc-kr의 변형)를 따른다. utf8이 권장되는 만큼 이를 바꿔보자.
- Package explorer -> 해당 Java project root 우클릭 -> Properties -> Resource -> Text file encoding, 'UTF-8' 선택.
- *.java 파일이 utf8로 저장됨. file read, write의 기본 encoding도 역시 utf8로 설정.
- 만약 이전에 cp949로 작업하던 *.Java파일에 한글 주석이 있다면 위와 같은 방식으로 project의 encoding을 바꿀 경우,
- 주석의 한글이 모두 깨지게 되니 이를 유념.
- mysql의 table default encoding은 latin1이기 때문에 한글 입력이 안된다. 이를 해결하기 위해서는 기본 encoding을 바꿔줘야 함. 이에 관해 먼저 링크를 둔다. 이후 링크된 블로그 내용을 정리
(TBD)
- Java에서 데이터베이스를 연결할 때 이용하는 Connection class는 DB와의 통신 encoding으로 latin1을 사용. 이 때는 다음과 같이 connection을 하여야 한다.
import java.sql.Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/YOURDBNAME&characterEncoding=utf8&user=YOURID&password=YOURPASSWORD");
- 그 외의 경우를 리스트업해보자
Parsing은 단어열이 나뉘어져 있다고 가정한다. 영어의 경우 한 단어가 하나의 형태소에 해당하지만 한국어의 경우 한 어절에 여러 형태소가 존재한다. 하지만 parsing은 각 형태소가 나뉘어져 인지됨을 가정하기 때문에 word segmentation이 선행되어야 한다. 극단적으로 중국어의 경우에는 word segmentation이 parsing, pos tagging의 거의 대부분이 되기도 한다. (왜냐하면 중국어의 경우 characters 숫자가 많아서 글자별 범주 모호성은 매우 줄어들기에)
또한 형태소의 정보를 통하여 많은 종류의 모호성이 해결될 수 있다.
TBD
위 내용은 2014년, 서울대학교 데이터마이닝 센터의 내부 스터디 때 작성된 자료이며, 스터디는 Multilingual Natural Language Processing 책을 중심으로 이루어졌습니다. 내용은 CC-BY 4.0 라이센스에 따라 자유롭게 수정, 배포하실 수 있습니다.