심심해서 하는 블로그 :: 심심해서 하는 블로그

관계대수(Relation Algebra)

컴퓨터 과학의 관계형 데이터베이스의 관계 모델에서, 집합론과 1차 논리에 기반에여 관계로 표현된 데이터를 

취급하는 대수적인 연산체계이다(위키백과 : 관계대수)


2. 추가 연산자 : 기본 연산자들의 조합으로도 만들수 있지만 알고 있으면 편하자나!(내 맘은 불편..)

  1) Join(

    (1) Condition Join(=Theta-join) : Cross-product를 수행한 후 Selection을 한 결과

         

         



    (2) Equi-Join : 조인 대상이 되는 두 테이블에서 공통적으로 존재하는. 컬럼의 일치되는 행을 연결하여 

                              결과를 생성하는 조인 방법 

                              (공통적인 필드는 하나만 표기한다)

    (3) Natural Join : 모든 공통적인 필드에 대한 Equi-Join 


  2) Division( / 

     

    A에 존재하는 <x, y> 튜플에 대하여 B의 모든 튜플 <y>를 포함하는 튜플 <x>의 집합 

 3) Renamimg operator() : 연산 결과를 임시 테이블에 저장하거나 도메인을 변경하기 위한 연산자

     

    A - B 의 결과로 반환된 Relation명을 Temp라 하고 

     Temp의 첫번째 도메인은 userID 세번째 도메인은 result라고 변경한다.

    



,

관계대수(Relation Algebra)

컴퓨터 과학의 관계형 데이터베이스의 관계 모델에서, 집합론과 1차 논리에 기반에여 관계로 표현된 데이터를 

취급하는 대수적인 연산체계이다(위키백과 : 관계대수)


1. 기본 연산자

  1) Selection() : Relation에서 조건에 만족하고 중복 없는[각주:1] 튜플(tuple)들의 Relation을 반환 

     ex)  userTable에서  이름이 ssooni인 사람의 모든 정보를 구하기

           관계대수 > 

           SQL query >  Select * from userTable where name = 'ssooni' 

  

  2) Projection() : Relation에서 원하는 속성(attribute)에 해당하는 중복 없는 튜플(tuple)들로 

                            구성된 Relation을 반환

     ex)  userTable에서 이름이 ssooni인 사람의 전화번호를 구하기

           관계대수 > 

           SQL query > Selete phoneNum from userTable where name='ssooni'


  3) Cross-product() :  두 개의 Relation들을 조합하는 연산자 

      

  4) Set-difference( - ) : 차집합 연산,  연산하고자 하는 Relation들의 각각 대응하는 필드(field)들은 동일한 타입

  5) Union() : 합집합 연산,  연산하고자 하는 Relation들의 각각 대응하는 필드(field)들은 동일한 타입





  1. 집합에서 중복되는 원소는 같은 원소로 취급하기 때문에 중북되는 원소는 제거된다 [본문으로]
,

학교에서 간단하게 배운 R로 일상생활에서 무엇을 해 볼 수 있을까? 고민하다가

"그 동안 여자친구랑 했던 카톡들 중에 어떤 말이 가장 많았을까?" 하는 궁금증에 야심차게(?) 수행해보았다. 


1. 데이터 수집

   컴퓨터 버전 카카오톡에서 [Ctrl + S]를 누르면 이 때까지 상대방과 대화하였던 내용을 .txt파일 형태로 

   저장시켜준다. 그 후 R의 Working Directory 위치에 이 txt파일을 옮겨준다.

   이제 파일을 열어보면....

   허.. 완전 추위에 오돌오돌 떨던 시절의 대화부터 저장되어있다.. txt파일이 12.6MB라니... 

   양이 방대한지라 분석하는데 오래 걸리길래 7월부터 현재까지 대화내용을 분석해 보기로 했다.


2. 데이터 정제

   우선 한글과 워드클라우드로 출력하기 위한 라이브러리를  설치한다.


1
2
3
4
5
6
7
8
9
10
install.packages("KoNLP")
install.packages("wordcloud")
install.packages("RColorBrewer")
install.packages('httr')
library(KoNLP)
library(wordcloud)
library(RColorBrewer)
library(stringr)
 
useSejongDic()
cs


   7월부터 현재까지의 대화내용은 kakao1.txt 파일에 저장되어 있다. 

   특수문자나 숫자, 분석에 필요없는 내용에 대하하여 삭제를 해주는 과정이 필요하다. 

   data1 <- str_replace_all(data1, "[^[:alpha:]]", "") 에서 이 과정을 처리한다.

   카카오톡 계정명인 내 이름과 여자친구 저장명을 삭제하고 

   각 종 게임 아이템 주고 받을 때마다 나오는 메세지 내용을 삭제하고 ㅋㅋ, ㅎㅎ, ㅠㅠ 등등을 

   gsub("대체당할 문자", "대체 하고자하는 문자", 변수)를 활용하여 제거해준다.

   (우리는 프랜즈팝을 즐겨해서 프랜즈팝이 온데간데 등장한다)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
data1 <- readLines("kakao1.txt")
data1
data1 <- gsub("손찬호""", data1)
data1 <- gsub("여보♥""",data1)
data1 <- str_replace_all(data1, "[^[:alpha:]]""")
data1 <- gsub("부끄럽지만.. 내 (하트)받아주면 안될까?(아잉)""", data1)
data1 <- gsub("어디서 났냐고 다들 물어봐~""", data1)
data1 <- gsub("뭘좋아할지몰""", data1)
data1 <- gsub("단준비한선물""", data1)
data1 <- gsub("님의 핫한 (선물)""", data1)
data1 <- gsub("ㅋ""", data1)
data1 <- gsub("ㅠ""", data1)
data1 <- gsub("ㅜ""", data1)
data1 <- gsub("ㅎ""", data1)
data1 <- gsub("오전""", data1)
data1 <- gsub("오후""", data1)
data1 <- gsub("이모티콘""", data1)
data1 <- gsub("월요일""", data1)
data1 <- gsub("화요일""", data1)
data1 <- gsub("수요일""", data1)
data1 <- gsub("목요일""", data1)
data1 <- gsub("금요일""", data1)
data1 <- gsub("토요일""", data1)
data1 <- gsub("일요일""", data1)
data1 <- gsub("년""", data1)
data1 <- gsub("월""", data1)
data1 <- gsub("일""", data1)
write(data1,"kakao_1.txt") # 정제한 결과 저장
cs

3. 데이터 분석

    어느 정도로 필터링이 완료되면 이제 이것들의 갯수를 새어주는 코드를 작성한다.

    이 때 2글자 이상의 단어만 카운트가 되도록 하였다.

   

1
2
3
4
5
6
data2 <- readLines("kakao_1.txt")
data2 <- sapply(data1, extractNoun, USE.NAMES = F)
data3 <- unlist(data2)
data3 <- Filter(function(x){nchar(x)>=2}, data3)
wordcount <- table(data3)
wordcount
cs

4. 워드클라우드로 표현하기

   이제 집계된 결과를 기반으로 워드클라우드를 만들어 본다.


1
2
3
4
5
<- head(sort(wordcount, decreasing = T), 30)
palete <- brewer.pal(9"Set2")
wordcloud(names(a), freq = wordcount, scale=c(150,0.5), 
        rot.per = 0.25, min.freq = 1, random.order = F, 
        random.color = T, colors = palete)
cs

5. 결 과

   


7월 달에 여자친구가 시험때문에 같이 한숨을 많이 쉬었던지라 ㅋㅋㅋ 에휴가 1등이다 ㅋㅋㅋ

그외에도 곡성을 보고나서 뭐시중헌디 뭐시중헌디 거렸던것이  임팩트가 있었나보다..ㅋㅋ

차후에 다른 그래프로도 표현을 해보고 매달마다 자동적으로 분석해주는 프로그램을 만들어보고 싶다.

,