๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป IT·๊ธฐ์ˆ ·ํ†ต๊ณ„

[NLP] lexrankr๋กœ 3์ค„ ์š”์•ฝํ•ด๋ณด๊ธฐ

by nowgeun 2023. 2. 15.
728x90

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” lexrankr์„ ์‚ฌ์šฉํ•ด์„œ ์žฅ๋ฌธ์˜ ํ…์ŠคํŠธ๋ฅผ 3์ค„๋กœ ์š”์•ฝํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋งŒ๋งŒํ•œ ๋‰ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ˜ํ”Œ๋กœ ๋„ฃ์–ด์„œ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜์˜ค๋Š”์ง€ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ์ „์— lexrank์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

lexrank

lexrank๋Š” ์ด ๋…ผ๋ฌธ์—์„œ ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ๊ตฌ๊ธ€์˜ ๊ฒ€์ƒ‰์—”์ง„์— ์ ์šฉ๋˜์—ˆ๋˜ PageRank๋ผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฌธ์„œ ์š”์•ฝ์— ์ ์šฉ์„ ํ•œ ๊ฒƒ์ด lexrank์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์›น์‚ฌ์ดํŠธ์˜ URL์ด ๋‹ค๋ฅธ ์›น์‚ฌ์ดํŠธ์—์„œ ๋งํฌ๊ฐ€ ๋งŽ์ด ๊ฑธ๋ ธ๋‹ค๋ฉด ์˜ํ–ฅ๋ ฅ์ด ๋†’๋‹ค๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งํฌ๋ฅผ ๊ฑด ํŽ˜์ด์ง€์˜ ์˜ํ–ฅ๋ ฅ์ด ํด์ˆ˜๋ก ๋งํฌ๋ฅผ ๋ฐ›์€ ํŽ˜์ด์ง€ ๋˜ํ•œ ์˜ํ–ฅ๋ ฅ์ด ๋†’๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ์กด๊ฒฝ์„ ๋ฐ›๋Š” ํ•™์ž๊ฐ€ ์–ด๋–ค ์‚ฌ๋žŒ์„ ์นญ์ฐฌํ•˜๋ฉด, ์นญ์ฐฌ๋ฐ›๋Š” ์‚ฌ๋žŒ์˜ ๊ถŒ์œ„๊ฐ€ ์–ด๋Š ์ •๋„ ์˜ฌ๋ผ๊ฐ€๊ฒ ์ฃ ? PageRank๋Š” ์ด๋Ÿฌํ•œ ๋‚ด์šฉ์„ ์ˆ˜์‹ํ™”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. 

 

lexrank๋Š” ๋ฌธ์„œ ์•ˆ์—์„œ ๋ฌธ์žฅ๊ณผ ๋ฌธ์žฅ์˜ ๊ด€๊ณ„๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ tf-idf ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , PageRank ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜์—ฌ ์ค‘์š”ํ•œ ๋ฌธ์žฅ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์— ์žˆ๋Š” ๋ฌธ์žฅ ๋“ค ์ค‘์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌธ์žฅ๋“ค๊ณผ '๋น„์Šทํ•œ ๋ฌธ์žฅ'์ด ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. PageRank์™€ ๊ฐ™์€ ๋งฅ๋ฝ์œผ๋กœ "๋งŽ์€ '๋น„์Šทํ•œ ๋ฌธ์žฅ'๋“ค๊ณผ ๋น„์Šทํ•œ ํ•  ์ˆ˜๋ก ํ•ต์‹ฌ ๋ฌธ์žฅ"์œผ๋กœ ์—ฌ๊ฒจ์ง‘๋‹ˆ๋‹ค.

 

์†Œ์Šค์ฝ”๋“œ

์ฝ”๋“œ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

from lexrankr import LexRank
from typing import List

class Tokenizer:
    def __call__(self, text: str) -> List[str]:
        tokens: List[str] = text.split()
        return tokens
        
# ์š”์•ฝ ๋Œ€์ƒ ๋ฌธ์„œ ์ •์˜  ## ๋‰ด์Šค ์›๋ฌธ: https://www.yna.co.kr/view/AKR20230215109852003?section=society/education
doc = """๊น€๊ธฐ๋‚จ ์‚ผ์„ฑ์ „์ž[005930] SAIT(๊ตฌ ์ข…ํ•ฉ๊ธฐ์ˆ ์›) ํšŒ์žฅ๊ณผ ๋ฐ•์ •ํ˜ธ SKํ•˜์ด๋‹‰์Šค ๋Œ€ํ‘œ์ด์‚ฌ ๋ถ€ํšŒ์žฅ์ด ํ•œ๋ชฉ์†Œ๋ฆฌ๋กœ ๋ฐ˜๋„์ฒด ์ธ๋ ฅ ์–‘์„ฑ์˜ ์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ–ˆ๋‹ค.
์ด๋“ค์€ 15์ผ ์„œ์šธ ํ”„๋ ˆ์Šค์„ผํ„ฐ์—์„œ ์—ด๋ฆฐ ํ•œ๋ฆผ๋Œ€ ๋„ํ—Œํ•™์ˆ ์›(์›์žฅ ์†กํ˜ธ๊ทผ) ๊ฐœ์› ๊ธฐ๋… ํ•™์ˆ  ์‹ฌํฌ์ง€์—„์—์„œ 'ํ•œ๊ตญ ๋ฐ˜๋„์ฒด ์‚ฐ์—…์˜ ํ˜„ํ™ฉ๊ณผ ๋ฏธ๋ž˜'๋ฅผ ์ฃผ์ œ๋กœ ๊ฐ๊ฐ ๊ธฐ์กฐ์—ฐ์„ค์„ ํ–ˆ๋‹ค.
๊น€ ํšŒ์žฅ์€ "(๋ฐ˜๋„์ฒด) ์ฒจ๋‹จ ๊ธฐ์ˆ  ๊ฒฝ์Ÿ๋ ฅ์„ ๋งŒ๋“ค์–ด๋‚ด๋ ค๋ฉด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ฒฐ๊ตญ ์ธ๋ ฅ"์ด๋ผ๋ฉฐ "์•„๋ฌด๋ฆฌ ์ง€๊ธˆ ์ธ๊ณต์ง€๋Šฅ(AI)๊ณผ ์ฑ—GPT๊ฐ€ ์ž˜ํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋ฐ˜๋„์ฒด ๊ณต์ • ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šตํ•˜์ง€ ์•Š์œผ๋ฉด ์ „ํ˜€ ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค"๊ณ  ๋งํ–ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด์„œ "์šฐ์ˆ˜ํ•œ ์ธ๋ ฅ์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ์ตœ์ฒจ๋‹จ ๊ธฐ์ˆ ๋กœ ๊ทœ๋ชจ์˜ ๊ฒฝ์ œ๋ฅผ ์ด๋ค„์•ผ ํ•œ๋‹ค"๋ฉฐ "์šฐ์ˆ˜ํ•œ ์ธ๋ ฅ์ด ์žˆ์œผ๋ฉด ๊ธฐ์ˆ  ํ˜์‹ ์€ ์ง€์†๋  ๊ฒƒ์œผ๋กœ ํ™•์‹ ํ•œ๋‹ค"๊ณ  ๊ฐ•์กฐํ–ˆ๋‹ค.
๊ทธ๋Š” "์ธ๋ ฅ ์–‘์„ฑ์— ๊ด€ํ•ด ์†”์งํžˆ ๋ง์”€๋“œ๋ฆฌ๋ฉด ์ €ํฌ๋„ ๋ฐ˜๋„์ฒด ๊ณ„์•ฝํ•™๊ณผ๋„ ๋งŒ๋“ค๊ณ  ๋ฌด์ง€ ๋…ธ๋ ฅํ–ˆ๋Š”๋ฐ ์ž˜ ์•ˆ๋œ๋‹ค"๋ฉฐ "๊ธฐ์—…์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์•„๋‹ˆ๊ณ  ๊ตญ๊ฐ€, ํ•™๊ณ„, ์‚ฐ์—…๊ณ„๊ฐ€ ๊ณต๋™์œผ๋กœ ๋…ธ๋ ฅํ•ด ์„ ์ˆœํ™˜ ์‚ฌ์ดํด์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค"๊ณ  ์ œ์•ˆํ–ˆ๋‹ค.
์ •๋ถ€์˜ ๋ฐ˜๋„์ฒด ์œก์„ฑ ์ •์ฑ…์—๋„ ์ตœ๊ทผ ์—ฐ์„ธ๋Œ€ ์‹œ์Šคํ…œ๋ฐ˜๋„์ฒด๊ณตํ•™๊ณผ ์ •์‹œ ๋ชจ์ง‘ 1์ฐจ ํ•ฉ๊ฒฉ์ž ์ „์›์ด ๋“ฑ๋ก์„ ํฌ๊ธฐํ•˜๋Š” ๋“ฑ ๋ฐ˜๋„์ฒด ๊ณ„์•ฝํ•™๊ณผ๊ฐ€ ์ธ์žฌ๋“ค์˜ ์™ธ๋ฉด์„ ๋ฐ›๊ณ  ์žˆ๋‹ค.
๊น€ ํšŒ์žฅ์€ "๊ตญ๊ฐ€๊ฐ€ ํ›Œ๋ฅญํ•œ ์ •์ฑ…์„ ๋งŒ๋“ค๊ณ  ์—ฐ๊ตฌ๊ฐœ๋ฐœ(R&D)์„ ํ†ตํ•ด ํ•™๊ต์—์„œ ์ข‹์€ ์ธ๋ ฅ์„ ์–‘์„ฑํ•˜๋„๋ก ๋’ท๋ฐ›์นจํ•˜๋ฉด ๊ทธ ์ธ๋ ฅ์ด ํšŒ์‚ฌ์— ๋“ค์–ด์™€ ๋ˆ์„ ๋ฒŒ๊ณ  ํšŒ์‚ฌ๋Š” ์žฌํˆฌ์ž๋ฅผ ํ•œ๋‹ค"๋ฉฐ "์ด๋Ÿฐ ์‚ฌ์ดํด์„ ๋งŒ๋“ค๋ฉด ๋ฌธ์ œ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค"๊ณ  ๋งํ–ˆ๋‹ค.
์ด์–ด ์ •๋ถ€ ๋ฐ˜๋„์ฒด ์ •์ฑ…์— ๋Œ€ํ•ด "ํˆฌ์ž ํšจ๊ณผ๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋„์ฒด ์ง€์›์ด๋‚˜ ์œก์„ฑ์ด ํ•„์š”ํ•˜๋‹ค"๋ฉฐ "์ ์–ด๋„ ๊ฒฝ์Ÿ๊ตญ์— ๋’ค์ง€์ง€ ์•Š๋Š” ์ •๋„์˜ ์ง€์†์ ์ธ ์ •์ฑ…์€ ํ•„์š”ํ•˜๋‹ค"๊ณ  ๋ง๋ถ™์˜€๋‹ค.
๋ฐ• ๋ถ€ํšŒ์žฅ๋„ ํ•œ๊ตญ์ด ๋ฐ˜๋„์ฒด ๊ฐ•๊ตญ์˜ ์œ„์ƒ์„ ์ง€ํ‚ค๋ ค๋ฉด โ–ฒ ์šฐ์ˆ˜ ์ธ์žฌ ์œก์„ฑ โ–ฒ ์ •๋ถ€์˜ ๋ฐ˜๋„์ฒด ์ƒํƒœ๊ณ„ ๊ฐ•ํ™” ๋…ธ๋ ฅ โ–ฒ ๋ฏธ๋ž˜ ๊ธฐ์ˆ  ์ค€๋น„๊ฐ€ ํ•„์ˆ˜์ ์ด๋ผ๊ณ  ์ œ์–ธํ–ˆ๋‹ค.
๋ฐ• ๋ถ€ํšŒ์žฅ์€ ์ตœ๊ทผ ๊ธฐ์ˆ  ์ธ์žฌ ํ๋ฆ„์— ๋Œ€ํ•ด "๋งˆ์ดํฌ๋ก ์ด (์ธ์žฌ๋ฅผ) ๋˜‘๋˜‘ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋†“์œผ๋ฉด ์ธํ…”์ด ๋ฐ๋ ค๊ฐ€๊ณ , ๋งˆ์ดํฌ๋ก ์€ ๋นˆ์ž๋ฆฌ์— ์‚ผ์„ฑ๊ณผ SKํ•˜์ด๋‹‰์Šค ์‚ฌ๋žŒ์„ ๋ฝ‘์•„๊ฐ„๋‹ค"๋ฉฐ "๋˜ ์ธํ…”์€ ์ธ์žฌ๋ฅผ ํ‚ค์›Œ๋†“์œผ๋ฉด ๊ตฌ๊ธ€๊ณผ ์—”๋น„๋””์•„๋กœ ๊ฐ„๋‹ค"๊ณ  ์ „ํ–ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด์„œ "์šฐ๋ฆฌ๋„ ์ข‹์€ ์ธ์žฌ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์‹ค์ œ๋กœ ๋” ๊ณ ๋ถ€๊ฐ€๊ฐ€์น˜๋ฅผ ์ฐฝ์ถœํ•˜๋Š” ๊ธฐ์—…์ด ๋” ์ข‹์€ ์ธ์žฌ๋ฅผ ๋ฐ๋ ค๊ฐ„๋‹ค"๋ฉฐ "์ธ์žฌ ์–‘์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ์ €์ถœ์‚ฐ ๋ฌธ์ œ๋งŒํผ์ด๋‚˜ ๋ณต์žกํ•œ ํ•จ์ˆ˜๋ฅผ ํ’€์–ด๊ฐ€์•ผ ํ•œ๋‹ค"๊ณ  ๋ง๋ถ™์˜€๋‹ค.
์•„์šธ๋Ÿฌ ๊ทธ๋Š” "์ตœ๊ทผ์— ๋ฐ˜๋„์ฒด ํ•™๊ณผ์— ์ž…ํ•™ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค๊ฐ€ ํ•™์ƒ๋“ค์ด ์•ˆ ๋“ค์–ด์™”๋‹ค๊ณ  ํ•œ๋‹ค"๋ฉฐ "๊ทธ๋ž˜๋„ (ํ•™์ƒ์ด) ๋งŽ์ด ์ฑ„์›Œ์กŒ๋‹ค๊ณ  ๋“ค์—ˆ์ง€๋งŒ, ํ•™์ƒ๋“ค์—๊ฒŒ๋„ ํ•œ๋ฒˆ ์›Œํฌ์ˆ์„ ๋‚˜๊ฐ€์•ผ ํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค"๊ณ  ๋งํ–ˆ๋‹ค.
๋ฐ• ๋ถ€ํšŒ์žฅ์€ ๋Œ€๊ธฐ์—…๊ณผ ์†Œ๋ถ€์žฅ, ํ•™๊ณ„๊ฐ€ ํ•จ๊ป˜ ๋ฐ˜๋„์ฒด ์ƒํƒœ๊ณ„๋ฅผ ํ™œ์„ฑํ™”ํ•  ํ”Œ๋žซํผ์œผ๋กœ '๋ฏธ๋‹ˆ ํŒน(๊ณต์žฅ)'์„ ๊ตฌ์ถ•ํ•˜๋Š” ์•ˆ๋„ ์ œ์•ˆํ–ˆ๋‹ค.
๋ฏธ๋‹ˆ ํŒน์€ ๋ฐ˜๋„์ฒด ์ƒํƒœ๊ณ„ ๊ธฐ์—…๊ณผ ํ•™๊ณ„์˜ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ๋‚˜ ์‹œ์ œํ’ˆ ๋ถ„์„, ์–‘์‚ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ˜๋„์ฒด ๊ณต์ •์„ ๊ฐ„์†Œํ™”ํ•œ ํ˜•ํƒœ๋กœ ํŒน ์žฅ๋น„ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ์‹œ์„ค์ด๋‹ค.
๋˜ ๋ฐ• ๋ถ€ํšŒ์žฅ์€ "์•ž์œผ๋กœ AI ์ฑ—๋ด‡ ์„œ๋น„์Šค ๋ถ„์•ผ๊ฐ€ ๋ฐ˜๋„์ฒด ์ˆ˜์š”์˜ ์ƒˆ๋กœ์šด 'ํ‚ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์•ฑ)'์ด ๋  ๊ฒƒ"์ด๋ผ๋ฉฐ "AI ์‹œ๋Œ€์— ์ผ์–ด๋‚  ๊ธฐ์ˆ  ํ˜์‹ ์˜ ์ค‘์‹ฌ์— ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜๋„์ฒด๊ฐ€ ์žˆ์„ ๊ฒƒ"์ด๋ผ๊ณ  ๋งํ–ˆ๋‹ค.
๊ทธ๋Š” "์ฑ—GPT ๋“ฑ AI ์‹œ๋Œ€๊ฐ€ ํŽผ์ณ์ง€๊ณ  ๊ด€๋ จ ๊ธฐ์ˆ ์ด ์ง„ํ™”ํ•˜๋ฉด์„œ ๊ธ€๋กœ๋ฒŒ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ, ์ €์žฅ, ์ฒ˜๋ฆฌ๋Ÿ‰์€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚  ์ „๋ง"์ด๋ผ๋ฉฐ "์ด๋Ÿฌํ•œ ํ๋ฆ„ ์†์— SKํ•˜์ด๋‹‰์Šค๊ฐ€ ์„ธ๊ณ„ ์ตœ์ดˆ๋กœ ๊ฐœ๋ฐœํ•œ ์ตœ๊ณ ์† D๋žจ์ธ HBM(๊ณ ๋Œ€์—ญํญ ๋ฉ”๋ชจ๋ฆฌ)์€ AI ์‹œ๋Œ€ ๊ธฐ์ˆ  ์ง„ํ™”์— ํฐ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค"๊ณ  ์†Œ๊ฐœํ–ˆ๋‹ค.
"""

# ํ† ํฌ๋‚˜์ด์ € ์ •์˜
tokenizer = Tokenizer()

# lexrank ๋ชจ๋“ˆ ์ •์˜
lexrank = LexRank(tokenizer, birch_n_clusters=3)
lexrank.summarize(doc)
summaries = lexrank.probe()

for summary in summaries:
    print(summary)
for summary in summaries:
    print([summary])
['๊น€๊ธฐ๋‚จ ์‚ผ์„ฑ์ „์ž[005930] SAIT(๊ตฌ ์ข…ํ•ฉ๊ธฐ์ˆ ์›) ํšŒ์žฅ๊ณผ ๋ฐ•์ •ํ˜ธ SKํ•˜์ด๋‹‰์Šค ๋Œ€ํ‘œ์ด์‚ฌ ๋ถ€ํšŒ์žฅ์ด ํ•œ๋ชฉ์†Œ๋ฆฌ๋กœ ๋ฐ˜๋„์ฒด ์ธ๋ ฅ ์–‘์„ฑ์˜ ์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ–ˆ๋‹ค']
['๋ฐ• ๋ถ€ํšŒ์žฅ๋„ ํ•œ๊ตญ์ด ๋ฐ˜๋„์ฒด ๊ฐ•๊ตญ์˜ ์œ„์ƒ์„ ์ง€ํ‚ค๋ ค๋ฉด โ–ฒ ์šฐ์ˆ˜ ์ธ์žฌ ์œก์„ฑ โ–ฒ ์ •๋ถ€์˜ ๋ฐ˜๋„์ฒด ์ƒํƒœ๊ณ„ ๊ฐ•ํ™” ๋…ธ๋ ฅ โ–ฒ ๋ฏธ๋ž˜ ๊ธฐ์ˆ  ์ค€๋น„๊ฐ€ ํ•„์ˆ˜์ ์ด๋ผ๊ณ  ์ œ์–ธํ–ˆ๋‹ค']
['์•„์šธ๋Ÿฌ ๊ทธ๋Š” "์ตœ๊ทผ์— ๋ฐ˜๋„์ฒด ํ•™๊ณผ์— ์ž…ํ•™ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค๊ฐ€ ํ•™์ƒ๋“ค์ด ์•ˆ ๋“ค์–ด์™”๋‹ค๊ณ  ํ•œ๋‹ค"๋ฉฐ "๊ทธ๋ž˜๋„ (ํ•™์ƒ์ด) ๋งŽ์ด ์ฑ„์›Œ์กŒ๋‹ค๊ณ  ๋“ค์—ˆ์ง€๋งŒ, ํ•™์ƒ๋“ค์—๊ฒŒ๋„ ํ•œ๋ฒˆ ์›Œํฌ์ˆ์„ ๋‚˜๊ฐ€์•ผ ํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค"๊ณ  ๋งํ–ˆ๋‹ค']

17 ๋ฌธ์žฅ์˜ ๋‰ด์Šค ๊ธฐ์‚ฌ๋ฅผ 3 ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์š”์•ฝ๋œ ๋ถ€๋ถ„๋งŒ ๋ด๋„ ๊ธฐ์‚ฌ์˜ ํ•ต์‹ฌ์ ์ธ ๋‚ด์šฉ์€ ๋Œ€๋žต์ ์œผ๋กœ ์ „๋ถ€ ํŒŒ์•…์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์•„๋ž˜๋Š” Konlpy์˜ Okt (ํŠธ์œ„ํ„ฐ) ํ† ํฌ๋‚˜์ด์ €๋ฅผ ํ™œ์šฉํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ์ •์˜ํ•œ ๋„์–ด์“ฐ๊ธฐ ๊ธฐ๋ฐ˜ ํ† ํฌ๋‚˜์ด์ €์™€ ๊ฒฐ๊ณผ๊ฐ€ ํ™•์—ฐํ•˜๊ฒŒ ๋‹ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

 

from typing import List
from konlpy.tag import Okt
from lexrankr import LexRank

class OktTokenizer:
    okt = Okt()
    def __call__(self, text: str) -> List[str]:
        tokens: List[str] = self.okt.pos(text, norm=True, stem=True, join=True)
        return tokens


# ์š”์•ฝ ๋Œ€์ƒ ๋ฌธ์„œ ์ •์˜
## ๋‰ด์Šค ์›๋ฌธ: https://www.yna.co.kr/view/AKR20230215109852003?section=society/education
doc = """๊น€๊ธฐ๋‚จ ์‚ผ์„ฑ์ „์ž[005930] SAIT(๊ตฌ ์ข…ํ•ฉ๊ธฐ์ˆ ์›) ํšŒ์žฅ๊ณผ ๋ฐ•์ •ํ˜ธ SKํ•˜์ด๋‹‰์Šค ๋Œ€ํ‘œ์ด์‚ฌ ๋ถ€ํšŒ์žฅ์ด ํ•œ๋ชฉ์†Œ๋ฆฌ๋กœ ๋ฐ˜๋„์ฒด ์ธ๋ ฅ ์–‘์„ฑ์˜ ์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ–ˆ๋‹ค.
์ด๋“ค์€ 15์ผ ์„œ์šธ ํ”„๋ ˆ์Šค์„ผํ„ฐ์—์„œ ์—ด๋ฆฐ ํ•œ๋ฆผ๋Œ€ ๋„ํ—Œํ•™์ˆ ์›(์›์žฅ ์†กํ˜ธ๊ทผ) ๊ฐœ์› ๊ธฐ๋… ํ•™์ˆ  ์‹ฌํฌ์ง€์—„์—์„œ 'ํ•œ๊ตญ ๋ฐ˜๋„์ฒด ์‚ฐ์—…์˜ ํ˜„ํ™ฉ๊ณผ ๋ฏธ๋ž˜'๋ฅผ ์ฃผ์ œ๋กœ ๊ฐ๊ฐ ๊ธฐ์กฐ์—ฐ์„ค์„ ํ–ˆ๋‹ค.
๊น€ ํšŒ์žฅ์€ "(๋ฐ˜๋„์ฒด) ์ฒจ๋‹จ ๊ธฐ์ˆ  ๊ฒฝ์Ÿ๋ ฅ์„ ๋งŒ๋“ค์–ด๋‚ด๋ ค๋ฉด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ฒฐ๊ตญ ์ธ๋ ฅ"์ด๋ผ๋ฉฐ "์•„๋ฌด๋ฆฌ ์ง€๊ธˆ ์ธ๊ณต์ง€๋Šฅ(AI)๊ณผ ์ฑ—GPT๊ฐ€ ์ž˜ํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋ฐ˜๋„์ฒด ๊ณต์ • ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šตํ•˜์ง€ ์•Š์œผ๋ฉด ์ „ํ˜€ ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค"๊ณ  ๋งํ–ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด์„œ "์šฐ์ˆ˜ํ•œ ์ธ๋ ฅ์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ์ตœ์ฒจ๋‹จ ๊ธฐ์ˆ ๋กœ ๊ทœ๋ชจ์˜ ๊ฒฝ์ œ๋ฅผ ์ด๋ค„์•ผ ํ•œ๋‹ค"๋ฉฐ "์šฐ์ˆ˜ํ•œ ์ธ๋ ฅ์ด ์žˆ์œผ๋ฉด ๊ธฐ์ˆ  ํ˜์‹ ์€ ์ง€์†๋  ๊ฒƒ์œผ๋กœ ํ™•์‹ ํ•œ๋‹ค"๊ณ  ๊ฐ•์กฐํ–ˆ๋‹ค.
๊ทธ๋Š” "์ธ๋ ฅ ์–‘์„ฑ์— ๊ด€ํ•ด ์†”์งํžˆ ๋ง์”€๋“œ๋ฆฌ๋ฉด ์ €ํฌ๋„ ๋ฐ˜๋„์ฒด ๊ณ„์•ฝํ•™๊ณผ๋„ ๋งŒ๋“ค๊ณ  ๋ฌด์ง€ ๋…ธ๋ ฅํ–ˆ๋Š”๋ฐ ์ž˜ ์•ˆ๋œ๋‹ค"๋ฉฐ "๊ธฐ์—…์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์•„๋‹ˆ๊ณ  ๊ตญ๊ฐ€, ํ•™๊ณ„, ์‚ฐ์—…๊ณ„๊ฐ€ ๊ณต๋™์œผ๋กœ ๋…ธ๋ ฅํ•ด ์„ ์ˆœํ™˜ ์‚ฌ์ดํด์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค"๊ณ  ์ œ์•ˆํ–ˆ๋‹ค.
์ •๋ถ€์˜ ๋ฐ˜๋„์ฒด ์œก์„ฑ ์ •์ฑ…์—๋„ ์ตœ๊ทผ ์—ฐ์„ธ๋Œ€ ์‹œ์Šคํ…œ๋ฐ˜๋„์ฒด๊ณตํ•™๊ณผ ์ •์‹œ ๋ชจ์ง‘ 1์ฐจ ํ•ฉ๊ฒฉ์ž ์ „์›์ด ๋“ฑ๋ก์„ ํฌ๊ธฐํ•˜๋Š” ๋“ฑ ๋ฐ˜๋„์ฒด ๊ณ„์•ฝํ•™๊ณผ๊ฐ€ ์ธ์žฌ๋“ค์˜ ์™ธ๋ฉด์„ ๋ฐ›๊ณ  ์žˆ๋‹ค.
๊น€ ํšŒ์žฅ์€ "๊ตญ๊ฐ€๊ฐ€ ํ›Œ๋ฅญํ•œ ์ •์ฑ…์„ ๋งŒ๋“ค๊ณ  ์—ฐ๊ตฌ๊ฐœ๋ฐœ(R&D)์„ ํ†ตํ•ด ํ•™๊ต์—์„œ ์ข‹์€ ์ธ๋ ฅ์„ ์–‘์„ฑํ•˜๋„๋ก ๋’ท๋ฐ›์นจํ•˜๋ฉด ๊ทธ ์ธ๋ ฅ์ด ํšŒ์‚ฌ์— ๋“ค์–ด์™€ ๋ˆ์„ ๋ฒŒ๊ณ  ํšŒ์‚ฌ๋Š” ์žฌํˆฌ์ž๋ฅผ ํ•œ๋‹ค"๋ฉฐ "์ด๋Ÿฐ ์‚ฌ์ดํด์„ ๋งŒ๋“ค๋ฉด ๋ฌธ์ œ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค"๊ณ  ๋งํ–ˆ๋‹ค.
์ด์–ด ์ •๋ถ€ ๋ฐ˜๋„์ฒด ์ •์ฑ…์— ๋Œ€ํ•ด "ํˆฌ์ž ํšจ๊ณผ๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋„์ฒด ์ง€์›์ด๋‚˜ ์œก์„ฑ์ด ํ•„์š”ํ•˜๋‹ค"๋ฉฐ "์ ์–ด๋„ ๊ฒฝ์Ÿ๊ตญ์— ๋’ค์ง€์ง€ ์•Š๋Š” ์ •๋„์˜ ์ง€์†์ ์ธ ์ •์ฑ…์€ ํ•„์š”ํ•˜๋‹ค"๊ณ  ๋ง๋ถ™์˜€๋‹ค.
๋ฐ• ๋ถ€ํšŒ์žฅ๋„ ํ•œ๊ตญ์ด ๋ฐ˜๋„์ฒด ๊ฐ•๊ตญ์˜ ์œ„์ƒ์„ ์ง€ํ‚ค๋ ค๋ฉด โ–ฒ ์šฐ์ˆ˜ ์ธ์žฌ ์œก์„ฑ โ–ฒ ์ •๋ถ€์˜ ๋ฐ˜๋„์ฒด ์ƒํƒœ๊ณ„ ๊ฐ•ํ™” ๋…ธ๋ ฅ โ–ฒ ๋ฏธ๋ž˜ ๊ธฐ์ˆ  ์ค€๋น„๊ฐ€ ํ•„์ˆ˜์ ์ด๋ผ๊ณ  ์ œ์–ธํ–ˆ๋‹ค.
๋ฐ• ๋ถ€ํšŒ์žฅ์€ ์ตœ๊ทผ ๊ธฐ์ˆ  ์ธ์žฌ ํ๋ฆ„์— ๋Œ€ํ•ด "๋งˆ์ดํฌ๋ก ์ด (์ธ์žฌ๋ฅผ) ๋˜‘๋˜‘ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋†“์œผ๋ฉด ์ธํ…”์ด ๋ฐ๋ ค๊ฐ€๊ณ , ๋งˆ์ดํฌ๋ก ์€ ๋นˆ์ž๋ฆฌ์— ์‚ผ์„ฑ๊ณผ SKํ•˜์ด๋‹‰์Šค ์‚ฌ๋žŒ์„ ๋ฝ‘์•„๊ฐ„๋‹ค"๋ฉฐ "๋˜ ์ธํ…”์€ ์ธ์žฌ๋ฅผ ํ‚ค์›Œ๋†“์œผ๋ฉด ๊ตฌ๊ธ€๊ณผ ์—”๋น„๋””์•„๋กœ ๊ฐ„๋‹ค"๊ณ  ์ „ํ–ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด์„œ "์šฐ๋ฆฌ๋„ ์ข‹์€ ์ธ์žฌ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์‹ค์ œ๋กœ ๋” ๊ณ ๋ถ€๊ฐ€๊ฐ€์น˜๋ฅผ ์ฐฝ์ถœํ•˜๋Š” ๊ธฐ์—…์ด ๋” ์ข‹์€ ์ธ์žฌ๋ฅผ ๋ฐ๋ ค๊ฐ„๋‹ค"๋ฉฐ "์ธ์žฌ ์–‘์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ์ €์ถœ์‚ฐ ๋ฌธ์ œ๋งŒํผ์ด๋‚˜ ๋ณต์žกํ•œ ํ•จ์ˆ˜๋ฅผ ํ’€์–ด๊ฐ€์•ผ ํ•œ๋‹ค"๊ณ  ๋ง๋ถ™์˜€๋‹ค.
์•„์šธ๋Ÿฌ ๊ทธ๋Š” "์ตœ๊ทผ์— ๋ฐ˜๋„์ฒด ํ•™๊ณผ์— ์ž…ํ•™ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค๊ฐ€ ํ•™์ƒ๋“ค์ด ์•ˆ ๋“ค์–ด์™”๋‹ค๊ณ  ํ•œ๋‹ค"๋ฉฐ "๊ทธ๋ž˜๋„ (ํ•™์ƒ์ด) ๋งŽ์ด ์ฑ„์›Œ์กŒ๋‹ค๊ณ  ๋“ค์—ˆ์ง€๋งŒ, ํ•™์ƒ๋“ค์—๊ฒŒ๋„ ํ•œ๋ฒˆ ์›Œํฌ์ˆ์„ ๋‚˜๊ฐ€์•ผ ํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค"๊ณ  ๋งํ–ˆ๋‹ค.
๋ฐ• ๋ถ€ํšŒ์žฅ์€ ๋Œ€๊ธฐ์—…๊ณผ ์†Œ๋ถ€์žฅ, ํ•™๊ณ„๊ฐ€ ํ•จ๊ป˜ ๋ฐ˜๋„์ฒด ์ƒํƒœ๊ณ„๋ฅผ ํ™œ์„ฑํ™”ํ•  ํ”Œ๋žซํผ์œผ๋กœ '๋ฏธ๋‹ˆ ํŒน(๊ณต์žฅ)'์„ ๊ตฌ์ถ•ํ•˜๋Š” ์•ˆ๋„ ์ œ์•ˆํ–ˆ๋‹ค.
๋ฏธ๋‹ˆ ํŒน์€ ๋ฐ˜๋„์ฒด ์ƒํƒœ๊ณ„ ๊ธฐ์—…๊ณผ ํ•™๊ณ„์˜ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ๋‚˜ ์‹œ์ œํ’ˆ ๋ถ„์„, ์–‘์‚ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ˜๋„์ฒด ๊ณต์ •์„ ๊ฐ„์†Œํ™”ํ•œ ํ˜•ํƒœ๋กœ ํŒน ์žฅ๋น„ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ์‹œ์„ค์ด๋‹ค.
๋˜ ๋ฐ• ๋ถ€ํšŒ์žฅ์€ "์•ž์œผ๋กœ AI ์ฑ—๋ด‡ ์„œ๋น„์Šค ๋ถ„์•ผ๊ฐ€ ๋ฐ˜๋„์ฒด ์ˆ˜์š”์˜ ์ƒˆ๋กœ์šด 'ํ‚ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์•ฑ)'์ด ๋  ๊ฒƒ"์ด๋ผ๋ฉฐ "AI ์‹œ๋Œ€์— ์ผ์–ด๋‚  ๊ธฐ์ˆ  ํ˜์‹ ์˜ ์ค‘์‹ฌ์— ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜๋„์ฒด๊ฐ€ ์žˆ์„ ๊ฒƒ"์ด๋ผ๊ณ  ๋งํ–ˆ๋‹ค.
๊ทธ๋Š” "์ฑ—GPT ๋“ฑ AI ์‹œ๋Œ€๊ฐ€ ํŽผ์ณ์ง€๊ณ  ๊ด€๋ จ ๊ธฐ์ˆ ์ด ์ง„ํ™”ํ•˜๋ฉด์„œ ๊ธ€๋กœ๋ฒŒ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ, ์ €์žฅ, ์ฒ˜๋ฆฌ๋Ÿ‰์€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚  ์ „๋ง"์ด๋ผ๋ฉฐ "์ด๋Ÿฌํ•œ ํ๋ฆ„ ์†์— SKํ•˜์ด๋‹‰์Šค๊ฐ€ ์„ธ๊ณ„ ์ตœ์ดˆ๋กœ ๊ฐœ๋ฐœํ•œ ์ตœ๊ณ ์† D๋žจ์ธ HBM(๊ณ ๋Œ€์—ญํญ ๋ฉ”๋ชจ๋ฆฌ)์€ AI ์‹œ๋Œ€ ๊ธฐ์ˆ  ์ง„ํ™”์— ํฐ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค"๊ณ  ์†Œ๊ฐœํ–ˆ๋‹ค.
"""

# ํ† ํฌ๋‚˜์ด์ € ์ •์˜
tokenizer = OktTokenizer()

# lexrank ๋ชจ๋“ˆ ์ •์˜
lexrank = LexRank(tokenizer,birch_n_clusters=3)
lexrank.summarize(doc)
summaries = lexrank.probe()

for summary in summaries:
    print([summary])
['๊น€ ํšŒ์žฅ์€ "๊ตญ๊ฐ€๊ฐ€ ํ›Œ๋ฅญํ•œ ์ •์ฑ…์„ ๋งŒ๋“ค๊ณ  ์—ฐ๊ตฌ๊ฐœ๋ฐœ(R&D)์„ ํ†ตํ•ด ํ•™๊ต์—์„œ ์ข‹์€ ์ธ๋ ฅ์„ ์–‘์„ฑํ•˜๋„๋ก ๋’ท๋ฐ›์นจํ•˜๋ฉด ๊ทธ ์ธ๋ ฅ์ด ํšŒ์‚ฌ์— ๋“ค์–ด์™€ ๋ˆ์„ ๋ฒŒ๊ณ  ํšŒ์‚ฌ๋Š” ์žฌํˆฌ์ž๋ฅผ ํ•œ๋‹ค"๋ฉฐ "์ด๋Ÿฐ ์‚ฌ์ดํด์„ ๋งŒ๋“ค๋ฉด ๋ฌธ์ œ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค"๊ณ  ๋งํ–ˆ๋‹ค']
['์•„์šธ๋Ÿฌ ๊ทธ๋Š” "์ตœ๊ทผ์— ๋ฐ˜๋„์ฒด ํ•™๊ณผ์— ์ž…ํ•™ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค๊ฐ€ ํ•™์ƒ๋“ค์ด ์•ˆ ๋“ค์–ด์™”๋‹ค๊ณ  ํ•œ๋‹ค"๋ฉฐ "๊ทธ๋ž˜๋„ (ํ•™์ƒ์ด) ๋งŽ์ด ์ฑ„์›Œ์กŒ๋‹ค๊ณ  ๋“ค์—ˆ์ง€๋งŒ, ํ•™์ƒ๋“ค์—๊ฒŒ๋„ ํ•œ๋ฒˆ ์›Œํฌ์ˆ์„ ๋‚˜๊ฐ€์•ผ ํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค"๊ณ  ๋งํ–ˆ๋‹ค']
["๋ฐ• ๋ถ€ํšŒ์žฅ์€ ๋Œ€๊ธฐ์—…๊ณผ ์†Œ๋ถ€์žฅ, ํ•™๊ณ„๊ฐ€ ํ•จ๊ป˜ ๋ฐ˜๋„์ฒด ์ƒํƒœ๊ณ„๋ฅผ ํ™œ์„ฑํ™”ํ•  ํ”Œ๋žซํผ์œผ๋กœ '๋ฏธ๋‹ˆ ํŒน(๊ณต์žฅ)'์„ ๊ตฌ์ถ•ํ•˜๋Š” ์•ˆ๋„ ์ œ์•ˆํ–ˆ๋‹ค"]

๋ฌธ์žฅ ์ˆ˜๋ฅผ ์ ๊ฒŒ ๋ฝ‘์„ ๋•Œ๋Š” tf-idf ๋ฒกํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ ์ „์ฒ˜๋ฆฌ ์ž‘์—…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Tokenizer์˜ ์„ฑ๋Šฅ์— ๊ฒฐ๊ณผ๊ฐ€ ํฌ๊ฒŒ ์ขŒ์šฐ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Tokenizer ๋ถ€๋ถ„์€ Konlpy์˜ Twitter๋“ฑ ์—ฌ๋Ÿฌ ํ† ํฌ๋‚˜์ด์ €๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๊ณจ๋ผ์„œ ์“ฐ์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€