Deep Learning/NLP

09. 핵심키워드 추출

해파리냉채무침 2023. 3. 25. 01:18

핵심키워드 추출

핵심 키워드 추출이란 문서에서 가장 중요한 단어를 자동으로 추출 

"단어의 중요성을 어떻게 판단할 것인가?"

대량 데이터 처리 가능-> 직접 읽지 않아도 처리할 수 있음

추출의 일관성 -> 정해진 모델 통해서 동일한 기준을 가지고 추출,

모델에서 변화를 줄 수 있는 것은 파라미터(매개변수)임. 모델 자체는 변하지 않음.

실시간 분석이 가능 -> 키워드 추출을 실시간으로 진행

1. 단어 빈도를 활용한 접근 

문서를 단순한 단어모음으로 간주,but 단어의 의미, 구조, 문법, 순서를 고려하지 않음

2. 연어/ 동시발생

n-gram을 통해 일부분 문맥에 대한 부분 처리

예를 들어 '고객 서비스'라는 연어가 있을 때 고객/ 서비스 하면 알 수 없지만 고객 서비스를 같이 보면 무엇을 의미하는지 알 수 있음

 

TF-IDF 핵심 키워드 추출

import requests 
from bs4 import BeautifulSoup
def get_news_by_url(url):
#url='https://n.news.naver.com/mnews/article/018/0004430108?sid=105'
    h = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'}
    res = requests.get(url, headers=h)
    bs = BeautifulSoup(res.content, 'html.parser')
    title = bs.select('h2#title_area')[0].text #제목
    content = bs.select('div#newsct_article')[0].get_text().replace('\n', " ") #본문

    content = content.replace("// flash 오류를 우회하기 위한 함수 추가 function _flash_removeCallback() {}", "")
    return content.strip()
    
docs = []
docs.append( get_news_by_url('https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=105&oid=018&aid=0004430108') )
docs.append( get_news_by_url('https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=101&oid=001&aid=0011614790') )
docs.append( get_news_by_url('https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=102&oid=014&aid=0004424362') )
docs.append( get_news_by_url('https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=101&oid=119&aid=0002402191') )
docs.append( get_news_by_url('https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=101&oid=030&aid=0002882728') )
len(docs)

beautfiulsoup 이용해서 크롤링을 해줍니다 기사 다섯개를 긁어와오 아웃풋은 5가나옴

docs[0]

첫번째 기사 크롤링된 내용이 나옴니다,, 귀찮으니 아웃풋 적는거 생략

from konlpy.tag import Okt
okt = Okt()
import MeCab

preprocessed_docs = []
[t for t in Okt().pos(docs[0]) if t[1][0] in ['N', 'V']] #첫번째 문서 명사랑 동사만 출력

품사 태깅 라이브러리를 임포트 합니다 강의에선 from konlpy.tag import Mecab 하는데 오류나서 Okt를 임포트함

첫번째 기사를 품사 태깅하고 그중 명사와 동사인것만 불러옵니다

from konlpy.tag import Okt
okt = Okt()
import MeCab

preprocessed_docs = []
[t for t in Okt().pos(docs[0]) if t[1] in ['Noun', 'Verb']] #첫번째 문서 명사랑 동사만 출력
[('과', 'Noun'),
 ('정통부', 'Noun'),
 ('유영민', 'Noun'),
 ('장관', 'Noun'),
 ('등', 'Noun'),
 ('참석', 'Noun'),
 ('해', 'Verb'),
 ('기념', 'Noun'),
 ('행사', 'Noun'),
 ('투입', 'Noun'),
 ('여종', 'Noun'),
 ('데이터', 'Noun'),
 ('구축', 'Noun'),
 ('민간', 'Noun'),

구럼 이런식으로 나옴

#문서별로 진행 

from konlpy.tag import Okt
okt = Okt()
import MeCab

preprocessed_docs = []
for d in docs:
    preprocessed_docs.append(' '.join([t[0] for t in Okt().pos(d) if t[1] in ['Noun', 'Verb']]))

문서별 동사와 명사를 뽑아냅니다 

preprocessed_docs #명사계열과 동사 계열만 놔둠

# TF-IDF 계산
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vect = TfidfVectorizer()

tfidf_v = tfidf_vect.fit_transform(preprocessed_docs)
#값 보완
keyword = tfidf_v.tocoo() #to coo matrix 희소행렬 만들기 

n=5 #다섯개 주요 단어 추출
sorted_words= sorted(zip(keyword.col,keyword.data), key = lambda x : (x[1],x[0]),reverse=True)[:5]
sorted_words
[(519, 0.6206116464279655),
 (458, 0.6206116464279655),
 (520, 0.6156554157503018),
 (422, 0.42739138797845844),
 (89, 0.39134484050261176)]

tf-idf 내림차순 다섯개를 보여줍니다

앞에 있는건 단어 순번인데 이 단어를 알아야겠쥬~?

feature_name = tfidf_vect.get_feature_names()

[(feature_name[i],score) for i, score in sorted_words]
[('주행', 0.6206116464279655),
 ('자율', 0.6206116464279655),
 ('중계', 0.6156554157503018),
 ('이동', 0.42739138797845844),
 ('기관', 0.39134484050261176)]