Python/자연어처리(NLP)

복합명사를 알아서 추출하는 논문 (JAVA 코드)

공시탈출넘버원 2023. 9. 13. 16:06

일명 후처리라고도 부르는, 복합명사 생성 알고리즘이다.

아래 논문에서 개념을 제시했다. 자바 코드가 있는 부분은 58쪽부터 60쪽 까지다.

 

'A Method for Compound Noun Extraction to Improve Accuracy of Keyword Analysis of Social Big Data', Hyeon Gyu Kim, Sahmyook Univ(삼육대 김현규), Journal of The Korea Society of Computer and Information, Vol. 26 No. 8, pp. 55-63, August 2021.
https://doi.org/10.9708/jksci.2021.26.08.055

 

A Method for Compound Noun Extraction to Improve Accuracy of Keyword Analysis of Social Big Data -Journal of the Korea Socie

Abstract Since social big data often includes new words or proper nouns, statistical morphological analysis methods have been widely used to process them properly which are based on the frequency of occurrence of each word. However, these methods do not pr

koreascience.or.kr

 

구현해서 실험해봤더니,

사람이 한국어 복합명사 집어넣는거랑 비교해서, 속도 면에서는 별 차이가 없고 정확도는 떨어질 수 있다.

대신 한번 코드를 잘 만들면, 사람이 판단 가능한 목록을 순식간에 뽑아준다는 정도.

결국 최종판단은 사람이 하는게 낫고 싸다.

 

무튼 논문 이해하기 쉽게 설명추가.


작동 과정

  1. input '글'
  2. KoNLPy 등으로 형태소 분석 (여기까지가 전처리 pre-processing)
  3. 명사의 빈도 파악
  4. 복합 명사를 만들 수 있는 단어들을 조합하여 후보군 만들기
  5. 후보군 중에 '글'에 실제로 얼마나 있는지 확인
  6. 일정량 이상(논문 기준 5회 이상) 등장하는 복합명사만 단어와 빈도를, 실제 목록으로 이동하여 추출. 끝.

 

후보군 생성 방식

예제는 논문에서 가져왔다.

  • 본문 글은 "붓카게 우동 맛집" 이다.
  • 검출된 명사는 "붓카게", "우동", "맛집" 의 3개이다.
  • 여러 단어 복합명사가 가능하나, 두 단어 복합명사만 추출한다.

 

1. 전수 생성

 * 모든 경우의 수를 후보군에 넣어놓고, 개수를 세어본다.

 

그러면 두단어 복합명사 후보군을 만든다. 모든 경우의 수인 3*2 = 6을 후보군으로 가져온다. 

"붓카게 우동", "뭇카게 맛집", "우동 붓카게", "우동 맛집", "맛집 붓카게", "맛집 우동"

"붓카게 우동 맛집"에서 각 후보군을 조사해보면 "붓카게 우동",  "우동 맛집",이 1회씩 나온다.

실제 존재하는 2개의 후보군만 리스트로 가져온다.

 

2. 점진적 생성

 * 어떤 명사가 검출되었을 때, 그다음 이어진 명사가 무엇인지 검출해서 그것을 후보군으로 집어넣는다.

"붓카게 우동 맛집" 에서 명사를 순서대로 검색한다.

"붓카게"가 나왔다.

다른 단어로 이을 수 있는지 검사한다.

"우동"이 나왔다.

"붓카게 우동"을 리스트에 넣는다.

 

다음 단어로 넘어간다.

"우동"이 나왔다.

다른 단어로 이을 수 있는지 검사한다.

"맛집"이 나왔다.

"우동 맛집"을 리스트에 넣는다.

 

효율 비교

실제 성능은 100kB 이하의 글(3만 자 이내)이면 별 차이가 없으나, 300kB (10만 자 이상)쯤 되면 차이가 많이 난다. 확실히 점진적 생성이 빠르다. 왜냐 하면 전수 생성 방식이 검출 0회짜리 의미없는 명사를 많이 만들고 그게 있는지 찾느라,  시간을 허비하기 때문이다.

 


논문 JAVA 코드에 쓴 변수 이해하기

코드 변수(variable) 의미 설명/비고
keys keywords 명사 복합명사 생성 때 사용
revs reviews 검색하려는 글

논문에서는, 맛집 리뷰)
cands candidates 후보  
toks tokens 토큰 keys 랑 같은 집합이라 봐도 무방
freq frequency 단어 등장빈도  
res result 결과 복합명사와 복합명사가 검출된 빈도

논문 설명에 나오는 집합 기호 이해하기

집합(set) 원소 설명/비고
R review 분석하려는 글들의 목록
S nouns R을 형태소 분석해서 나온, 명사만 모아놓은 목록
T compound nouns S의 원소를 기반으로 만들어낸, 복합명사 목록 또는 복합명사 후보군 목록.

전수 생성 방식 이해하기(논문 58쪽, fig 1)

  1. 후보군 생성: 아무 두 명사나 조합하여 바로 후보군에 넣는다. 경우의 수는, #(S) * ( #(S)-1 )이다.  명사 개수가 10개면 복합명사 후보군에는 10*9=90개가 들어간다.
  2. 본문에서 찾기: 분석하려는 글에 후보군을 순서대로 하나씩 집어넣어서 찾는다. 5회 이상 나타난 복합명사일 때만 최종 리스트에 집어넣는다.
  3. 최종 리스트(복합명사, 빈도)를 반환한다.

점진적 생성 방식 이해하기(논문 59쪽, fig 3)

  1. 토큰 생성: 왜 만드는지는 정확히 모르겠지만, 만들더라. 명사를 순서대로 적으면서 띄어쓰는 듯?
  2. 토큰에서 복합 명사 찾아서 집어넣기: 후보 단어를 하나 만든뒤 바로 후보군에 안넣고, 실제 있는지 검출해보고 있으면 (복합명사, 빈도)를 넣는다.
  3. 검출된 목록을 빈도 내림차순 정렬(큰 숫자가 앞에 옴)하고 5회 이상 나오도록 잘라낸다.