본문 바로가기

Oracle/SQL 을 이용한 데이터 분석물

SQL 을 이용한 감정분석 (스티브잡스 연설문)

이 연설문에는 긍정단어가 많은지, 부정단어가 많은지 분석 해 보겠다. 

 

1. 먼저 테이블 생성.

create table speech
(speech_text varchar2(1000));

 

2. 연설문 text 데이터 임포트 

jobs.txt

 

3. 연설문 전체를 어절별로 나누어야 한다. 정규식 함수 사용 ( regexp_substr) 

select * 
from ( select regexp_substr(lower(speech_text) , '[^ ]+', 1, a) as word 
        from speech, ( select level as a 
                        from dual
                        connect by level <= 100)
                      )
        where word is not null;
  •  먼저 행의 어절을 읽을 수 있도록 connect by 절을 기술 해 준다. 
  • 그리고 만들어둔 Table 과 함께, 소문자로 변환시긴 lower(speech_text) 컬럼에서 문자를 추출하는 정규식 함수를 사용한다. 
  • 정규식 함수 ( 컬럼 , 공백이 아닌 여러개(= 단어를지칭) , 1번째어절부터, a어절 까지 ) 
    여기서 a 까지라는 의미는 FROm 절에 in line view 로 묶어준 connect by 절의 level 의 별칭 A 를 뜻한다. 
    이렇게 되면 연설문 첫번째 단어부터, connect by 절이 정해놓은  한 줄에 100 개의 어절 까지 모두다 출력되게 된다. 
  • 이 연설문이 100 번째 까지 행이 있는게 아니므로 다 스캔 된뒤 출력된 결과물에는 NULL 이 포함되어 출력되게 된다. 
  • 그러므로 WHERE 절에 추출한 단어에서 NUll 은 빼겠다는 조건절을 입력해 주어야한다. 
    -> 그래야 불필요한 데이터 없이 단어들만 추출된다. 

4.  어절, 어절별 건수를 높은 순으로 출력 할 것 ( 어절 = word)

 

select word , count(*)
from ( select regexp_substr**(**lower(speech_text) , '[^ ]+', 1, a) as word 
        from speech, ( select level as a 
                        from dual connect by level <= 100) 
                      ) 
        where word is not null

group by word
order by 2 desc;

 

같은 단어별로 묶어서 그 단어별 갯수를 세어본다. 
->결과를 보게 되면 정관사 the 가 많이 나오는 단어이다.

5. 특정 텍스트에 긍정단어가많은지, 부정단어가많은지 분석하기 위해 아래의 테이블 2개 생성

create table positive 
(p_text varchar2(2000));

→ 긍정 테이블

create table negative 
(n_text varchar2(2000));

→ 부정테이블

  1. 테이블별로 데이터 임포트 하기
  • 참고로 헤더 체크 표시 해제 하고 (건너뛴 후)
  • 왼쪽 둘러 싸기 없음

6. 미리 만들어놓은  어절별로 만들어 놓은 연설문을  view 로 생성한다. (가독성을 위한것 ) 

create or replace view stev_text 
as
select *
from ( select rtrim( trim('"' from regexp_substr(lower(speech_text),'[^ ]+',1,a)
                          ), ',.:;?!''' 
                   ) as word 
         from speech, (select level as a 
                        from dual
                        connect by level <= 100
                      )
       )
where word is not null;

 

  • trim 으로 먼저 어절별로 잘라진 문장에 붙어있는 " 를 잘라낸다. 
  • 그다음 RTrim 으로 오른쪽에 붙어있는 ,.:;?!' 을 잘라냅니다.
    (중간에 여기 없는 문자나 단어가 있다면 그 막혀있는 단어 전의 잘라낼 기호나, 문자는 지워지지 않는다. 
  • ' 싱글 쿼테이션을 자를 때 ''두개를 쓴 이유는 ? '' 를 두개입력해야 싱글 ' 하나로 인식 하기 때문!!!!
  • -> 데이터 정제 과정이라고 한다. 

7. view 와 positive 테이블을 이용하여 긍정단어가 단어별 몇개 존재하는지 출력하기 ( exists 문 사용)

select word, count(*) 
from stev_text s 
where exists (select 'X'
              from positive p 
              where p.p_text = s.word
              ) 
group by word 
order by 2 desc;

단어와, 그 단어별 갯수를 출력해 준다. 
→ great 가 6 으로 가장 많이 사용한 긍정 단어이다.


8. 반대로 부정 단어는 몇개 존재하는지 출력 해보겠다. 

select word, count(*)
from stev_text s
where exists (select 'X'   
              from negative n 
              where n.n_text = s.word
              ) 
group by word
order by 2 desc;

→ death 가 6개로 가장 많이 사용한 부정 단어이다.

스티브 잡스 연설문에는 긍정단어가 많은지 부정단어가 많은지 각각 건수를 알아내시오

select count(*)
from stev_text s 
where exists (select 'X' 
              from positive p
              where p.p_text = s.word);

→ 긍정 87 건

select count(*) 
from stev_text s
where exists (select 'X' 
              from negative n 
              where n.n_text = s.word);

→ 부정 50건

 

결론 : 스티브 잡스의 연설문에는 긍정적인 단어의 갯수가 부정적인 단어보다 약 43.5% 더 존재한다. 
        아무래도 졸업연설문이다보니 긍정적인 이야기를 많이 한것으로 추측 되어진다. 
        연설문을 읽다보면 부정적인 단어도 결국에는 이겨내고 해결해 냈다는 과정을 얘기하는 중에 나온 단어였다. 
        그러다보니, 부정적인 단어자체로 이 단어가 쓰인 문장이 부정적이라고 해석할 수는 없다. 
        단어만 가지고 감정을 해석하는 감정분석의 한계점이 보인다. 
       아직은  맥락을 해석할 수 있는 사람의 능력이 컴퓨터의 분석능력보다 뛰어나다. 

 

궁금한점 : 문장의 맥락을 해석 할 수 있는 데이터 분석이 존재하는가 ?