728x90

데이터 분석 30

4. 자연어 처리 - Word Embedding(WordNet)

Word Sense 한글 단어들은 동음이의어가 참 많다. '차' 를 예로 들어보자. 잎이나 뿌리 등을 우려 마시는 것 바퀴가 달린 운송수단 짐을 실어 그 분량을 세는 단위 장기 말 중 '車' 빼기의 다른 말 몇 주차... 등의 기간을 나타내는 말 etc... 이 때문에 우리는 다의어(Polysemy)와 동형어(Homonym)를 알아야 한다. 다의어(Polysemy) : 근본의미 이외에도 다른 뜻으로도 쓰는 단어 동형어(Homonym) : 단어의 형태만 같을 뿐 서로 전혀 다른 의미를 지님 이런 경우를 처리하기 위해 필요한 것이 Word Sense Disambiguation(WSD) 이다. WordNet 어휘 분류 사전 상위어(Hypernym)나 하위어(Hyponym)에 대한 것이 잘 정리되어 있는 것이 ..

3. 자연어 처리 - 텍스트 유사도(n-gram, 코사인 유사도)

각 문장 간의 의미가 유사한지 컴퓨터는 어떻게 계산할까요? 여기에서 사용되는 개념은 "텍스트 유사도"라고 합니다. n-gram 유사도 n-gram 유사도에서 "n-gram" 이란 기존 문장이 있을 때 n 개의 연속적인 단어 나열을 의미합니다. n 개의 토큰들이 있다는 의미와 같습니다. 이전 게시물인 Subword Segmentation 과 비슷한 양상이라고 볼 수 있습니다. pair 별 빈도를 이용하여 유사도를 계산합니다. 만약 "12월 철수는 패딩을 구입하러 상점으로 이동했다" 라는 문장과 "12월 철수는 패딩을 환불하러 백화점으로 이동했다" 라는 문장의 유사도를 알고 싶다면 단어별로 분절하여 pair 별로 빈도를 확인합니다. 그리고 비교하고자 하는 문장과 같은 pair 가 있는지 확인하고 그 개수를 ..

2. 자연어 처리 - Subword, BPE 알고리즘(OoV, UNK)

SubWord Subword 란 단순한 단어 하나에도 작은 의미들이 뭉쳐있어 있는데 그 단위를 말하는 것이다. 한국어 단어를 예시로 들면 "집중"은 직역하는 [가운데] 로 [모은다] 라는 두가지 의미를 담고 있다. 그래서 자연어 처리를 할 때 이런 작은 단위들로 분절하여 의미를 둔다면 더 좋은 성능을 발휘할 것이다. 하지만 우리 머리로는 뜻이 나오지만 컴퓨터가 Subword 단위까지 분절하기 위해서는 subword 사전같은 데이터들이 필요할 것이다. BPE(Byte Pair Encoding) 알고리즘 2015년에 발표한 것으로 압축 알고리즘을 이용하여 subword segmentation 을 제안했다. 학습 코퍼스를 이용하여 BPE 모델을 학습한 뒤, 실제 코퍼스에 적용해보는 것이다. 이 알고리즘을 활용..

자연어 처리 기초 - 정규표현식 알아보기(정리, 실습편)

Regular Expression 데이터 정제에 필요한 기술 중에 하나가 정규식(정규표현식)이다. 이전 게시물에 보았던 전각문자를 반각문자로 바꾸는 데에도 주로 사용되는 기술이다. Regular Expression 을 사용하는 방법은 크게 두가지가 있다. Text Editor (VSCode, Sublime Text...) Python 등을 활용한 모듈 사용 이제 정규식의 첫 걸음을 시작해보자. [ ] 대괄호이다. 정규식에서 가장 많이 쓰이는 기호 중에 하나이다. 대괄호 안에 있는 문자(숫자 등)를 매칭해준다. 만약 정규식이 [ab279] 라고 설정 되어있을 때 'a', 'b', '2', '7', '9' 중에 하나라도 들어가있는 문장은 매치에 성공한다. 대괄호 안에 문자 및 숫자들만이 아니라 기호들이 다양..

1. 자연어 처리(NLP, NLU, NLG) - 수집, 정제, tokenization

# 자연어(Natural Language)란 무엇일까. 위키피디아에 따르면 사람들이 일상생활에 쓰는 언어를 인공적으로 만들어진 언어와 구분하여 쓰는 말이라고 되어있다. # 그렇다면 NLP(Natural Language Processing) 은 무엇일까. NLP 에는 크게 NLU 와 NLG 로 이루어져 있다. NLU : 자연어를 컴퓨터가 이해할 수 있는 값으로 바꾸는 과정 NLG : 컴퓨터가 이해한 값을 사람이 이해할 수 있도록 바꾸는 과정 내가 공부하는 자연어 처리는 딥러닝을 기반으로 한다. 자연어 처리 과정은 다음과 같다. 자연어 처리에서 흔히 아는 것 중 하나는 "감정 분석" 이다. 문제 정의 단계에서는 무엇을 할 것인지에 대해서 정하는 단계인데 '나는 감정 분석을 구현해보겠다.' 라고 생각한다면 그..

파이썬 - Pandas 기초 정리(DataFrame - 3) : inner join / outer join

이제 정말 유용하게 사용되는 Groupby 에 대해 알아볼 차례이다. 이 게시물은 이전 게시물들과 이어진다. (타이타닉 데이터 사용) # groupby df.groupby('Pclass').groups --------------------------------- {1: Int64Index([ 2, 4, 7, 12, 24, 28, 31, 32, 35, 36, ... 854, 857, 858, 863, 868, 872, 873, 880, 888, 890], dtype='int64', name='PassengerId', length=216), 2: Int64Index([ 10, 16, 18, 21, 22, 34, 42, 44, 54, 57, ... 849, 855, 862, 865, 866, 867, 875,..

파이썬 - Pandas 기초 정리(DataFrame - 2)

이전 게시물에 이어서 학습을 진행한다. 데이터를 분석하여 예측을 하기 위해서는 예측하는 데이터와 어떤 컬럼이 관계가 깊은지 알아야 한다. 이런 경우에 알아보는 것 중 하나가 "상관계수" 이다. 상관계수는 -1 ~ 1 사이의 숫자이다. 예를 들어 A 컬럼과 B 컬럼의 상관계수를 알아봤을 때 1에 가깝다면 A가 증가할 때 B 가 증가하는 형태를 이룬다고 볼 수 있고, -1 에 가깝다면 A가 증가할 때 B는 감소하는 추세를 보인다고 볼 수 있다. 만약 0에 가깝다면 A 와 B는 별로 관계가 없다는 것을 깨달을 수 있다. 1. 상관계수 알아보기 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline 상..

파이썬 - Pandas 기초 정리(DataFrame - 1)

Pandas 모듈에서 가장 많이 사용되는 것이 DataFrame 이라 해도 과언이 아니다. 저번 게시물에서는 Series(1차원)을 다루었지만 이번에는 DataFrame(2차원)을 다룬다. DataFrame 2차원(row, column) 으로 구성되어 있음 일반적인 데이터(csv 등)가 이런 형식으로 되어 있음 1. DataFrame 만들기 일반적으로 DataFrame 은 key 와 value 로 이루어져 있다. data = {10:['a', 'e', 'f'], 20:['b', 'o', 'q'], 30:['c', 'z', 's']} data_frame = pd.DataFrame(data, index=np.arange(1,4)) data_frame --------------------------------..

파이썬 - Pandas 기초 정리(Series)

파이썬을 사용했을 때 데이터 분석에 빠질 수 없는 부분이 Pandas 모듈이다. 외부 파일을 읽어 분석하는데 주요한 기능들이 많이 저장되어 있다. import pandas as pd 모듈을 불러올 때 "pd" 를 가장 많이 사용하기 때문에 위와 같이 선언한다. 1. Series 기초 1차원 배열을 나타내며, numpy의 ndarray 를 기반으로 함. 0개 이상의 데이터를 가질 수 있다. index 는 0 부터 시작. # 데이터 입력하기 pd.Series([1,2,3,4,5]) --------------------------------- 0 1 1 2 2 3 3 4 4 5 dtype: int64 데이터 [1,2,3,4,5] 라는 1차원 배열을 선언하였더니, 각각의 index 가 같이 출력되는 모습을 볼 ..

파이썬 - Numpy 기초 정리(2)

이전 게시물에서 언급하였듯이 numpy 모듈은 연산하는데에도 장점이 많다. 연산에 대표적으로 더하기(add), 빼기(subtract), 곱하기(multiply), 나누기(divide) 가 있는데, numpy 연산은 ndarray 끼리 가능하기 때문에 일반 list 라면 np.array 를 선언해주어야 한다. 또한, 각각 차원이 같고 모양(shape)이 같은 배열끼리만 연산이 가능하다. # 연산에 필요한 배열 선언 a = np.random.randint(100, size=(3,3)) b = np.random.randint(100, size=(3,3)) print(a) print(b) ----------------------------------------- [[62 77 37] [27 52 30] [ 8 ..

728x90