본문으로 건너뛰기
AI SCHOOL
전체 진도0/34 레슨

PART 2 · TRACK 3 · LESSON 3

텍스트 다루기

지금까지 우리는 수치 데이터를 사용해 작업해 왔습니다. 캐빈(또는 핀란드에서는 "mökki") 가격을 예측할 때 캐빈의 크기, 실내 화장실 수 등을 살펴보았습니다. 이러한 모든 특성은 숫자로 표현될 수 있습니다.

예상 학습 시간 60연습문제 2

이 소단원의 핵심 내용

지금까지 우리는 수치 데이터를 사용해 작업해 왔습니다. 캐빈(또는 핀란드에서는 "mökki") 가격을 예측할 때 캐빈의 크기, 실내 화장실 수 등을 살펴보았습니다. 이러한 모든 특성은 숫자로 표현될 수 있습니다.

  • 텍스트 작업
  • 첫 번째 문서의 모든 단어에 대한 모든 tf-idf 계산은 다음과 같습니다.
  • Humpty Dumpty를 코퍼스로 사용해 보겠습니다.
머신러닝 만들기 핵심 개념

III. 텍스트 작업

지금까지 우리는 수치 데이터를 사용해 작업해 왔습니다. 캐빈(또는 핀란드에서는 "mökki") 가격을 예측할 때 캐빈의 크기, 실내 화장실 수 등을 살펴보았습니다. 이러한 모든 특성은 숫자로 표현될 수 있습니다.

하지만 선실에 대한 텍스트 설명도 볼 수 있다면 어떨까요? 예를 들어, 이전 세입자의 리뷰가 있을 수 있습니다: "주변에 자연이 많은 아름다운 호숫가 위치!" 또는 "객실이 비행 경로 바로 아래에 있어 매우 시끄럽습니다!" 이것은 귀중한 정보일 수 있지만 어떻게 사용할 수 있습니까?

컴퓨터가 작업할 수 있는 표현을 텍스트에 제공하는 것이 자연어 처리(NLP)의 기초입니다. NLP는 인터넷 검색, 문서 분류, 자동 질문 응답(Siri 및 Alexa와 같은 스마트 비서를 생각해 보세요)과 같은 다양한 작업을 해결할 수 있는 기술로 구성됩니다.

대체로 컴퓨터는 숫자를 계산하는 기계입니다. 따라서 텍스트 데이터를 처리하려면 이를 숫자로 인코딩하는 방법을 찾아야 합니다. 이를 수행하는 한 가지 방법은 문서에서 각 단어의 발생 횟수를 세는 "단어 모음" 접근 방식을 사용하는 것입니다.

아래에서는 각 행이 동요의 한 줄을 설명하는 단어주머니 행렬의 간단한 예를 보여줍니다. 영어 운율에 익숙한 사람이라면 누구나 이것을 This Little Piggy로 식별할 수 있을 것입니다.

이 집에서 울면서 돌아다니고 돼지는 다 남았고 쇠고기도 없었고 로스트 시장도 거의 없었어요
1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1
1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1
1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1
1 1 1 0 1 3 0 1 1 0 0 0 0 1 1 0 0 1

Bag of Words라는 이름은 단어가 쓰여진 순서를 전혀 사용하지 않고 단어와 나타나는 횟수만 중요하다는 점에서 유래되었습니다. 마치 문장에 담긴 단어들이 모두 큰 가방 안에 뒤섞여 있어서 가방에 담긴 순서가 완전히 사라진 것과 같습니다. 단어의 순서를 무시하는 이유는 가능한 단어의 수가 이미 엄청나고 수천 개의 매개변수가 포함된 모델을 학습하는 것이 충분히 어렵다는 것입니다. "this little Piggy"가 "Piggy little this"가 아닌 다른 의미를 갖는 모델에는 더 많은 매개변수가 필요한 경향이 있습니다. 그래서 우리는 간단한 단어주머니 접근법부터 시작하겠습니다.

AI 소개(AI 요소의 첫 번째 부분)에서 스팸 이메일 필터를 기억할 수 있습니다. 이는 Naive Bayes 방법을 기반으로 하며 메시지의 단어에 해당하는 우도 비율을 곱하는 것과 관련됩니다. Naive Bayes 방식으로 수학을 계산하면 단어가 어떤 순서로 주어지든 결과는 동일하기 때문에 단어주머니 기법으로 생각할 수 있습니다.

단어주머니 표현을 사용하는 간단한 예는 유사성 비교입니다. 예를 들어 텍스트의 두 줄 사이의 맨해튼 거리를 결정하기 위해 가장 가까운 이웃 방법에서 사용할 수 있습니다.

This Little Piggy 동요의 단어주머니 표현이 포함된 위의 표를 생각해 보세요. 줄을 단어별로 비교하고 각 단어 수의 차이를 합산하세요. 예를 들어 처음 두 선 사이의 차이(거리)는 다음과 같습니다.

|1–1| + |0–1| + |0–0| + |1–0| + ... + |1–1| = 0 + 1 + 0 + 1 + ... + 0 = 5

|·| 절대값을 표시합니다. 예를 들어 |0–1| = 1.

어떤 두 줄이 서로 가장 유사합니까?

Bag-of-words 접근 방식의 한 가지 문제점은 기본적으로 모든 단어에 동일한 중요성을 부여한다는 것입니다. "a"라는 단어가 10번 나타나는 것은 "magnificent"라는 단어가 10번 나타나는 것만큼 중요합니다. 그러나 예를 들어 텍스트 감정(누군가가 어떻게 느끼는지 분석)을 고려한다면 "a"와 "magnificent"는 분명히 똑같이 중요하지 않습니다.

간단한 단어 모음 표현을 개선하기 위해 적용할 수 있는 인기 있고 효과적인 솔루션 중 하나는 약어 tf-idf입니다.

TF-IDF(Term Frequency Inverse Document Frequency)라는 기술은 'a', 'the', 'is' 등과 같은 일반적인 단어에 비해 빈도가 낮은 단어의 발생에 더 많은 가중치를 둡니다.

가장 간단한 형태의 알고리즘은 다음과 같습니다. 문서 컬렉션에 있는 각 단어의 빈도(문서 길이로 나눈 발생 횟수)를 계산합니다. 이것이 "용어 빈도"입니다. 𝑡𝑓 tf. (참고: 이 작업을 수행할 때 구두점과 대문자 사용을 무시하세요.) 각 단어가 나타나는 문서 수를 계산하고 이를 총 문서 수로 나눕니다. 이것이 "문서 빈도"입니다. 𝑑𝑓 df. 우리는 일반적인 단어에 더 적은 가중치를 부여하기를 원하므로 이것의 반대를 사용하겠습니다. 1 / 𝑑𝑓 1/df. 이 두 숫자를 결합하여 각 단어에 가중치를 할당하는 방법에는 여러 가지가 있습니다. 가장 일반적인 것은 용어 빈도와 문서 빈도의 역수 로그의 곱입니다. 𝑡𝑓-𝑖𝑑𝑓=𝑡𝑓×𝑙𝑜𝑔(1 / 𝑑𝑓) tf−idf=tf×log(1 / df).

복잡하게 들릴 수도 있지만 당황하지 마세요! 아래 예를 보면 더 이해가 될 것입니다.

다음 세 문장을 고려해 보겠습니다.
"그 사람은 커피를 정말 정말 좋아해요."
"내 여동생은 커피를 싫어해요"
"언니는 차를 좋아해요"

tf-idf 용어에서 각 문장은 문서이며 집합적으로 말뭉치를 구성합니다. 각 문서의 tf-idf 표현을 계산하기 위해 먼저 말뭉치에 있는 모든 고유 단어를 나열합니다. 이 경우에는 '커피', '싫어요', '그 사람', '좋아해요', '나의', '정말', '언니', '차'입니다.

다음으로 각 문서를 차례로 살펴보고, 각 단어의 출현 횟수를 세고, 그 수를 문서의 길이로 나눕니다. 기억하세요: 빈도는 발생률이므로 발생 횟수를 문서의 총 단어 수로 나눈 값입니다.

문서 1: 그는: 1551 ​

문서 2: 내: 1441 ​

문서 3: 내: 1441 ​

절반쯤 왔어! 다음으로 각 단어의 문서 빈도를 계산해 보겠습니다. 단어의 문서 빈도는 해당 단어가 한 번 이상 포함된 문서의 수입니다.

커피:2332 ​

이제 남은 것은 용어 빈도에 문서 빈도의 역수 로그를 곱하여 각 문서의 각 단어에 대한 tf-idf 점수를 계산하는 것입니다.

이 숫자를 직접 계산해 보아야 합니다. 로그를 얻으려면 'log' 키가 있는 구식 탁상용 계산기나 스프레드시트 애플리케이션이 필요합니다(예를 들어 '=log(3)'를 입력하면 값을 얻을 수 있습니다).
0.4771212547
0.4771212547). 검색창에 수식을 입력하기만 하면 다양한 웹 브라우저에서 계산을 수행할 수도 있습니다.

로그의 밑은 그다지 중요하지 않지만 예제 및 연습에서와 동일한 숫자를 얻으려면 밑이 10인 로그를 사용해야 합니다. 이는 많은 스프레드시트 애플리케이션과 브라우저에서 기본값인 것으로 보이지만 데스크톱 계산기나 프로그래밍 언어(예: Python)에서는 그렇지 않습니다. Python을 사용하는 경우 math.log(x, 10) 함수를 사용하여 x의 밑이 10인 로그를 얻을 수 있습니다.

문서 1의 "he"라는 단어를 예로 들어 보겠습니다. 빈도라는 용어는 다음과 같습니다. 1551 ​

단어가 한 번 나타나고 문서 빈도는 다음과 같기 때문입니다. 1331 ​

그 단어가 세 문서 중 하나에 나타나기 때문입니다. 요약하자면, 문서 1에서 'he'의 tf-idf 값은 다음과 같습니다. 15×𝑙𝑜𝑔(31)51 ​

) 이는 대략 다음과 같습니다.
0.095
0.095.

첫 번째 문서의 모든 단어에 대한 모든 tf-idf 계산은 다음과 같습니다.

그𝑡𝑓=15tf=51 ​

𝑙𝑜𝑔(1𝑑𝑓)=𝑙𝑜𝑔(31)로그(df1 ​

)=로그(
1
3

)𝑡𝑓-𝑖𝑑𝑓=15×𝑙𝑜𝑔(31)= 0.095 tf−idf= 51 ​

)=0.095 정말𝑡𝑓=25tf=52 ​

𝑙𝑜𝑔(1𝑑𝑓)=𝑙𝑜𝑔(31)로그(df1 ​

)=로그(
1
3

)𝑡𝑓-𝑖𝑑𝑓=25×𝑙𝑜𝑔(31)= 0.1908 tf−idf= 52 ​

)=0.1908 사랑한다 𝑡𝑓=15tf=51 ​

𝑙𝑜𝑔(1𝑑𝑓)=𝑙𝑜𝑔(32)로그(df1 ​

)=로그(
2
3

)𝑡𝑓-𝑖𝑑𝑓=15×𝑙𝑜𝑔(32)= 0.0352 tf−idf= 51 ​

)=0.0352 커피𝑡𝑓=15tf=51 ​

𝑙𝑜𝑔(1𝑑𝑓)=𝑙𝑜𝑔(32)로그(df1 ​

)=로그(
2
3

)𝑡𝑓-𝑖𝑑𝑓=15×𝑙𝑜𝑔(32)= 0.0352 tf−idf= 51 ​

)=0.0352

tf-idf의 논리는 타당합니다. 단어가 모든 문서에서 매우 공통적이라면(예: "the", "is", "a", "and" 등) 문서에 여러 번 나타나더라도 문서를 설명할 때 그다지 유익하지 않습니다. 반면, 말뭉치에서 단어가 매우 드물다면(“후생유전학”, “그라디언트”) 문서에 단 한 번이라도 나타나는 경우에도 유익할 수 있습니다.

Humpty Dumpty를 코퍼스로 사용해 보겠습니다.

Humpty Dumpty는 벽에 앉아 있었어요.
Humpty Dumpty는 큰 추락을 겪었습니다.
왕의 모든 말과 왕의 모든 신하
Humpty를 다시 합칠 수 없었습니다.

(브라우저의 검색 엔진에 tf-idf 방정식을 입력하여 계산을 수행할 수 있다는 점을 기억하세요)

문서에 대한 벡터 표현을 얻은 후에는 이를 다양한 방법으로 활용할 수 있습니다. 텍스트 분류의 몇 가지 전형적인 예에는 제품 리뷰의 감정(긍정적/부정적) 감지와 이메일 메시지의 스팸성(스팸 여부) 감지가 포함됩니다.

하지만 이 모든 것이 다 무슨 소용이 있습니까? 다음은 설명하기 위한 예입니다. 특정 코퍼스의 특정 문장에 대해 이제 벡터 표현이 있습니다. 3장에서 오두막을 표현한 방식과 유사점을 발견하셨나요? 각 객실에 대해 구성 요소가 어떤 방식으로든 설명하는 벡터가 있습니다. 이제 문장에 대해 어떤 방식으로든 문장을 설명하는 구성 요소가 포함된 벡터가 있습니다. 요점은 이제 텍스트가 단어 대신 숫자로 표시되므로 텍스트를 분류할 수 있다는 것입니다.

문서의 벡터 표현을 얻는 또 다른 방법은 단어의 밀집된 실수 벡터 표현인 단어 임베딩에 의존합니다. 여기서는 이것이 어떻게 생성되는지 자세히 설명하지 않지만 호기심이 많은 독자는 "word2vec"을 검색할 수 있습니다.

케이스

SomeBuddy – 온라인 괴롭힘 피해자 지원

소셜 미디어에서는 누구에게나 어떤 일이든 일어날 수 있습니다. 실제로 소셜 미디어 사용자의 거의 절반이 온라인에서 괴롭힘이나 괴롭힘을 경험했으며, 그 중 대부분은 실제로 범죄일 수 있습니다. 핀란드 스타트업 SomeBuddy(핀란드의 Someturva)는 온라인에서 문제 상황에 직면한 핀란드와 스웨덴의 모든 사람을 돕는 것을 목표로 핀란드어와 스웨덴어로 법적, 심리적 응급처치를 온라인으로 제공합니다.

사람들에게 빠르고 확장 가능한 서비스를 제공하기 위해 SomeBuddy와 Reaktor가 만든 시스템은 자연어 처리를 기반으로 온라인 설문지에 대한 사람들의 답변을 처리합니다. 대부분의 경우 시스템은 범죄가 저질러졌는지 여부를 알 수 있으며 SomeBuddy의 법적, 심리적 지원팀이 추가로 자세히 설명할 수 있는 정보를 미리 생성할 수 있습니다. 이러한 방식으로 기계 학습은 SomeBuddy의 지식이 풍부하고 공감력이 있는 사람들의 작업을 지원하는 데 사용되며, 이들은 결국 온라인 괴롭힘 피해자에게 지원을 제공합니다.

사용된 AI 기법:
-자연어 처리(NLP)
-워드 임베딩
-분류를 위한 신경망

데이터 과학자의 통찰력

"데이터 품질은 핵심 문제입니다. 이 사례를 작업하면서 우리가 사용한 모델이나 알고리즘이 정확한 결과를 얻는 데 그다지 중요하지 않다는 사실을 발견했습니다. 즉, 데이터 품질이 좋은지 확인하는 것이었습니다. 이는 온라인에서 사람들로부터 데이터를 수집하는 방식이 제대로 이루어졌는지 확인하는 데 많은 시간을 소비했다는 것을 의미합니다.

“따라야 할 완벽한 지침은 없습니다. 테스트를 통해 많은 것을 배울 수 있습니다. 예를 들어, 이 작업을 시작했을 때 우리는 표제어(단어를 그룹화하여 사전 형식으로 식별할 수 있도록 데이터를 단순화하는 방법)를 결정했습니다. 그러나 핀란드어에서는 표제어 추출이 실제로 모델의 성능을 저하시켰습니다.

"우리는 단어 임베딩(단어를 벡터 공간에서 벡터로 표현하는 방법)을 사용하여 많은 성공을 거두었습니다. Facebook의 LASER NLP 모델도 우리에게 매우 도움이 되었습니다. LASER는 93개 언어를 동일한 공간에 결합했습니다. 이는 우리가 핀란드어로 보유한 데이터를 스웨덴어 버전의 서비스에 사용할 수 있다는 것을 의미합니다. 덕분에 서비스를 확장할 때마다 처음부터 시작하지 않아도 됩니다."

Eija-Leena Koponen, SomeBuddy의 AI 리드

이 사건에 대해 자세히 알아보기

연습문제

연습 17. 단어 가방

This Little Piggy nursery rhyme의 bag-of-word 표현이 포함된 위의 표를 생각해 보십시오. 단어별로 행을 비교하고 각 단어의 수의 차이를 더합니다. 예를 들어 처음 두 줄 사이의 차이 (거리) 는 | 1–1 | + | 0–1 | + | 0–0 | + | 1–0 | +... + | 1–1 | = 0 + 1 + 0 + 1 +... + 0 = 5 여기서 | · | 는 절대값을 표시하므로 예를 들어 | 0–1 | = 1입니다. 어떤 두 줄이 가장 많습니까? 서로 비슷하다고?
01단어 가방
연습문제

연습 18. TF-IDF

험프티 덤프티를 코퍼스로 사용합시다. 험프티 덤프티가 벽에 걸려 있었다. 험프티 덤프티는 큰 추락을 겪었습니다. 왕의 모든 말과 왕의 모든 부하 험프티를 다시 모을 수는 없었다. (계산을 위해 브라우저의 검색 엔진에 tf-idf 방정식을 입력할 수 있습니다)
01험프티 덤프티 (Humpty Dumpty) 의 첫 번째 줄에서 "험프티 (Humpty)" 라는 단어의 빈도는 얼마입니까?
02라인 3에서 단어 "모두" 에 대한 용어 빈도는 얼마입니까?
03'험프티' 라는 단어의 문서 빈도는 얼마인가요?
04험프티 덤프티 라인 4의 단어 "험프티" 에 대한 tf-idf 점수는 얼마입니까?

이 레슨을 모두 읽었나요?