2E2I / mamomo-server

[2022 HSU Capstone] 기부 통합 플랫폼 MaMoMo의 백엔드 페이지 입니다.
5 stars 1 forks source link

텍스트 기반 캠페인 추천 구현 #105

Closed im-shung closed 2 years ago

yuseon-lim commented 2 years ago

TF-IDF

from unittest import result
from sklearn.feature_extraction.text import TfidfVectorizer
from collections import defaultdict
import numpy as np

corpus = ["65세 이상 노인 중 35%는 '나 혼자 산다'통계청 통계개발원에서 발간한 '2021 고령자 통계','국민 삶의 질 2020' 보고서에 따르면 우리나라 65세 이상 고령층 5명 중 약 2명은 독거노인으로 나타났습니다. 혼자 사는 노인은 경제·신체·정서적으로 열악한 환경에 놓여있을 가능성이 높아 가장 취약한 집단으로 꼽힙니다. 또 연령이 높아질수록 다양한 위기 상황에서 도움 받을 곳이 없어 어려움을 겪는데요. 노인 4명 중 1명은 이야기 상대가 필요한데 도움 받을 곳이 없어 정서적인 도움을 받는데 취약한 상태입니다.어르신은 매일 같은 하루를 보냅니다.동트기 전 새벽, 어르신은 눈을 뜨면 창문을 열어 창밖을 바라보면서 하루를 시작합니다. 집 안은 고요하다 못해 삭막한 공기만 가득하고 그 삭막함을 채우는 건 의미 없는 TV소리 뿐입니다. 어르신은 아침 식사하고, TV보고, 창밖을 내다보고, 다시 점심 식사하고, TV를 보는 지루한 일상을 반복하며 살아갑니다. 기상 후 말할 상대가 없어서 입을 뗀 적 없는 어르신에게 몇 마디 여쭙자 목소리가 잠겨서 이야기 하시기기 힘듭니다. 하지만 언제 그랬냐는 듯이 쌓아둔 이야기 보따리를 푸는 어르신입니다. 코로나19로 갈 곳을 잃은 채 매일 반복적인 일상을 보내는 어르신에게 특별한 하루를 선물해보는 어떨까요?어르신이 바라는 건 딱 하나! 외로운 건 싫어요.자식들과 연락이 끊긴 어르신, 세상에 핏줄이라고는 자기 자신 뿐이거나, 자식은 있지만 사정이 좋지 않아 연락하지 못하는 어르신 등 다양한 사정을 가진 어르신들이 많습니다. 하지만 어르신들이 공통적으로 바라는 건 딱 하나입니다.\"외로운 건 싫어요. 누군가랑 말이라도 하고 싶어요.\"'홀로' 어버이날이 아닌 '함께' 하는 어버이날을 만들어주세요. 여러분이 보내주신 응원 댓글은 편지가 되어 어르신에게 직접 전달할 예정입니다. 홀로 외롭게 일상을 보내는 어르신에게 여러분의 마음을 전해주세요.어르신에게 어버이날을 특별한 하루로 만들어주세요.찾아와주는 사람이 없어 늘 외롭지만, 어버이날과 같은 기념일은 어르신을 더욱 더 외롭게 만드는 날입니다. 어르신이 어버이날을 외로운 날이 아닌 더욱 특별한 날로 기억남을 수 있도록 여러분의 도움이 필요합니다. 여러분의 따뜻한 마음을 담은 카네이션 비누 꽃과 참기름&통깨 식료품 세트로 구성된 '웃어 孝' 꾸러미를 저소득 어르신 436명에게 전달하여 어르신의 경제적 부담 절감하고 고독감을 해소하고자 합니다. 어르신의 하루가 특별해질 수 있도록 여러분이 함께 해주세요."]

vectorizer = TfidfVectorizer()
sp_matrix = vectorizer.fit_transform(corpus)

wordToid = defaultdict(int)
for idx, feature in enumerate(vectorizer.get_feature_names()):
    wordToid[feature] = idx

result = defaultdict()

for i, sent in enumerate(corpus):
    print( [ (token, sp_matrix[i, wordToid[token]]) for token in sent.split() ] )

sorted_matrix = sp_matrix[np.argsort(result)]
print(sorted_matrix)

결과

{'1명은': 0, '2020': 1, '2021': 2, '2명은': 3, '35': 4, '436명에게': 5, '4명': 6, '5명': 7, '65세': 8, 'tv를': 9, 'tv보고': 10, 'tv소리': 11, '가능성이': 12, '가득하고': 13, '가장': 14, '가진': 15, '같은': 16, '겪는데요': 17, '경제': 18, '경제적': 19, '고독감을': 20, '고령자': 21, '고령층': 22, '고요하다': 23, '곳을': 24, '곳이': 25, '공기만': 26, '공통적으로': 27, '구성된': 28, '국민': 29, '그랬냐는': 30, '기념일은': 31, '기상': 32, '기억남을': 33, '꼽힙니다': 34, '꽃과': 35, '꾸러 미를': 36, '끊긴': 37, '나타났습니다': 38, '날로': 39, '날이': 40, '날입니다': 41, '내다보고': 42, '노 인': 43, '노인은': 44, '높아': 45, '높아질수록': 46, '놓여있을': 47, '누군가랑': 48, '눈을': 49, '다시': 50, '다양한': 51, '담은': 52, '댓글은': 53, '더욱': 54, '도움': 55, '도움을': 56, '도움이': 57, '독거노인으로': 58, '동트기': 59, '되어': 60, '듯이': 61, '따뜻한': 62, '따르면': 63, '뜨면': 64, '마디': 65, '마음을': 66, '만드는': 67, '만들어주세요': 68, '많습니다': 69, '말이라도': 70, '말할': 71, '매일': 72, '목소리가': 73, '못하는': 74, '못해': 75, '바라는': 76, '바라보면서': 77, '반복적인': 78, '반복하며': 79, '받는데': 80, '받을': 81, '발간한': 82, '보고서에': 83, '보내는': 84, '보내주신': 85, '보냅니다': 86, '보는': 87, '보따리를': 88, '부담': 89, '비누': 90, '뿐이거나': 91, '뿐입니다': 92, '사는': 93, ' 사람이': 94, '사정을': 95, '사정이': 96, '삭막한': 97, '삭막함을': 98, '산다': 99, '살아갑니다': 100, '삶의': 101, '상대가': 102, '상태입니다': 103, '상황에서': 104, '새벽': 105, '선물해보는': 106, '세상에': 107, '세트로': 108, '시작합니다': 109, '식료품': 110, '식사하고': 111, '신체': 112, '싫어요': 113, ' 싶어요': 114, '쌓아둔': 115, '아닌': 116, '아침': 117, '안은': 118, '않아': 119, '어떨까요': 120, '어려움을': 121, '어르신': 122, '어르신들이': 123, '어르신에게': 124, '어르신은': 125, '어르신을': 126, '어 르신의': 127, '어르신이': 128, '어르신입니다': 129, '어버이날과': 130, '어버이날을': 131, '어버이날이': 132, '언제': 133, '없는': 134, '없어': 135, '없어서': 136, '여러분의': 137, '여러분이': 138, '여쭙자': 139, '연락이': 140, '연락하지': 141, '연령이': 142, '열악한': 143, '열어': 144, '예정입니다': 145, '외로운': 146, '외롭게': 147, '외롭지만': 148, '우리나라': 149, '웃어': 150, '위기': 151, '응원': 152, '의미': 153, '이상': 154, '이야기': 155, '일상을': 156, '잃은': 157, '입을': 158, '있도록': 159, '있지만': 160, '자기': 161, '자식들과': 162, '자식은': 163, '자신': 164, '잠겨서': 165, '저소득': 166, '전달하여': 167, '전달할': 168, '전해주세요': 169, '절감하고': 170, '점심': 171, '정서적으로': 172, '정서적인': 173, '좋지': 174, '지루한': 175, '직접': 176, '집단으로': 177, '참기름': 178, '창문을': 179, '창밖을': 180, '찾아와주는': 181, '채우는': 182, '취약한': 183, '카네이션': 184, '코로나19로': 185, '통계': 186, '통계개발원에서': 187, '통계청': 188, '통깨': 189, '특별한': 190, '특별해질': 191, '편지가': 192, '푸는': 193, '필요한데': 194, '필요합니다': 195, '핏줄이라고는': 196, '하고': 197, '하나': 198, '하나입니다': 199, '하는': 200, '하루가': 201, '하루로': 202, '하루를': 203, '하시기기': 204, '하지만': 205, '함께': 206, '합니다': 207, '해소하고자': 208, '해주세요': 209, '혼자': 210, '홀로': 211, '환경에': 212, '힘 듭니다': 213})
  (0, 209)      0.049326362366699
  (0, 191)      0.049326362366699
  (0, 201)      0.049326362366699
  (0, 207)      0.049326362366699
  (0, 208)      0.049326362366699
  (0, 20)       0.049326362366699
  (0, 170)      0.049326362366699
  (0, 89)       0.049326362366699
  (0, 19)       0.049326362366699
  (0, 127)      0.098652724733398
  (0, 167)      0.049326362366699
  (0, 5)        0.049326362366699
  (0, 166)      0.049326362366699
  (0, 36)       0.049326362366699
  (0, 150)      0.049326362366699
  (0, 28)       0.049326362366699
  (0, 108)      0.049326362366699
  (0, 110)      0.049326362366699
  (0, 189)      0.049326362366699
  (0, 178)      0.049326362366699
  (0, 35)       0.049326362366699
  (0, 90)       0.049326362366699
  (0, 184)      0.049326362366699
  (0, 52)       0.049326362366699
  (0, 62)       0.049326362366699
  :     :
  (0, 44)       0.049326362366699
  (0, 93)       0.049326362366699
  (0, 38)       0.049326362366699
  (0, 58)       0.049326362366699
  (0, 3)        0.049326362366699
  (0, 7)        0.049326362366699
  (0, 22)       0.049326362366699
  (0, 149)      0.049326362366699
  (0, 63)       0.049326362366699
  (0, 83)       0.049326362366699
  (0, 1)        0.049326362366699
  (0, 101)      0.049326362366699
  (0, 29)       0.049326362366699
  (0, 186)      0.049326362366699
  (0, 21)       0.049326362366699
  (0, 2)        0.049326362366699
  (0, 82)       0.049326362366699
  (0, 187)      0.049326362366699
  (0, 188)      0.049326362366699
  (0, 99)       0.049326362366699
  (0, 210)      0.098652724733398
  (0, 4)        0.049326362366699
  (0, 43)       0.098652724733398
  (0, 154)      0.098652724733398
  (0, 8)        0.098652724733398
  (0, 209)      0.049326362366699
  (0, 191)      0.049326362366699
  (0, 201)      0.049326362366699
  (0, 207)      0.049326362366699
  (0, 208)      0.049326362366699
  (0, 20)       0.049326362366699
  (0, 170)      0.049326362366699
  (0, 89)       0.049326362366699
  (0, 19)       0.049326362366699
  (0, 127)      0.098652724733398
  (0, 167)      0.049326362366699
  (0, 5)        0.049326362366699
  (0, 166)      0.049326362366699
  (0, 36)       0.049326362366699
  (0, 150)      0.049326362366699
  (0, 28)       0.049326362366699
  (0, 108)      0.049326362366699
  (0, 110)      0.049326362366699
  (0, 189)      0.049326362366699
  (0, 178)      0.049326362366699
  (0, 35)       0.049326362366699
  (0, 90)       0.049326362366699
  (0, 184)      0.049326362366699
  (0, 52)       0.049326362366699
  (0, 62)       0.049326362366699
  :     :
  (0, 44)       0.049326362366699
  (0, 93)       0.049326362366699
  (0, 38)       0.049326362366699
  (0, 58)       0.049326362366699
  (0, 3)        0.049326362366699
  (0, 7)        0.049326362366699
  (0, 22)       0.049326362366699
  (0, 149)      0.049326362366699
  (0, 63)       0.049326362366699
  (0, 83)       0.049326362366699
  (0, 1)        0.049326362366699
  (0, 101)      0.049326362366699
  (0, 29)       0.049326362366699
  (0, 186)      0.049326362366699
  (0, 21)       0.049326362366699
  (0, 2)        0.049326362366699
  (0, 82)       0.049326362366699
  (0, 187)      0.049326362366699
  (0, 188)      0.049326362366699
  (0, 99)       0.049326362366699
  (0, 210)      0.098652724733398
  (0, 4)        0.049326362366699
  (0, 43)       0.098652724733398
  (0, 154)      0.098652724733398
  (0, 8)        0.098652724733398

간단하게 테스트만 해보았음. KoNLPy 이용해서 명사같은거 분리해주고 조사같은 것들은 빼주고 분석해야 할듯!

yuseon-lim commented 2 years ago

텍스트 마이닝 아키텍처

22.4.28 회의 결과

  1. Client → Spring 분석 할 텍스트 전송
  2. Spring → Flask로 텍스트 전송
  3. Flask에서 주요 어휘 추출해 Spring으로 전송
  4. Spring → Elasticsearch 검색 → Client로 전송

텍스트 마이닝 구현 : https://github.com/2E2I/donation-crawler/issues/35

im-shung commented 2 years ago

https://github.com/2E2I/mamomo-server/pull/110