Lecture 7 의미분석 part1
Shared on October 9, 2026
영상을 많이 해주셨겠죠. 많이 하실 수 있지만 오늘 수업 있는데 지장은 없을 거고 안 하는 게 없을 겁니다. 그리고 다음 주 화요일에 우리 퀴즈 수업 시작할 때 간단하게 하고 수업 일어서 할 테니까 참고해 주시고요. 목요일에 우리 또 추정 메뉴니까 동영상 공부해 드릴 테니까 수강하시고
그것까지가 봅니다. 다음 주 키즈 참고해서 준비해 주시면 되겠습니다. 네. 문 좀 닫아주세요. 이번 주에는 미니 분석 단원이고 다음 주 화요일까지 하면은
부전자연화처리는 제가 생각했던 범위는 다 나갔는데 나중에 워드임베딩 들어가서 이야기를 드리겠지만 2016, 2017년도 유행할 때는 그때쯤 고전자연화처리랑 워드임베딩으로부터 시작된 그리고 딥러닝 기반자연화처리가 문제되어 있던 시기라고 볼 수 있는데 예전이라 생각하실 수도 있지만 10년 전 맞게 안됩니다.
10년 되게 오래전이라 생각하실 수 있겠지만 자유한 처리가 진행되어 왔던 기간에 비하면 불과 10년 사이에 정말 많은 것이 부족하고 한 10년 전만 해도 이런 보전 자유한 처리 방법들과 최신 흐름이 공제되어 있을 것입니다. 그래서 미미 분석이라는 것은 요약해서 이야기 드리면 우리가 지난주까지 TF-IDF까지 해서 구존적인 방식 규칙 기반으로 feature를 잘 만드는 방법에 대해서 다뤘잖아요. 그거를 그냥 놓고 분석하자니 좀 아쉬워요.
특히 벡터들이 좀 sparse해서 0이 많아요. 데크터 성분들이 되게 차원이 크고 그런 거 보통 어떻게 합니까? 머실러닝 수업에서도 차원 축소하거나 그렇게 하죠. 그렇게 자연원 처리 쪽에서도 차원 축소를 해서 연구하려는 흐름들 피처를 단순히 차원 축소해서 쓰려는 흐름도 있었고 그 이면에 이제 차원 축소가 어떻게 진행되는지 보면 성형적으로 그런 성형 공간에서 보다 주요한 축들 위주로 정보가 뽑히다 보니까 아 이 콜포스에 잠재되어 있는 의미를 이끌어서 분석한다
이런 식으로 또 이야기를 하면서 연구가 진행된 것들이 있어요. 그러니까 고전자연화처리 기반으로 만든 feature에다가 성형대수학적인 분석기법을 도입한 분양과 의미 분석이라고 보시면 될 것 같습니다. 그래서 이번주, 다음주 화요일까지 이렇게 배우는 내용은 성형대수, 특히 SVD랑 PC 개념을 알고 계셔야 되고요. 손으로 계산을 다 해야 된다는 건 아니에요. 제가 그런 문제에 대해 건 아닌데 그 개념을 알고 계셔야 돼요. 그래서 우리 수업 과정상에서는 다 앞에 있으니까 기억나실거에요. 흑트이는 기억 안날수도 있지만 그래서 제가 조금은 첨부했지만 강의자료에 기억이 잘 안나신다면 좀 더 살펴보시거나 질문을 주시면 좋겠구요.
뭐 그에 대해 엄청 자세한 설명을 할건 아니고 여튼 그런 사용대수적 기법으로 콜포스를 좀 더 압축적으로 분석하는 기법들 뿐이냐고 보시면 되겠습니다. 반면 이제 우리가 그 다음 넘어갈 거지만, 어디임베딩으로, 어디임베딩을 거쳐서 딥러닝으로 간다면 이거는 그러니까 좀 브라드한 용어로 이야기하면 비선형 구성이 되겠죠. 물론 딥러닝 가면은 거의 무조건 그렇고 단순히 뭐 미니어레이어 한두개 쌓고 뭐 이런 식으로 한 개 쌓고 이런 건 이제
선형 분석이 되겠지만 이제 10년 전 이때쯤에 선형적인 분석과 비선형적인 분석이 혼재되어 있던 시기였고 지금도 장단점은 다르지만 성능을 위한 대부분의 어플리케이션이나 분석은 비선형적으로 너무 홍보죠. 큰 틀에서는 그렇게 봐주시면 될 것 같습니다. 자 출석체크하고 이어서 이렇게 해볼게요. 전자출결 준비해 주시고 네 499입니다 499
자 그래서 오늘 다룰 내용은 제가 KFIDF 배웠지만 이게 조금 아쉬운 게 있다 이야기를 할 거고요 그리고 주제벡터라는 개념을 좀 볼 겁니다. 우리가 그동안 다룬 거는 문서나 문장들, 뭐 문서라고 보통 부르지만요.
그런 어떤 글 덩어리를 벡터화를 시켰는데 각각의 축이였던 단어를 의미하는 그런 형태에만 봤었는데 우리가 어떤 주제에 대해서도 벡터를 형성할 수 있고 혹은 어떤 단어 분서를 벡터로 나타낼 때 각 축이 워드가 아니고 토큰이 아니고 어떠한 성질 토픽이라고 합니다 주제를 다루도록 벡터를 구성할 수도 있겠다 라는 걸 좀 이야기를 드리려고 해요 아직 어떻게 값을 구하는지는 다루지 않아요 이런 게 있으면 좋겠다 이런 개념도 있을 수 있다 좀 더 이야기를 드린 다음에
자 이걸 구하는 가장 쉬운 방법 중 하나가 선형 분석이다 주어진 어떤 프로포스에 대해서 K5F 벡터들 쭉 나열한 매트릭스가 있을 때 얘를 가장 간편한 방식으로는 특입각 분해를 하면 분해된 것들이 나오고 거래기반으로 압축을 시키거나 하면 좀 더 축약된 정보를 뽑아낼 수 있을 겁니다 그렇게 변형된 패턱 그리고 각축들은 잠재 의미를 갖고 있다 이런 식으로 봅니다 말을 그렇게 붙인 거예요. 여러분이 서형대수에서 배웠던 거 똑같은 기법 적용을 여기에 하는 건데 이쪽에선 그렇게 이야기를 합니다.
일리가 있다. 하지만 되게 있어 보이는 워딩치고 막 특별히 다른 거가 없습니다. 서형대수에서 배웠던 거 개념 그대로예요. 그건 머실러닝에서 창원축소 같은 거 했던 거 원리가 같습니다. 자 근데 이거를 좀 더 자세하게 이해를 해보고자 이건 축이 여러개에서 동시에 진행이 되거든요 그래서 축 하나에 대해서 선형 판별 분석을 좀 하고 이게 이제 좀 전쟁이 분석에 어떤 의미냐
조금 이야기를 드리고 필값분에 복습 정도 하면 오늘 거의 훈련이 될 것 같아요 그리고 이걸 계속 이해를 하도록 하겠습니다 자 그래서 먼저 TF-IDF 한 개를 이야기를 해보겠습니다. 물론 아쉬운 점들 많이 좀 아닐 수 있는데 대표적인 것들 뽑아보자면 일단 우리가 지난주 BIM5 이야기할 때도 했는데
기본적으로 생김새가 같은 토큰이어야만 같은 어떤 축에서 카운팅이 됩니다. 그죠? 그 말은 유일어. 그러니까 끝이 거의 같은데 생김색깔 다른 것들은 어떻게 합치기가 어렵습니다. 하지만 방법이 없는 건 아닙니다. 우정자연어처리에서도. 레몬타이제이션을 하면 되죠. 그러면은 만약에 레몬타이저가 잘 만들어져 있을 때 가정이긴 한데 표재형 추출이 잘 되면은
요요들은 한 두 큰으로 모이게 됩니다. 그죠? 그러면은 뭐 카운팅하고 이렇게 처리하는데 문제가 없어요. 하지만 그 우리가 지난주까지 살펴본 고전자연처리의 다양한 파이프라인 중에 뭔가 잘 맞아떨어져야지 우리가 원하는 일련의 요이어 처리라도 이런 거를 좀 다 해낼 수 있는 겁니다. 렘마타이저 잘 만들기가 쉽지 않거든요. 그래서 좀 고전적인 방식 TF-IDF 벡터를 써가지고 지난번에 우리 그거는 스팸 판별이 아니라 리뷰 판별이 있다. 그죠. 금부정. 감정 분석하고
이런 거를 해볼 수는 있겠지만 성능이 아쉬움이 있다. 이제 모델링을 해서 모델을 만들었는데 분류 성능이 아쉬움이 있다 할 수 있는게 모델 자체를 바꿔보고 이런 것도 있겠지만 데이터 쪽에서 뭔가 많이 하게 되는데 특히 그 표현을 바꿀 때 한계가 있다는 거죠. 유연철의 부분입니다. 그래서 유사한 주제를 다룬 혹은 의미를 갖는 문서들끼리 벡터 공간상에서 가까이 있기를 혹은 포상유사도 계산했을 때
높게 나올 수 있게 우리가 피처를 구성하려고 했는데 좀 어려움이 있었습니다 그리고 다음 한계로 지적되는 게 DFIDF에서의 첫 주차, 둘째 주차에서 제가 이야기를 드렸지만 자연어를 뭔가 더 표현으로 변환한다는 것에 있어서 그 변환 단위가 단어 혹은 토큰이 맞습니다 사실은
그래서 사실은 가장 바람직한 단위는 약간 형태소 느낌이에요 영어에서 형태소 분석해서 굳이 잘 쓰지 않는긴 하지만 그러니까 실제 테스트상에서도 의미를 갖는 가장 어떤 작은 단위마다 그 의미를 반영한 벡터랑 일대의 매킹을 시켜줄 수 있다는 매칭을 우리가 그렇게 자연어를 벡토로 바꿔서 표현해 줄 수 있다면 문장이나 문서는 그 벡터의 나열로 하면 되고요. 그죠?
더욱 짧은 어떤 문장이나 단어에 대해서 세세하게 의미를 나타낼 수가 있는 겁니다. 어떻게 하는지 제가 이걸 이야기한 게 아니에요. 각 단어 혹은 가장 엄밀하게는 형태소 같은 의미가 깨지지 않는 가장 다른 단위. 그거를 그에 대응되는 벡터로 아주 잘 표현할 수 있다면 자연어천이 분야에서 자연어를 벡터로 표현하려는 목적 하에서는 거의 성배사 최고의 정교함을 가지게 될 것입니다.
그거보다 쪼개는 건 의미가 무너지니까 형태서보다 더 작은 단위를 벡터로까지 잘 표현하는 건 말이 안되고 최소한으로 쪼개 수 있게, 의의들이 갖는, 더 이상 쪼개 수 있는 단위가 됐을 때 이걸 벡터로 잘 뱉핑시켜 줄 수 있다면 우리가 좋겠는데 백오벌트랑 tfydf는 뭐 그런 게 아예 안 됩니다. 이게 결국 뭐였죠? 제가 이야기 드렸던 게 원합 벡터를 누적시킨 것에 해당했던 거죠. 단어는 원합 벡터로 나타내고 그걸 누적시킨 것을 문장이나 문서로 표현하고
거기에 대해서 뭐 또 tf, idf는 보정을 좀 더 했죠. idf라던가 이런거 이용해서. 한계입니다. 어쩔 수가 없어요. 단어의 백더를 잘 나타내고 싶어요. 우리 선배님들께서는. 요즘 자연적인 공학자들, 엔지니어들이. 하지만 답이 안 나옵니다. 이런 방식으로. 우리가 지금까지 배웠던 방식으로. 하지만 하고 싶어요. 그러면 이것저것 지도하겠죠. 그죠? 제가 도전적으로 이걸 얻기 위한 방법 중 하나인데 여튼 TF-IDF 벡터만 가지고 우리가 뭔가 하기에는
단어에 대한 표현을 도저히 추출할 수가 없어서 좀 많은 아쉬움이 있었다 그리고 유이어를 맵핑시키는 것도 전적으로 표시원 추출 이런 거에 의존하고 그랬는데 앞에 좀 빨리 넘어가면 볼게요. 유이어에 대한 벡터 표현 혹은 유이어가 다른 모습으로 나타나기 때문에 TF-IDF 벡터상에서 다른 축을 차지하고 이런 것 때문에 생기는 문제를 통계적으로 전체 콜포스를 잘 파악해서 싹 한 방에 처리할 수 있으면
좋겠죠. 그렇지 않으면은 사람이 직접 유효를 짝지어 주거나 이래야 된다는 말입니다. 규칙기반으로 관리하면 어려우니까 자 요거 통계적으로 어떻게 좀 잘 보아서 할 수 없을까 이런 고민들도 했었고요. 자 그래서 일단 이제 단어에 대한 벡터 이야기에서 조금 더 마무리를 지어보면은 그래서 고민을 많이 했는데 선배님들께서 그럼 만약에 이 단어의 의미를 벡터로 잘 표현을 하고 싶다 표현을 했다 라고 하면은
이 벡터는 각축이 어떤 의미를 가져야 될까? 라는 고민을 하게 됩니다 우리가 지난주까지 어떤 문서를 벡터로 표현할 때 각축은 조금 더 큰 의미를 가지고 우리는 의도를 한게 약간 의미랑 비슷하게 축이 매겨지기를 의도를 했어요. 하지만 우리 마음대로 되지 않는다는 점. 유일어 같은 경우가 나눠지고 어쩔 수 없는 부분이었는데 단어를 어찌거나 벡터로 잘 나타내고 싶다 했을 때
제가 연방에서 설명할게요. 예를들어 아우디, 칼분다익신, 볼펜 뭐 이런게 있어요. 예를 들어 벡터로 나타내고 싶다 했을 때 결국 의미에 따라서 벡터 표현을 잘 하고 싶은 거거든요. 그래서 이 벡터 안에 있는 각각의 축이 뭔가 의미랑 맵핑 되길 원하는 거고 우리가. 아마도. 그럼 이 각각을 어떻게 부를 수 있을까? 라고 했을 때
주제라고 부르는 겁니다. 보기 시작했습니다. 그래서 만약에 각 단어별로 각 어떤 축 그러니까 주제에 대한 값이 어느 정도인지 매겨진 것을 행렬 형태로 나타낸다면 우리가 단어 주제 행렬이라고 할 수 있겠다. 행렬 할 때 행이 이제 먼저 그 몇 층인지에 해당하는 거죠. 그래서 바로 뒤에 나오지만 단어가 여기 왼쪽에 매겨져 있으면 단어 주제 행렬이고 이걸 전체하면 주제 단어 행렬이라고 부르게 됩니다.
그래서 이건 어떻게 구했는지는 아직 이야기를 드리는게 아닌데 만약에 잘 이런걸 구해서 우리가 가지고 있을 수 있다면 장애인어 처리를 더욱 섬세하게 할 수 있고 그리고 유이어 같은 경우에도 비슷한 벡터가 나온다면 유이어 처리도 되게 잘할 수 있고 여러가지 가능성이 열리게 될 수 있다는 이야기를 드리고 싶은 겁니다. 그래서 단어 주제 횡렬이라는 것은 한쪽 축에 단어들 그리고 한쪽 축에는 일미라고 제가 했지만 주제 이렇게 매겨 가지고
각 단어들을 벡토랑 타는 데이터인데 예를 들어 아우디는 자동차 주제에 대한 정도가 0.55 값을 같고요 애니멀에 대한 값은 없다 자 어떤 주제를 나타낸다고 할 때 어떤 각축이 0이면 상관이 없으면 나타내는 거고요 -+는 뭔가 그 속성에서 -+ 느낌이라고 보시면 됩니다 물론 -는 직관적이지 않을 때도 있어요 근데 이제 여긴 그래서 양수값인데 환경과도 아워기 자동차의 사정 관련이 있죠
그래서 이건 0.45다 예를 들면 이런 식인 거 이런 각 분포를 우리가 잘 만들어 가지고 이 벡터들이 되게 실제 의미에 맞게 잘 각들이 세팅될 수 있다면 좋겠다라는 생각을 했다는 겁니다. 자연철인 공학자들이 자 그리고 뭐 뒤에 바로 나오나? 뒤에 나올 건데 이렇게 이제 그 자연어를 벡터 형태로 표현할 때 지금은 제가 단어를 좀 이야기를 했지만 문서에 대해서도 이렇게 주제들에 대한 벡터를 나타낼 수 있다면
우리가 TF-IDF 단어 특정 토큰에 대해서 카운팅 기반으로 단순히 나타낸 것보다 좀 더 유용한 벡터가 될 수 있겠죠. 좀 더 압축되고 각축이 의미에 직접적으로 대응되는 어떤 벡터가 나올 수 있으면 단순히 단어 카운팅으로 벡터 만든 것보다는 여러 의미를 다루는 테스트에서 쓸 거가 있을 수 있잖아요. 그러니까 Feature 3이 잘 구성된 거잖아요. 만약에 주제의 벡터로 잘 나타낼 수 있으면. 그래서 제가 소개하는 단어에 대해서 했는데 왜냐하면 단어를 어떻게 벡터로 나타낼지 우리가 생각해보신 거 없어서
문서도 주제의 벡터로 잘 나타낼 수 있다면 여러모로 쓸 거만 씁니다. 지금까지 우리가 다뤘던 거는 각 문서를 단어 카운팅 기반한 벡터로 왔다는 거고 이 주제벡터라는 괴리가 있다. 우린 이런 걸 알고 싶었지만 이렇게 봐주시면 될 것 같아요. 그래서 다음 주 화요일까지 우리가 다루는
내용들이 결국은 이 주제벡터들 잘 얻는 것과 연관이 되어 있습니다. 단어에 대한 주제벡터를 얻을 수도 있고 제가 소개를 이렇게 했지만 의미분석으로 얻은 단어 벡터들이 퀄리티가 좋지 않아서요. 보통 문서 주제벡터를 많이 활용하게 되긴 합니다. 하지만 단어에 대한 벡터를 만들 수 있어요. 의미 분석을 이용하면 그래도 안되던 게 된다는게 아주 좋은 수준은 아니지만 이렇게 소개해 드릴 수 있을 것 같고 근데 이걸 어떻게 만드는지 했을 때 또 원재료가 어쨌든 나와야 해요
백오버드 아니면 TF-IDF 벡터들을 모은 걸 원재료로 씁니다 그래서 또 이어지는 거예요 제가 아주까지 배운 거랑 실컷 지금 걔네들 한계가 있다 약점이 있다 얘기 드리지만 거기서 더 처리를 해서 이런 주제백토를 얻는 겁니다 그래서 일단은 예시를 좀 보여드릴 건데 이것도 실제로 의미 분석을 하는 과정은 아니에요 약간 이런게 되면 좋지 않겠어요? 라는 이야기입니다 아직까지는
그래서 tf-idf 벡터가 입력이고 이걸 이용해서 뭔가 주제벡터를 잘 만들 수 있는 알고리즘이 있으면 좋겠다 지금 상황입니다. 그러면 이게 잘 된다면 어떤 식으로 될까를 조금 코드로 나타낸 것입니다. 그래서 처음 일단 여기는 들어오는 문서를 idf 벡터화 시켜 주는 겁니다.
자 이거는 단순 예시라서 우리 두 분이 봤던 t5 idf 생성 방식하고는 다릅니다. 보시면 뭐냐면요 전부 다 스플릿을 하고요. 그래서 cat, dog, apple, lion, nyc, love 이렇게 6개의 토큰이 있는 걸펐서예요. 근데 지금의 어떤 문서가 각각에 대한 tfid 값이 어떻게 되어있다? 랜덤으로 생성을 하는 겁니다. 지금 약간 합성 데이터가 뜬 거예요. 이런 상황이 있을 수 있지 않겠느냐.
그 다음에 우리가 어떤 주제벡터를 만든다 했을 때 이것도 조금은 예시에요. 뒤에 나중에 우리가 실제 의미분성으로 이런 식으로 작동하지는 않습니다. 이건 좀 이상적인 상황을 가정하고 이야기를 드린 건데 예를 들어 우리가 이 Corpus에 대해서 주제벡터를 만들고 싶어요. 단어에 대해서도, 동사에 대해서도. 근데 주제를 우리가 정하고 싶어요. 이 콜퍼스는 뭐냐? 예시를 든거지만 지금. 자 뉴욕시의 센트럴파크와 동물에 관한 그런 어떤 콜퍼스에요. 그런 이야기를 하고 싶어요.
그래서 이 콜퍼스에 대해서는 내가 주제 벡터를 3차원짜리고 각각의 축은 어떤 토픽을 갖느냐? 이것에 대한 독특을 갖도록 잡고 싶다 이겁니다. 이상적인 예시라고 한 이유는 제가 자연어처리 공학자가 특정 콜포스에 대해서 이런 주관을 갖고 이런 벡터를 만들고 싶다 했을 때 자동으로 분석돼서 접정합시다. 이 이것이 얼마나 좋겠느냐 라는 이야기에요. 그래서 주제 3가지는 일단 애완동물, 펫 관련한 것.
동물, 애니멀, 그리고 뉴욕이니까 그래도 어쨌든 시티 세 가지 속성에 대한 각들로, 벡터로 다양한 것들을 나타낼 수 있으면 좋겠다 단어로 보잖아 자, 그랬을 때 이거는 굉장히 어... 또 사람의 주관이 들어가서 저자가 마음대로 만든 예시입니다. 그랬을 때 우리가 결국은 각 주제에 대한 예를 들어 캐슬, 펫니스, 값, 캐슬, 애니벌니스 값 이런 거를 보고 싶은 거긴 한데
그 전에 제가 이런 걸 뭔가 분석해서 만들 때 펫니스, 애니벌니스, 시티니스 라는 걸 어떻게 정의할 수 있는가? 라고 하면은 뭐 이런식이라는 겁니다 손으로 정한거에요 저자가 자 팬니스라는 의미는 아마도 우리가 구석을 해보니까 cat에서의 의미 0.3 더하고 dog 0.3 더하고 애플 라이어는 상관이 없어 뉴욕은 -0.2 정도 곱해서 빼고 love는 0.2 정도 더해주면 이게 팬니스 의미에 해당해
라는 어떤 결과가 있다고 치는 겁니다 무슨 말인지 싶을 거예요. 실제 우리 머릿속에서 의미는 이런 식으로 되어 있지 않아요. 그죠? 하지만 뭐 이런 게 나올 수 있다면 이런 수치를 자동으로 정체를 하게 통계적으로 계산해서 제시해 줄 수 있는 알고리즘이 있다면 좋겠다는 거예요. 지금은 그냥 손으로 적은 거예요. 오른쪽에 나와 있지만 진짜 주제비가 그런가 나중에 나오는데 오른쪽 사연처럼. 이거는 그냥 정한거다. 주제라는게 아직까지 헷갈리실 수 있는데 결국은 각 주제에 대한 어떤 성분값
이걸 좀 주겹게 주시면 되는데요 각 단어를 벡터화할 때 '먹'라는 단어는 아이안 동물과 어중도 관련된가 동물하고 어중도 관련된가 뭐 스티니스, 뭐지 뭐 관련된가 이런 거를 벡터화 시킬 수 있으면 굉장히 의미를 잘 반영한 벡터다 라고 우리가 좀 생각을 하는 거예요 그리고 이 수치를 어떻게 좀 통계적으로 자동으로 보아주면 좋겠다 근데 아까는 손으로 그냥 정한 겁니다 예시네요
자 그래서 이 주제들에 대한 결국 얻고 싶은 건 우리가 이거예요 사실 이건데 어떻게 구하지? 라고 했을 때 또 이 각각의 주제는 뭐를 의미하지? 했을 때 이 주제는 어떤 거대한 프로포스에 등장하는 뭔가 토큰들을 적절한 선형 결합으로 우리가 좀 근사할 수 있겠다라고 가정을 한다는 겁니다. 그래서 앞서 보여드린 예시는 각각의 등록도부터 주제를 대표하는 산식을 만들 수 있다.
평계적으로 발견할 수도 있다. 이걸 이야기 한 거고 그 결과를 좀 매트릭스화 시켜 놓고 보면 지금 좀 보기 힘들게 돼 있는데 이거는 세로가 주제니까 주제 단어 벡터라고 하는 행렬이라고 하는데 이걸 전치를 하면 6x3 행렬으로 나오겠죠. 그러면은 예를 들면은 이제 각 단어를 우리는 벡터로 나타낼 수 있게 된 겁니다. cat은 그러면 0.3, 0.1, 0.0이에요.
각 단어를 숙이고 의미하는 것은 pet this, anyone this, city this에요. dog는 0.3, 0.1, -0.2에요. 둘이 굉장히 비슷하죠. 그런할만하죠. 이 세기 속성에서 보면 이런 벡터들이 잘 나오면 얼마나 좋겠느냐 라는 이야기입니다. 지금까지는. 그래서 앞서 보여드린 이 벡터를 또 벡터 공간상에서 표시하면 이런 그림이 나옵니다.
오.. 뭐 그럴싸하죠. 그래서 보시면은 캣도그 비슷하게 있고 라이언 같은 경우에는 애니멀이 엄청 강하죠. 하지만 전혀 애완동굴이 아니고 시티이랑도 좀 거리가 있는 모습을 보입니다. 그리고 아 애플 그 뉴욕 산생인가 하면서 관련이 있습니다. 그래서 이렇게 좀 뜨는 거예요. pet animal 쪽은 거의 누워있죠. 애플 같은 경우에. 뉴욕시티 NIC도 그렇고. 이런 걸 하고 싶다는 겁니다.
근데 이게 지금 이런 이야기가 우리 의미 분석에서도 유효하고 그다음에 word embedding 넘어가서까지 또 유효한 이야기입니다. word embedding도 결국 통계적으로 단어들 팩트를 어떻게 잘 얻을까에 대한 이야기거든요. 완전 좀... 선형적인 데 보여요. 그래서 학습기반으로 좀 얻고요. 그거는 모두 인베딩은. 지금 의미분석은 학습기반이라고 하긴 좀 애매하고 선형적인 분석을 통해서 이런 주제벡터 같은 것을 이끌어냅니다.
우리가 하고 싶은 건 이거예요. 각각을 주기했던 의미에 대응되고 이런 걸 보고 싶다는 겁니다. 하지만 실제로 잠재 의미 분석을 통해서 나올 이런 축들의 각 축이 뭘 의미하는지 이런 거는 1:1 뱅킹이 어려워요 기계적으로 나온 거예요 실제로는 근데 우리가 하고 싶은 거, 우리 선배님들께서 하고 싶었던 건 이상적으로는 이제 이런 겁니다 이거를 자동으로 이런 거를 도출하고 싶었던 거예요 어떤 프로퍼스를 분석을 했더니 각 단어들에 대한 팩터가 혹은 예를 들면은 뭐
의미축이 몇 개가 있는게 적합한지 자동으로 나오면 좋겠고 어떤 국포스에서는 30개 필요하고 주제가 30개가 뭐보고 예를 들어 이런게 나오면 좋겠다는 거죠 자동으로 정하고 이런건 아직도 쉽지는 않을 거예요 머디빌링도 차원은 적당히 정합니다 여튼 이게 약간 이 표현을 잘 얻는 것이 자연한 주어리에서의 원대한 목표, 선대 같은 것이 없고 많이 해결됐지만 아직도 이게 완벽하다고 하기는 어려워요.
이게 완벽한 건 아니지만 그 이유가 잘 진행되고 있었으면 하고 있는 느낌인데 찐그리지 못한 목표를 이야기해 주신 것 같습니다. 질문이 있을까요? 괜찮으시면 넘어가도 되었습니다
이런걸 하고 싶었는데 이거랑 관련된 분야가 생겨나서 무릎무릎철 아버지 이름 붙였습니다 잠재위기 분석, Latent Semantic Analysis 라는 분야고요 LSA 라고 줄여서 부릅니다 앞서 보여드린 그런 테스트를 자동으로 할 수 있는 알고리즘 기법들 그런 걸 만들고 싶었던 거예요 자 그러면 어디서부터 출발해야 될까 도대체 그게 좀 고민이 됩니다
앞에 거는 완전 사람이 좀 주관에 넣어서 값을 매긴 거에요 그런 식으로 대량의 빈틀에서 할 수는 없거든요 그래서 고민을 했는데 23기에 언어학 쪽에서 군포가설이라는 나중에 또 어드밋이 되는 화요일이 자연화초리에서 아주 써먹기 좋은 이론이 나옵니다. 나와있었던 거죠.
어떤 단어의 의미를 우리가 어떻게 좀 알 수 있을까 사전 없이 따로 정해서 사전이 있는지 어떤 단어의 뜻을 알려면 그 주변 문맥이 그 단어의 뜻을 설명해 주지 않을까 라는 이야기를 있어요 일리가 있죠. 하지만 수학 법칙 같은 것은 아니라서 그쵸? 약간 잘 안 드러나는 경우도 있을 수 있어요. 문명 속에서 어떤 단어가 있는데
하지만 웬만하면 대부분은 나타날 겁니다. 그리고 단순히 한 문장을 보는 게 아니라 대략할쿨퍼스에서 예를 들어 직접이라는 의미를 좀 알고 싶다 라고 하면은 뭐 대략할쿨퍼스에서 주변 이것만 빼고 나머지들 맥락을 봤을 때 이게 과연 뭘까? 라는 어느정도 유출을 할 수 있겠죠 물론 직접 뭐 다이렉트라고 하면은 뭐 인디렉트랑 좀 비교가 되어야 확실하게 나오긴 하는데 어느정도 추측은 적당히 잘 될 겁니다 그죠? 분포가설이라고 하고요 이거를 나중에 또 오드인베디언에서 등장을 할 건데
일단 우리가 지난주까지 배웠던 백업볼드랑 tfydf에서 이미 tfydf에서 같이 출연하는 단어들을 상대적 인도 정보를 전부 포함시켜 놓고 있었습니다. 그러면 순간 그냥 이걸 뭔가 이 전체 그래픽터로 만들면은 여기에서 예를 들면 직접 한번 나왔네? 한번 해줍니다 같이 아..
한번.. 세번.. 네번이라도 치겠습니다 직접과 같이 이렇게 등장한다 등 이런 정보가 간접적으로 들어가 있죠 물론 아주 직접적이지는 않아요 그래서 이걸 어떻게 해결할 수 있는지 이런거는 모듈 배딩 가서 배울건데 자 서로 같이 등장하는 단어들 빈도 비율 이런거를 잘 분석하면은 예를 들어 직접의 뜻은 이거 제외하고 나머지 단어들 분포들에서 좀 유축이 가능하다는 겁니다. 동의 되시나요? 어렵긴 하겠죠.
하지만 직접이라는 예의 뜻이나 빈도 이런거를 나머지로부터 예측을 할 수 있고요. 지금 이 데이터 하나만으로는 어렵지만 직접이라는게 등장한 예를 들어 만개의 데이터가 있다고 하면 나머지 단어들 등장된 것들로 직접 등장된 것들을 약간 예측할 수 있는 회계고대 같은 걸 만들 수 있을 거에요 어떻게든 유추는 약간 가능할 거에요 그래서 단어들 분석할 때 그 주변 단어들이
중요하다. 뭐가 등장했는지. 몇 번씩 등장했는지. 이런 것을 가지고 의미를 좀 알 수 있겠다 라는 생각을 했고요. 그리고 그걸 의미를 어떻게 분석해서 좀 압축주거를 뽑아낼까 고민을 했는데 결국 서형대수적인 압축기법이 쓰이게 되었습니다. 이게 기본이에요. 이거 말고 또 사용적인 방법을 쓸 수도 있고 다양하게 의미를 분석도 이 분야에서 수행을 할 수 있는데 가장 기본은
원재료, back-over-to-open tf-idf를 끌고 모은 데이터입니다. 그걸 행렬로 취급하고 그에 대해서 전형 분석을 수행해서 더 합축된 의미를 이끌어내면 우리가 뭔가 여기 안에 있는 그런 걸 이끌어냈어가라고 이야기를 한다는 겁니다. 숨어있는 의미를 잘 했다라는 뜻에서 레이탐트, 잠재라는 용어를 씁니다. 그래서 일단 텍스트를 backofword나 tfid에 주로
오픈화해서 변화해야 되는 것만 우리가 배웠던 것도 같고요. 그 다음에 그걸 그대로 쓰는 것이 아니고 이거를 좀 요약을 하는 방식이잖아요. 그래서 더욱 댄스해진 어떤 표현을 활용하는 방식. 이거 뭐 피처로 쓸 수도 있고요. 아니면 그 자체만으로 분석을 할 수도 있죠. 마이닝량을 그런 식으로 활용하는 기법이라고 보시면 될 것 같습니다. 그래서 핵심은 SVD인데요. SVD를 쓰였기 때문에.
이게 왜 이런 식으로 이야기 할 수 있느냐 우리가 흥미로리를 이끌어낸다는 식으로 어떻게 이야기 할 수 있는지 안유하자실 것 같은데 그래서 되게 간단 예시로 좀 이게 이렇게 불릴 수 있는 이유 느낌에 대해서 살펴보고자 합니다 그래서 우선은 LSA를 지금 이해하려고 하는 단어인데 LSA는 아니고 LDA도 우리가 나중에 배울 LDA랑 또 따로 있는데 지금 이야기하는 것은 linear distribution journalists라고 해서 선형 판결 분석입니다.
선형적으로 어떤 데이터에 대한 스코어를 표용해서 얻은 다음에 그걸로 분류를 하는 방식입니다. 이걸 좀 한번 살펴볼 거고요. 이게 왜 LSA랑 연결이 되느냐까지 확장을 해볼 겁니다. 그래서 조금 길을 잃기 쉬운 단원이긴 한데 지금 이 단원에서 하고 싶은 것은 단어 혹은 문서에 대한 주제벡터를 잘 얻는 것
일단 그게 최상의 목표니까 계속 기억에 두시고요 그러기 위한 방법으로 프로퍼스를 데이터를 tfi 데이터 평균을 나타낸 다음에 이걸 선형분석에서 압축된 걸 보관 내겠다는 게 에세이 방식이고 그게 지금 안 와 닿을 테니까 좀 더 간단한 lda로 보고자 하는 상황입니다. 결론부터 약간 조금씩 이야기 드리면
뭘 볼 거냐면 스팸 문자 데이터셋을 가지고 LDA를 해볼 거예요 그래서 스팸 문자 데이터셋을 tfi, ffb에 나타낸 다음에 복잡한 러닝 알고리즘 이런 거 안 써요 이런 거 안 쓰고 벡터 공간상에서만 좀 스팸이느냐 정도에 해당하는 벡터를 뽑아낼 수 있습니다 지금은 레이블리드 되어 있는 데이터셋이 있기 때문에 스팸 데이터냐 아니냐가 명확히 이제 레이블 해놨거든요, 사람이.
이걸 기반으로 스팸 리스에 대한 벡터를 뽑을 수가 있어요. 그러면 각각 문서도 전부 벡터가 나올 텐데 그 두 벡터 사이에서 스팸 리스 정도를, 스코어를 점수를 뽑아내면 돼요. 매적하면 됩니다. 그 점수가 나와요. 그 벡터 성분이 얼마만큼을 갖고 있는지. 그게 높으면 스팸일 거고 아니면 스팸이 아닐겠죠. 그런 식으로 간단하게 해볼 겁니다. 그래서 우리가 하려는 것은 분류라는 목적에서 보면 LDA예요.
전형 판결 분석인데 제가 이걸 여기서 보여드리는 이유는 잠재위빈 분석을 예시로써 스팸성에 대한 주제 점수를 뽑는 것에 대한 예시로 봐주시면 될 것 같아요. LSA는 우리가 동영상 강의 목요일부터 보면 자동으로 압축된 K계의 주제에 대한 점수를 뽑아낼 거거든요. 그런 건데 그걸 왜 하려고 하느냐의 예시로 우리가 지금 간단한 예시에서
문서를 tf-idf 벡터화 시키면 되게 알기 어려운 정보들만 납무해요. 상황도 너무 높고. 근데 이걸 싹 정리해서 각 문서의 스팸 정도에 대한 스코어를 딱 떨어뜨릴 겁니다. 이거를 k계축에 대해서 하면 그게 의미 분석이랑 비슷한 거예요. 의미 분석하는 이유는 이렇게 특정 k계의 주요한 주제에 대해서 성분을 뽑기 위한 것도 각 문서나 단어에서 그것을 간단한 예시로 스팸 정도에 대해서 막 뽑아줍니다. 자 그래서 일단 진행을 해보겠습니다.
코드가 많이 있는데 핵심적인 거 주제로 봐주시면 되고요. 앞쪽은 별로 볼 게 없어요. 그냥 세팅이고요. 자 이 NLP아 저자가 만든 라이브러리에서 sms 데이터를 불러올 겁니다. 그리고 전처리를 좀 해주고요. 그 다음에 데이터 간단한 통계를 살펴볼 겁니다. 데이터셋이 몇 개 있다? 데이터가 4837개의 무엇이? sms 문자 메시지가 있습니다.
그중에 여러분이 스팸 디텍션을 하면 저도 거실용이 소개할 때 분류로 제일 많이 이야기하는 예시인데 보통 균형이 안 맞죠. 스팸 데이터를 많이 모으기가 힘들어요. 그래서 보시면 스팸 데이터 개수를 뽑아 봤는데 스팸이라는 수송을 만들어서 1이면 스팸 아니면 0으로 해놔서 그냥 합계를 구하면 개수가 됩니다. 스팸 데이터가 있고요. 638개 정도가 있다고 합니다. 4200 대 638 정도니까
그래서 7개 차이가 나죠. 그런 상황입니다. 기계학습도 들은 학생분들이 많으실 테니까 불균형한 상황 이럴 때 좀 주의를 해야 되는 상황이라고 볼 수 있고 데이터를 조금 보겠습니다. 그러면은 글쎄요. 영어로는 바로 보이지는 않습니다만 처음부터 프리엔트리 어쩌고저쩌고 이게 스팸이고요 프리에미세지 이거는 스팸이라고 합니다
맨 앞에 이름에 넘버링인데 인덱스 느낌표가 붙은 애들은 스팸이에요 그렇게 표시를 해뒀습니다 개략적인 느낌은 오시죠 4800여개 sms 메시지가 있고 600여개 스팸 내용은 대충이래요 detxt 자 이거에 대해서 우리가 일단 tf idf 벡터를 다 만들어 보겠습니다 그거 우리 지난주 배운 대로 하면 됩니다 하면 되는데 일일이 하나하나 하지는 않고요 skrun을 이용해서
간편하게 두 줄이죠 거의 지금 두 줄만에 만들도록 하겠습니다 자 사이킬러는 TFI 벡터라이저를 이용해서 만들어 줄 거고요 근데 토큰아이저는 뭐 NLTK 캐주얼 토큰아이저를 쓰도록 합니다 SMS니까 굉장히 축의하거나 뭐 에모티콘 이런게 만들 수 있겠죠 자 만들고 이건 이제 객체 생성이고 핏 트랜스폰 해야 되죠 핏 트랜스폰 하고 나면은
자 얘네들이 다 처리되가지고 예를 들면은 느낌표 available 있네 available 이런 거에 대해서 count가 tfid표가 나오겠죠 0.1 0.0 이쪽으로 정확한 값을 우리가 모르지만 그렇게 바뀐 결과에 대해서 일단 shape을 확인해 보는 겁니다 옆에 굉장히 동통하니까
4837에 V32인데 지금은 이 축을 의미만 알면 됩니다 4837은 데이터 개수였죠 각각의 데이터는 SMS 메시지 하나에 해당하는 것과 따라서 각각의 SMS들이 9232가 나타나 있는 상황입니다. 이 9232는 왜 그렇게 됐을까? 이 전체 콜포스에서 복캡
무료가 제거 이런 거 다 하고 만든 복캡인 9232개의 복캡들이 나온 상황인 것이죠. 아시겠죠? 우리 그들 지난주까지 여러번 봤죠? 9232는 사실 꽤 적은 겁니다. 몇만 개는 나옵니다. 좀 큰. 그걸 하면 우리가 그런 얘기 들어보셨나요? 여러분들 영어 공부할 때, 단어집도 저는 22000이 된 게 유행이었는데 저 때 10만도 있었고 단어 보면 서점에 있잖아요 한 300개 정도 알면 그 언어 웬만한 단어는 다 안다고 하고
일상적으로 쓰는 단어는 한 몇천 개 정도? 네 아마 대화 그렇게 알려져 있죠. 제가 언각 정보만 아니라서 저도 들은 정본데 근데 이제 이렇게 기계적으로 장애인업 처리 하다보면은 우리가 진짜 비슷한 건데 문장보가 안 잘리는 경우가 있어서 많이 나옵니다. 9000개 정도 나온 거예요. 문자메시지 4000개를 분석을 한 건데 토큰이 9232개가 나왔고 이렇게 구성이 된 겁니다. 각각을 그래서 V32 벡터를 쭉 모아 놓은 행렬이 나왔습니다
스팸 638개 밖에 없는 건 아까 똑같구요 자 그 다음에 LDA는 어떻게 하느냐 이 전체 판을 보고 스팸 정도에 대한 어떤 벡터를 구한 다음에 그걸 이용해서 분류를 수행을 할 겁니다. 굉장히 선형적으로 분석을 하는 것이고 이게 잘 되려면은 이 벡터 공간상에 표현이 잘 나와 있었어야 됩니다. 이렇게 선형적으로 구분할 수 없게 섞여 있으면 약간 일약할 수 없는 진짜 간단한 분류 방식이에요.
그래서 1번 각 클래스의 무게중심을 계산하고 있습니다. 그냥 다 명령해서 무게중심이 그래서 클래스 뭐 있습니까? 스팸, 전스팸, 뭐 행이라고 나와있습니다 밑에는 또 두 개죠? 두 개를 대표하는 무게중심을 구하면 된다는 것이고요. 그 다음에 이걸 있는 직선을 이용해서 스팸 정도 벡터를 구할 거고요. 그 다음에 각 벡터들에 대해서
이 무게중심 벡터 여기 스팸 정도 벡터예요. 이따가 이렇게 이야기할게요. 스팸 정도입니다. 여기 투영을 해가지고 당시 영화적으로 나오는지 보면 어느 클래스에 속하는지 알 수가 있게 되는 겁니다. 이따가 3차원 예시가 나오는데 2차원으로 먼저 제가 그림을 그려볼게요.
예를 들은 겁니다. 이 친구들은 스팸 A예요. 지금 2차원으로 부린 것은 뭐다? 그러면 피셔벡터가 2차원인가 가정한 겁니다. 우리는 지금 몇 차원? 9232. 그렇죠. 시각화를 위해서 엄청 간단하게 한 겁니다. 그리고 좀 많이 찍어야겠는데 정상은 적당히 많이 찍을게요.
얘는 정상이에요. 해임으로 하겠습니다. 이런 분포가 있다고 가정해봅시다. 대개 이렇게 돼있겠죠. 이 정도면 사실 굉장히 쓸만해요. 조금 섞여있지만 분포가 서로 부구분되어 있잖아요. 이 상황에서 어떻게 하느냐? 햄 무게중심 구하는 겁니다. 검은색, 그러니까 스팽인지 아닌지 역을 우리가 아니니까. 이터셋은 그죠? 여기에 대해서 정상 문자들만 구하면 이게 대표하는 좌표라고 보는 겁니다.
볼 수 있는 지인은 애매해요. 너무 이렇게 상계되어 있는데 대충 무게중심 찍어가지고 이게 클래스를 대표하는 정표가 이라고 하면 조금 곤란해지겠죠? 근데 이제 이 LDE에서는 어쩔 수 없다 이겁니다 자 요거를 이제 정상에 대표하는 우계중심부를 구한 거를 우리가 정상이라고 대충 대표각 지급을 하고요 빨간색 스팸도 마찬가지예요 중간에 우계중심부예요 적당히 요쪽 나올 겁니다
스팸 센트로이드를 그랬을 때 다른 색깔이 있는 보라색 여기서 이렇게 벡터를 하나 구하는데 이 친구가 스팸 정도 나타내는 벡터가 될 수 있잖아요. 자 그럼 나머지 모든 데이터들은 사실은 벡터죠.
여기서 이렇게 가는 벡터 드린거잖아요. 이 친구랑 이 친구랑 그러니까 뭐 기하학적으로 표현하면은 이 친구 안에는 이쪽 성분이 어느 정도 들어있는지 각각 다 이 친구 안에는 이 성분이 어느 정도 마이너스로 들어있을 것 같은데 지금 그죠? 이런걸 다 계산을 해서 점수화 시킬 수 있습니다 예를 들어 이 친구는 스팸 정도가 거의 0.01 나올 것 같은데 이 친구는 -0.0 0.1 이렇게 나오고 스팸 쪽인 애들은 강하게 나오고 있죠
이쪽은 뭐 엄청 크게 나올 수 있는데 이 점수 보고 어떤 스트레스 로드를 잡긴 해야 됩니다만 0.5만 0.5 이런 식으로 정해가지고 아 이게 어느 정도 스코어 이상 넘으면 스팸이야 아니면 스팸이 아니야 이렇게 디텍션을 할 수가 있다는 것 하나의 기법이에요 이게 LDE 과정이고요 이렇게 분류를 하는 방식입니다 원래 근데 제가 여기서 이걸 이야기 드리려는 거는
지금 이 LDE의 경우에는 분류 작업이기 때문에 레이블링 되어 있고요 그걸 이용해서 우리가 외부 정보, 레이블링된 정보를 이용해서 우리가 수행하고자 하는 테스크와 관련된 토픽을 벡터를 구했습니다 굉장히 있어요 외부 정보 끌고 와서 스팩리스를 구했는데 이거를 이런 외부 정보, 레이블링 같은 거 없이 자동으로 좀 이 데이터 분포를 딱 봤을 때 어느 축들이 중요한지
이런 걸 뽑아내서 표현을 바꿔주는 게 일미분석이다 이겁니다 그래서 일단 처음 배울 건 svd 인데 우리가 목요일에 pca도 배울 거라서요 기억나시나요? pca 그것도 예를 들어 제일 예시 많이 드는 게 pca 뭐 정복 압축하고 장압축수 할 때 많이 쓰는데 대충 이런 식으로 돼있다 라고 치면 pca 하면 축이 대충 이렇게 그죠 그럼 짱은 거 달려도 이쪽에 대한 어떤 성분만으로도 데이터를 굉장히 잘 표현할 수 있죠.
2차원 데이터를 2차원을 압축시켰는데, 그렇죠? 이런 식으로 이런 주요한 축들을 자동으로 뽑아가지고 원하는 만큼 압축시켜서 쓰는게 또 LSA인데 여기서 왜 잠재위비라고 부르냐면은 우리 TF-IDF 벡터에서는 9232에서는 전혀 보이지 않던 어떤 패턴 같은 게 그래도 좀 고차원이라서 RPC든지 등등 이런 걸로 해놓고 나니까 좀 더 정돈된 결과들 어떤 성격들이 보일 수도 있어요.
그래서 좀 가정이지만 뭐 예를 들어 좋은 상황에서는 지금 이거 스팸 데이터 레이블링이 안 된 상황이에요. 온갖의 cbs 메시지를 다 모아가지고 버티파이드F 만들고 뭐 PC 해가지고 축을 뭐 5개로 줄였는데 이걸 좀 조사해보니까 특정 축의 정보가 이쪽에서의 값이 높게 뜰수록 스팸 메시지의 확률이 높더라. 우리가 추가 조사 해보니까. 이렇게 얻어 걸릴 수도 있는 거예요. 하지만 원하는 것은 아무튼 좀 주요한 의미별로 축을 잘 뽑아서 나타낼 수 있기를 원하는 거고
고창호문에서 이런 게 뽑히니까 주요한 축들이. 장제의미를 뽑는다고 얘네들께서 표현을 하는 겁니다. 여러분들도. 이러는 장제랑은 좀 느낌은 달라요. 수강하는게 없지는 않지만 개형은 이렇구요. 우리 예시에서 다시 보겠습니다. 그래서 각 클래스의 무게중심을 구해야 됩니다. 지금은 데이터가 많아요. 예시를 위해 간단하게 들었지만
스팸인 데이터들 센트로이드 민 구하면 되고요 자 그거 이제 마스크를 하나 만들어 가지고 했습니다 보면 스팸인 친구들 아닌 친구들 스팸인 것들만 지금 트루 세팅되게 만든 거거든요 그러니까 4837개가 있으면 그중에 인덱스 있잖아요 0부터 483, 6까지 그 인덱스에서 스팸인 친구들만 1 지키게 마스크를 만들어 놓고
이렇게 하면 그 친구들만 추출이 됩니다. 그래서 min하면 얘는 스팸인 같은 원리로 반전시키면 정상인 데이터들만이겠죠. 그래서 이렇게 하면 정상 센트로이드 스팸은 여기 잘 닿았어요. 위에 보면 이렇게 좌표가 나온다는 거고 이게 9,000 몇백이에요. 크기가 지금 추가되서 안 보이지만 그 다음에 이 스팸니스 스포 라고 되어 있는데
이렇게 스팸 센트로이드에서 햄 센트로이드를 빼면은 스팸성 정도 그러니까 스팸 쪽 무게 중심 아니 햄 쪽 정상 쪽 무게 중심에서 스팸 쪽으로 향하는 벤터가 나오기 때문에 각 클래스를 대표하는 위치에서 이제 서로 정상에서 스팸으로 가는 방향과 세기 정도인거잖아요. 아래쪽에 시각화가 나와있는데 3차원인데 차원축소를 한 겁니다.
이 3차원 각각의 축이 뭘 의미하나요? 대표적인 변환된 축이에요. 지금 이 의미를 누나는 것은 죽였지 않고요. 여튼 이 스팸데이터랑 정상 데이터 빨간색은 스팸이고요. 초록색은 정상인데 M 데이터 각각 센트로이드에서 가는 벡터를 구하고 보니까 이렇게 구할 수 있다.
근데 여기 코드에서는 벡터를 따로 구해놓은 건 아니고 스코어까지 단번에 구했습니다. 어떻게 했느냐 tfidf-docs에 dot 하면은 각각이 벡터 있죠. 각각 다 벡터죠. 성분들. 각 문서들. 얘네랑 dot 하게 되고요. 그랬을 때 점수가 나옵니다. 0이면 상관이 없고요. 마이너스면 반대 방향이다. 스팸성이 우려 반대 방향으로 작용하고 있다는 거고. 그죠? 플러스면 스팸성이 어느 정도 있다. 그렇게 볼 수 있겠습니다.
이제 이거 가지고 우리가 분류를 할 수 있어요. 있는데 근데 지금은 이 각 분포가 어디까지 인지를 모릅니다. - 어느 정도까지 나왔는지 플러스는 어느 정도까지 나왔는지는 지금은 몰라요. 그래서 이건 이제 lda에서 하는 일인데 lsa랑 좀 상관이 없어요. LTE에서는 정규화를 하고요. 정규화 윗맥스 스킬 한 다음에 0일 사이 기준으로 하고 0.5 보다 높은 스코어를 갖는 데이터들은 스팸이다 라고 한번 가상으로 분류를 우리가 수행을 했습니다.
분류한 결과에 대한 예시가 아래쪽에 나와 있는 거고요. 보면은 처음 예시에서 나온 뭐 이런 것들은 분명 잘 됐네요. spams2, sms5 이런 애들은 잘 스팸이라고 나왔고요. 자 전체 정확도를 보면 이렇고요. confusion matrix를 그려보면은 이렇게 나옵니다. 단 이거는 뭐다? train dataset에서 통짜로 다 쓰고 train dataset의 성능을 본 것이죠. 그렇긴 한데 뭐 특수한 상황이긴 한데
이렇게 할 수 있었다라는 겁니다 여기서 만약에 우리 범인은 아니지만 새로운 데이터가 들어왔다 SMS가 그러면 이 LDA 이용수 분류 어떻게 하면 될까요? 일단 TF-IDF 벡터를 만들어야 됩니다 그래서 기존에 만들었던 어휘집 틀 이용해가지고 TF-IDF 만들어주고 만약에 모르는 단어들이 새로운 sms에 나온다? 못 쓰는 거죠 그건 쓸 수가 없어요.
그래서 TMI를 만들고 스팸데스 벡터, 여기 저장 안 했는데 계산했던 다른 벡터 하나 저장해두고 이 친구랑 내접 구하고 번거롭네요. 자, 미맥스 스케일 한 거 정보도 알아야 돼요. 미맥스 스케일 한 거 적용해 가지고 스케일 점수 낸 다음에 0.5 초간지 이하인지 봐가지고 스팸 여부를 판별해주면 됩니다. 테스트할 수 있어요. 이 상황에서도. 근데 뭐 잘 될지는 모르겠습니다. 봐야 하는거지만 지금은 이렇습니다. 이런 간단한 연인 요소가 거의 없다시피 한데 이걸 기계학습이라고 부르긴죠.
그래서 선형반별이라고 부르고요. 이런 식으로 수행을 할 수 있는데 왜 갑자기 분류가 나오느냐. 이미 분석하다가 제가 앞서도 이야기 드렸지만 지금 이렇게 선형 판별 분석한 과정을 어떻게 우리가 이야기할 수 있냐면은 클래스 정보에 희망하긴 했습니다만 외부적으로 아는 스팸이다 정상이다 이런걸 이용해서 벡터 공간상에서 스팸리스 스팸 문자스러움에 대한 주제의 벡터를 도출했습니다
외부 정보 덕분에 굉장히 신뢰성 있게 벡터가 나왔어요 실제로는 이제 우리가 미지도학습 방식으로 이런 거 좀 구성할 때 이런 게 어렵다 하지만 레이블이 있다 보니까 스팸리스 벡터를 상당히 잘 도출을 했고요 그에 기반해서 각 문서가 스팸리스가 어느 정도인지 계산해 가지고 분류를 할 수 있었습니다 하지만 을미 분석에서는 축 얻는 게 사실 거의 핵심입니다. 얻고 나면은 각 문서의 스펙니스 정보 기상하는 것은 그냥 내적하면 투영하면 알 수 있죠. 점수를.
그래서 내가 표현하고 싶은 벡터에서의 한 축을 값이 완성이 되는 겁니다. 각 축 정보만 벡터만 알고 있으면은. 아래쪽은 무슨 말이냐. 아 그리고 이거는 여기 3차원 공간은 축소되어 있는 공간이라고 제가 아까 이야기를 했습니다. 있긴 한데 좀 이해를 위해서 9,000 몇백 그 아까 공간이 있었죠.
V-2000 TF-IDP 그렇게 만들 때 그 상황이라고 봅시다. 9200 어쩌구에서 0번째 축 1, 2번째 축 어쩌구 저쩌구 이렇게 공쳐봅시다. 얘네는 뭘 의미할까? 원본 벡터 공간에서의 각축. 단어입니다. 그죠? TF-IDF에서 벡터에서 각축 뭐예요? 토큰입니다. 토큰이지만 지금 워절 단위로 거의 뭐하니까. 엄밀인 토큰이고 아마도 단어 혹은 형태소 같은 애들입니다.
그러면 이 축에 대한 정보, 이걸 잘 나타낸, 의미를 잘 나타낸 댄스 벡터입니다. 원래는 못 만들어요. 원래 TF-IDF에서 얘네들은 원화 벡터로 나와요. 그죠? 3차원에서 X축 100. 이 정도 하면은 y축 0,1,0 이런 식으로 나오는 것처럼 각 단어는 원화 벡터로 나오는데 지금 보시면 스팸리스 여기 벡터가 나왔잖아요. 그렇죠?
여기에 투영하면 스포 하나로 나올 겁니다. 이 단어의 스팸리스는 0.1이다. 뭐 이런 식으로 나올 수가 있어요. 지금 방향이 좀 반대되어 있네. 이건 이해하시나요? 변환하기 전에 원래 벡터 공간의 각 축은 뭐다? 토큰이었다 혹은 단어였다. 에덴이 벡터를 얻고 싶다면 지금 이 상황에서 어떻게 하면 된다? 변환하려는 벡터들 축, 각세로 얻으면, 각만 수용을 시키면 축축 성분을 얻을 수가 없다. 그래서 9200 몇십 벡터 공간이었는데 열 개로 줄이고 싶어요. 만약에 자원의 축으로 주요한 축으로 해서.
그렇게 변화를 한 다음에 원래의 9200 몇 개 축, 걔네들은 토큰에 대응되니까 그 축 값이 벡터가 어떻게 바뀌는지를 보면 각 단어가 어떤 벡터값으로 표현되어야 되는지를 우리가 얻을 수가 있다는 겁니다. 결국 축 변환이에요. 공간 변환할 때, 소형대수에서. 그 이야기를 하고 있는 겁니다. 그래서 우리가 앞쪽에서 봤던 것은 문서 주제 벡터를 얻기 위한 것을 봤던 것이고 제가 여기서 추가적으로 이야기 드리는 것은 단어 주제 벡터를 얻을 수도 있다.
그래서 앞서 이야기 드렸지만 결국 의미 분석하려는 이유는 주제 벡터를 잘 얻고 싶음이고 그게 뭐 요소에 대해서 돼도 좋지만 그 전에 안되던 뭔가 성배 같은 것은 단어나 형태소에 대한 주제 벡터를 잘 얻는 것이었는데 우리 앞으로도 할 수 있다 해볼 수 있다. 물론 이게 엄청 잘 되느냐 좀 이슈가 있습니다. 인간이 생각하는 어떤 가장 중요한 축이 어떤 의미에 해당할까 뭐 시티니스 뭐 펜리스 이런 식으로 딱 들어지지 않는 경향이 있는데
그래도 해볼 수 있습니다. 엄청난 고차원 공간을 근거 기반에서 그렇죠. 세형대 조정 인증 수법과 데이터에 기반해서 압축을 할 수가 있습니다. 자 그래서 LDA 이거는 이해를 돕기 위해서 중간에 나왔습니다. LSA의 핵심 원리가 쓰여있다, 노가 들어가있다 라고 봐주시면 될 것 같고요. 그래서 LSA를 할 때는 LDA처럼 지금 하나의 주제에 대해서만 이렇게 벡터 없고 성공 변환하고 이렇게 하는 게 아니고
우리가 원하는 주제에 대해서 벡터 공간 상에서 주제의 스코어로 다 압축시키는 거라고 보면 되겠습니다. 원본 벡터도 변환 압축시키고 원본 축들도 압축시킵니다. 축은 단어에 대응되고 원본 벡터들은 문서에 대응된다. 이렇게 봐주시면 될 것 같아요. 자 그래서 기본적인 가장 기본 방식은 SVD인데 이게 PC 방식 중도 선호가 됩니다. 노이즈 전이나 등등 여러가지 변해서 더 간편하거든요. 그래서 우리도 기술 서대로 볼 거고 오늘은 근데 SVD 복습만 좀
하고 마치도록 하겠습니다. 동영상 앞에서 이어서 SVD 이용한 SA, PCA 기반한 LSA 이야기를 드리겠습니다. 자 잠시 또 저형대술 시간이 되는데 교재가 다르겠죠. 떠올려 주시면 되고요. 예전에 배우셨던 거. 혹시라도 저형대술과 익숙치 않다는 학생분들도
그래도 알아야 될 요소는 좀 여러 가지 제가 준비해 본 건데 질문이 있거나 하면 알려주시기 바랍니다. 자 이제 행렬 이야기입니다. 가로 세로 이렇게 바둑판 벽자 무늬에 수들이 들어가 있는 상황에서 이걸 어떻게 처리하는지 분야로 넘어 왔고요. 왜냐하면 여기서 중요한 입법을 이용해서 ASA를 하다보니까 이게 어떤 의미를 갖는지 최소한 알아야지 이게 이래서 이렇게 되는구나. 이거 사실 학기 말을 배우거나 배울 수도 있는 파트입니다.
혹시 3학년 2학기 기준으로는 특익각분에 했나요? 정답? 표정이 갈려. 조금? 원래 그래요. 학기 말에 진도가 느렸다면 못 들어가고 아니면 뭐.. 아니하면 안 돼. SVD는 들어가지. PC를 하느냐가 좀 이슈인데 아무튼 근데 여러분들이 성형계수 배우고 하는 이유가 크게는 행련연사 기본적으로 알아야 되는 거고
특히 온네나 우리 소프트웨어나 인공지원 쪽에서 두번째는 사실 이 특익각분에 엄청난 지분을 차지하는데 손으로 기상하셔야 되는 건 아닙니다 지금 원리만 알면 돼요 뭐냐면은 특익각분에 배우기 전에 고유값분에 이런 거 배우잖아요 그죠 근데 개인에게 전방행렬 이런 거에 대한 이슈를 다루고 있는 거고 특익각분에는 nxn 실수행렬에 대해서 모두 다 형태가 어떻든 상관없어요 어떻게 아무렇게 생긴 행렬에 대해서 변환을 할 수 있는 비법이에요.
변환하고 나면 이렇게 세 가지 형태로 나옵니다. nxn, nxn 이렇게 세 개가 나오고 앞, 뒤도 중요하지만 가운데가 제일 중요해요. 가운데 시그마로 표현한 이 행렬은 주대각 성분의 al 특익값을 큰 것부터 차례대로 내림차손이 정렬하게 되어 있습니다. 그러니까 이게 좀 더 이 행렬에서 더 중요한 성분이다라고 보시면 돼요. 자상단으로 갈수록.
그래서 행렬악축에 굉장히 요긴하게 쓸 수 있는 기법입니다. 자 기악정렬는 빠르게 가볼게요. 해석하자면 아까 행렬 3개로 나왔는데 분해했을 때 중간에 특익각 쪽이 확대 축소에 해당하고 나머지는 회전에 해당한다. 그래서 이런 의미를 갖고 있다 라고 하고요. 꼭 알아두셔야 될 중요한 포인트는 늘 존재한다는 겁니다. 이 트윗값 분해가 늘 구할 수 있어요. 그래서 정방에서 고육값 이야기하다가 갑자기 이렇게 넘어오는데 보통
저도 선대를 했었어요. 예전에 강의를 그래서. 하지만 이게 중요해요. 고육값도 중요하지. 트윗값 우리 쪽에서는 정말 많이 쓰고요. -저는 어떻게 해야 되겠습니까? 그리고 알아두시면 좋은게 특익값은 유일합니다. 그래서 중간에 시그마는 유일한데 앞에 이 부위는 달라질 수 있어요. 그래서 좀 또 이슈가 있어요. 아까 이야기 드린 이 장제임이 분석을 할 때 결국 차원축소가 핵심인데 SVD를 쓸 수도 있고 PCA를 쓸 수도 있는데 PCA가 여러모로 편하다는 겁니다.
랜덤성이 생길 수 있습니다. 약간 자 그래서 어떤 행렬에 대해서 특이값분에 딱 다 나왔을 때 행렬 3개 나오는데 이 3 자체가 유일하지 않아요. 이렇게 나올 수 있어요. 근데 특이값은 정해져 있기 때문에 이 중간 매트릭스는 유일합니다. 자 그리고 손으로 이걸 해볼 건 아니지만 이것이 왜 중요한지 여러가지 있는데 우리 지금 다루는 책에서 왜 중요한지는 압축에 굉장히 요긴하게 쓰이기 때문입니다
T값 분해를 이용해서 행렬을 전개하면 뭐가 더 중요한 성분이고 뭐가 덜 중요한 성분인지를 알 수가 있게 됩니다 이 친구가 가장 큰 특이값이기 때문에 가장 중요한 어떤 성분이고 그 다음 이런 식으로 랭킹이 떨어지는 거거든요 그랬을 때 하나 둘 하나 이런 식으로 얘네끼리만 취하면은 이거 곱하면은 원고 생렬 형태 나오거든요
가장 중요한 성분으로 볼 수 있습니다 이렇게 계산한 결과 그래서 파란색 동그라미 쳐진 건 뭐냐면 여기서 제일 안 중요한 상품입니다 그래서 이걸 압축해서 표현하고 싶다 하면 저거 잘라버리면 데이터를 덜 쓰면서도 오른쪽 매트리스에서 자를 부분 자르고 부분만 뒤에서 보관하겠다는 부분이라 그랬을 때 나중에 이걸 티코닝 풀 때는 행렬을 3개 꼽혀서 행렬을 만들면 굉장히 왼쪽 온몬 행렬과 유사한 행렬이 나오게 되어 있습니다.
그래서 중요한 것은 우리가 원하는 케이크의 지우고 해야겠다. 지금 뭐 이렇게 별표로 되어 있지만 굉장히 큰 행렬일 수 있어요. 우리가 원하는 그쪽 부분들 남겨 가지고 이 친구들만 취해 가지고 행렬을 저장하고 하는게 낮은계수 분사라고 보시면 되겠습니다. 풀 때는 그냥 나중에 다시 곱하면 돼요. 풀립니다. 거의 비슷한 친구가 나와요.
자 그래서 이건 좀 계산 예시인데 살펴보시면 원본 A의 특입사 이렇게 나와 있습니다. 사실 스팔스 하죠. 스팔스 하긴 한데 여기서 영향력이 큰 두 개의 특입값만을 남겨가지고 나중에 교수센사를 표현을 하라고 해놨습니다. 그래서 특입값분의 한 예시입니다. 아래쪽은. 그랬을 때 이 친구들만 쓰라는 거예요. 특입값 4, 3에 해당하는 성분만. 자 그랬을 때 어떻게 하느냐 4 3 해당하는 거 4에다가
승백 더 0 0 0 0 0 이렇게 했죠 이 친구 이 친구 이 친구 곱한 거 공보를 하나 했고요 그 다음 두번째 전분 까지만 취한 겁니다 자 그렇게 해서 다시 풀어보면 이렇게 나오거든요 머문 행렬이 어땠는지 보면은 여기 1,2가 있는데
얘네는 날아가고 중간에 주요한 3이랑 4는 위치 정확히 이렇게 나오죠 이런 식으로 좀 근사가 된답니다. 자 근데 여러분들 이렇게 보셨을 때 아니 근데 이게 다 쪼개가지고 쪼개면 이거 얼마예요? 그냥 4x5 하나 저장하면 되는 거를 지금 뭐 2x4 저장하고 각 두개 저장하고 2x5 저장하고 별로 안 늘어나는 압축효과가 없는 것 같아요. 그렇죠? 이게 스케일이 커질 때 좀 상당합니다 위력이 보시면은 이런 느낌인데
이미지 압축에 굉장히 좀 베이스라인으로 쓸 수 있는 기법 좀 하나예요 600x465 행렬을 흑백 이미지로 나타낸 게 원본 영상이 이겁니다 좌상자 하나 이거 아마 개수일 텐데 개수예요 저장해야 되는 어떤 각 개수가 279,000개 원래 자 그런데 대충 지금 봅시다 개수 100가지 근사를 하도록 하겠습니다 지금 보시면 365까지 있으니까 작은 자원이 400개 넘게
이렇게 특이값이 나올 수도 있고 그럼 계산해봐야 하는데 특이값이 몇백개 나오거든요 근데 100개까지만 근사하겠다라고 하면은 저장해야 되는 이 숫자 개수 그러니까 행렬 3개로 나와서 행렬 두개랑 특이값 비슷으로 나와서 저장해야 되긴 하는데 그 모든걸 고려했을때도 279,000에서 106,600으로 줄었거든요. 저장해야 될 것들이. 근데 이미지화 시켰을때 좀 문제질 것 같긴 한데 비슷하죠. 거의 뭐 장미 모양 그대로 있죠. 좀 더 난 퀄리티 좋게 근사하고 싶어 하면 150까지 근사해도 되는데
압축효과가 아주 크진 않습니다. 그래서 점점 개수를 계속 컷팅을 해당할 건데 보시면은 진짜 화질 저하가 심하기는 한데 10% 미만으로 필요한 요구 저장 용량이 떨어집니다. 개수 20까지 붙어있습니다. 근데 대충 알아는 볼 수 있죠. 그렇죠. 사실 이미지 압축할 때는 약간 멀티미디어 공학의 산불인데 jpeg나 이런 걸 많이 쓰긴 합니다만 사용 대수만 잘 알아도 이렇게 압축을 할 수 있다는 예약입니다.
자, 개수 1까지 근사, 이건 좀 다 망가졌습니다. 하지만 개수 5도 대단하지 않아요. 밝은 곳, 어두운 곳이 잘 나오죠. 이것은 제가 배웠던 책인데 여러분이 수업이 듣기가 어려워서 학기 말해도 이 머리비를 완전히 그의 svd 라진계수 변상을 나타낸 겁니다. 이게 표준 이미지 중 하나거든요.
거의 교재 표지로 쓸 만큼 소형계수의 위력을 보여주는 기법이라고 보시면 되겠습니다. 자 그래서 lse 작성방식을 본격적으로는 동영상을 살 건데, 간략지만 지금 이야기를 드리면 왼쪽이 이제 tf-idf 행렬입니다 지금 좀 정치가 되어 있는 상황이에요 그쵸? 우리가 아까 봤던 이쪽 축이 tf-idf 벡터고 세로축이 문서인 경우에는 이쪽이 문서고 다큐멘트 0,1,2 이렇게 가고
이쪽이 각 단어인데 그쪽 가로쪽이 이거를 전치를 하면은 이렇게 됩니다 단어 문서 행렬이 돼요 그래서 이 경우에는 이쪽이 tfi-def vector라고 보면 됩니다 여튼 이걸 이용해서 행렬을 만들어 놓은 다음에는 옆에 예시는 뭐냐면 특정 c 개의 특익각으로 확축을 좀 해 놓은 상태입니다 나는 c 개수만큼만 이용해서 여기서 잘라 가지고 표현을 하겠어
라고 했을 때 나오는 정보들 이걸 이용하면 각 단어를 크기 C의 벡터로 표현할 수 있고요 그리고 이걸 전체를 시키면 각 document을 크기 C의 벡터로 표현할 수도 있습니다 이런 식으로 쓰는 겁니다. 기본은. 정보가 훨씬 댄스하게 압축되어서 나오죠. 이게 원본 콜포스에 기반하니까 근거도 있고 변환하는 방식 또한 사용대수적으로 탄탄한 방식을 이용을 하고 있는 겁니다.
자 오늘 여기까지 하겠습니다. 추억용을 잘 보내시고 영상 강의도 잘 듣고 다음 주에 봅시다. -