본문 바로가기

Robotics/Software Tech.

python으로 구현한 google crawling and lexical semantics를 통한 어휘간 관계 그래프 표현

(위 이미지는 아래글과 관계가 없음)

최근에 간단한(?) 실험을 하나 해보려고 하는게 하나 있다. 간단하게 설명하면 특정사물을 지칭하는 단어와 그 단어와 이웃하는 단어들간의 관계를 Web에서 크롤링한 데이터로부터 확률적인 값으로 위의 그림과 같이 네트워크를 구축한 뒤에, 입력으로 어떤 두 사물의 이름을 넣었을때 그 사물이름간의 관계를 확률적인 값으로 얻을 수 있을까이다. 복잡한 구조는 아니다. 단순히 단어간의 근접도와 빈도만으로 네트워크를 형성하는 것이니.

실험은 Google 검색엔진에 특정 keyword로 query를 던지고, 나오는 결과의 URL을 Parsing하여 모두 모은뒤에, 각 URL을 방문하여 해당 페이지의 Text 데이터를 긁어온다. 그 Text 데이터에서 html및 script, css등 불필요한 tag들을 모두 제거하고 순수한 Text만 남긴다. 이런 데이터에서 query로 던진 keyword의 전후단어를 그 keyword를 표현하는 feature로 보고 데이터들을 처리하여 분석했다.

android
apple
computer
galaxys
google
ios
iphone
ipad
mobile
motorola
samsung
smartphone
tablet

위 word들 간의 관계를 알고자, 데이터를 크롤링하여 분석한뒤에 무방향 그래프로 표현하니 다음과 같이 나타났다.

 
lexical semantics를 network로 표현하면 위 그림고 같은데, 우리가 keyword들을 봤을때 모두 관계가 있어보이는 것들이다. 뉴스에도 자주 언급되고.. 실제 그래프로 표현해보면 관계가 있어보이는것처럼 나오지만, 각 word를 연결해주는 node들은 생각보다 유효하다고 판단할 수 있는 word는 대부분 아니다.

아마 초기 데이터 수집에 불필요한 데이터가 수집되었거나, word의 ambiguity문제가 실제로 실험결과에 반영된 것일수도 있다. 그리고 분석에 grammar를 분석하지 않았기때문에 합성어나 복수, 동사의 시제등도 분석되어 반영된 것이 아니기에 아직은 쓸만한 결론은 나오지 않았다.

근데... 이런 방식으로 어떤 객체를 상징하는 word의 lexical semantics를 만들수 있을지는 아직도 의문이다. 논문같은데서는 pLSA(probabilistic Latent Semantic Analysis)를 이용하기도 하던데.. 공부를 좀 더 한뒤에서 다시...

구현은 python을 이용하였고, 그래프표현을 위해서는 NetworkX, HTML파싱을 위해서는 BeautifulSoup, 데이터수집을 위해서는 Mechanize를 이용하였다.