Learning & Reasoning/Python - Scikit-learn_Tensorflow

Semantic/Frame Net

이현봉 2016. 5. 27. 22:31

Semantic Net으로 시작했는데 Frame같이 됨.  OOP가 널리 사용되는 지금, Semantic Net의 노드와 Edge가 클래스의 instance들로 구현되기에 이제 Semantic Net과 Frame 구별은 사실 의미없음.

Node와 Edge를 class의 instance로 만듬. Node가 여러 타입이 될 수 있게 했음.  Edge도 역시.  따라서 하나의 노드에 multiple incoming relation/edge가 있고, multiple outgoing edge가 있을 수 있음.  Node 타입의 식별을 Base - Sub class로 하지 않고, node의 attribute으로 했음.  Python의 dictionary 같은 기본 데이터구조가 워낙 쓰기 편해 굳이 class hierarchy 구조로 갈 이유가 없음.

Intersection search나 robust한 conflict resolution, special case search 등을 구현하지 않음.  그렇지만 가능할 것임.  

instance_of↔class_of, sub↔super,  has↔part_of,  can_do↔done_by,  requires↔needed_by,  xx_than↔xx.inverse_than 타입의 edge/relation들을 구현하여 적용.  Node type에 따라, relation edge 타입에 따라 transitivity and/or inverse가 성립하는 지, knowledge rep.이 가능하고 이에 따라 relation을 따라 가거나 갈 수 없거나 하게 함.  Recursion의 soundness 판단이 어려움.  Edge-node types combination에 따라 recursion이 다르고 이를 잘 merge해야.  너무 복잡하지 않은가 회의 듬.  

몇 십년 만에 처음 짜 보는 knowledge rep. & reasoning 이기에 가 봄.  Python 연습겸. 

sub-super 관계에 따른 deductive reasoning도 적용한, 생각나는 여러 relation들을 시험.  신기하게도 아직까진 잘 동작. 

Python으로 Symbolic Reasoning 만들기 좋음.  C, Java 보다 확실히 좋고, Lisp와 비교하면, 생각 안남.  

Beginning to have real confidence that this might work out for our project.  

주의) 

- 언어와 그 의미에 바탕한 Semantic Net/Frame은 용어 선정과 의미가 무엇인지 정말 잘 생각해서 써야함.  이 문제로 지금껏 node와 edge의 naming만 세 번 바꿈.  여러 관련 내용들을 잘 읽고 왠만하면 따르도록.

- 실제 world knowledge는 온 갖 exception이 있음.  그리고 영어건 우리말이건 언어 자체가 ambiguous. 받아드리도록.    

- 노드에 따른, relation에 따른 다양한 operation들을 구현하는 것이 간단하지 않음.  노드가 몇 십개만 되어도, 노드가 relation에 따라 다양한 특성을 나타내기에 제대로 동작하는 것인지 파악 쉽지 않음.

- knowledge model 만들기 어려움.  자칫 착각해 집어 넣은 relation다른 relation과 얽혀 cycle을 만들 수 있음. 그러고도 잘 모른다는데 문제.  Debugging 난해함.  Edge/relation을 삽입하기 전에 다시 한번 잘 생각해 이게 꼭 필요한지, 맞는 타입인지, redundant하지 않는지, 이 곳이 맞는 위치인지 묻도록.