EUC-KR의 text file 읽기

In [1]:
path <- '.'
story <- list.files(path=path,pattern = "*e.txt")
story <- paste(path,story,sep='/')
story
'./1204-e.txt'
In [2]:
myReadLines <- function(filename) {
    readLines(file(filename,encoding='euc-kr'))
}
In [3]:
story2 <- unlist(unname(sapply(story, myReadLines)))
Warning message in readLines(file(filename, encoding = "euc-kr")):
“invalid input found on input connection './1204-e.txt'”Warning message in readLines(file(filename, encoding = "euc-kr")):
“incomplete final line found on './1204-e.txt'”
In [4]:
head(story2)
군사정부였던 그 시기에 민주화 운동은참으로 맘에 안들고 그들의 눈에 보기엔 위험한 것이었겠지.
영화도 택시운전사라, 광주 민주화항쟁이 주제인만큼 부모님도 관심있을 주제였다.
영화를 마치고 5.18 민주화 운동에 대해찾아보고 또 찾아보고몇일간은 그 속에서 헤어나오지 못했다.
5.18 광주 민주화 운동을직접 겪은 세대는?아니지만그 당시에 태어나서 그런지남의 일 같지는 않다죠?
전두환이 군을 장악하고 광주를 집어 삼키려는 잔인 무도한 사건들~ 민주화를 외쳤던 용감한 광주시민들이 있었기 때문에 지금 내가 편안하게 살고 있는건지도 모르겠다~
서울의 한 택시운전사가 5.18 광주 민주화 운동의 참상을 알리기위해 독일에서 온 한 특파원을 태우고 서울에서 광주를 다녀온 실제 택시운전사의 이야기.택시운전사 기대 안 하고 봤는데,,별 : 4개.

UTF8의 text file 읽기

In [5]:
path <- '.'
story <- list.files(path=path,pattern = "*u.txt")
story <- paste(path,story,sep='/')
story
'./1204-u.txt'
In [6]:
story2 <- unlist(unname(sapply(story, readLines)))
In [7]:
head(story2)
군사정부였던 그 시기에 민주화 운동은참으로 맘에 안들고 그들의 눈에 보기엔 위험한 것이었겠지.
영화도 택시운전사라, 광주 민주화항쟁이 주제인만큼 부모님도 관심있을 주제였다.
영화를 마치고 5.18 민주화 운동에 대해찾아보고 또 찾아보고몇일간은 그 속에서 헤어나오지 못했다.
5.18 광주 민주화 운동을직접 겪은 세대는?아니지만그 당시에 태어나서 그런지남의 일 같지는 않다죠?
전두환이 군을 장악하고 광주를 집어 삼키려는 잔인 무도한 사건들~ 민주화를 외쳤던 용감한 광주시민들이 있었기 때문에 지금 내가 편안하게 살고 있는건지도 모르겠다~
서울의 한 택시운전사가 5.18 광주 민주화 운동의 참상을 알리기위해 독일에서 온 한 특파원을 태우고 서울에서 광주를 다녀온 실제 택시운전사의 이야기.택시운전사 기대 안 하고 봤는데,,별 : 4개.

Vector source

In [8]:
library(tm)
library(KoNLP)
Loading required package: NLP
Checking user defined dictionary!

In [9]:
vs <- VectorSource(story2)
corp <- VCorpus(vs)
In [10]:
useSejongDic()
Backup was just finished!
370957 words dictionary was built.
In [11]:
konlp_tokenize <- function(corp) {
    corp <- extractNoun(paste(corp,collapse=' '))
    corp <- gsub("[[:digit:]]", "", corp, perl = TRUE)
    corp <- gsub("[[:graph:]]", "", corp, perl = TRUE)
    corp <- gsub("[[:print:]]", "", corp, perl = TRUE)
    corp <- gsub("[[:space:]]", "", corp, perl = TRUE)
}
In [12]:
stopwords <- c("그", "수", "이", "영화", "있는", "더", "당시", "한", "위해", "아직도", "그리고", "것", "대한",
               "잘", "영화를", "왜","있다", "영화는", "많은", "너무", "이런", "사람들이", "하는", "대해", "할",
               "영화가", "정말", "없는", "한다", "것이다","알고", "우리가", "것을", "택시", "보고", "있었다",
               "전", "아닌", "그런", "많이", "얼마나", "아니라", "꼭", "것이", "하지만", "같은", "내가", "하고",
               "않고", "좀", "다", "본", "어떻게", "것은", "때문에", "된", "그렇게", "바로", "영화였다", "는",
               "살고", "큰", "있다는", "의", "만섭의", "듯", "통해", "보는", "이렇게", "또", "라는", "그저",
               "사람이", "합니다", "볼", "되는", "때", "자신의", "있을", "게", "영화의", "잊지", "한번", "있습니다",
               "영화다", "일이", "된다", "같다", "모습을", "아니다", "저는", "보면서", "위한", "없었다면", "만든",
               "우리의", "나는", "없이", "화가", "그냥", "사람들의", "수도", "18의", "만섭은", "알게", "를", "내", "참", 
               "않는", "말이", "가", "그러나", "그래서", "하지", "누가", "없다", "것도", "18을", "안", "있었고",
               "잘살고", "모르는", "다룬", "사람들은", "장면은", "있고", "일을", "영화에서", "그를", "독일", "있던",
               "보며", "아주", "못하고", "더욱", "아니고", "될", "너무나", "푸른","광주에", "광주는", "광주로",
               "광주에서", "광주", "광주의","광주를","18")
In [13]:
tdm <- TermDocumentMatrix(corp, control = 
                            list(tokenize = konlp_tokenize, 
                                 stopwords = stopwords,
                                 wordLengths = c(2, Inf)))
In [14]:
inspect(tdm)
<<TermDocumentMatrix (terms: 3069, documents: 509)>>
Non-/sparse entries: 7010/1555111
Sparsity           : 100%
Maximal term length: 18
Weighting          : term frequency (tf)
Sample             :
            Docs
Terms        143 147 155 160 161 165 219 220 248 273
  생각         1   0   0   1   0   0   1   0   0   0
  역사         1   0   1   0   1   1   0   0   0   0
  시민         3   8   2   0   3   0   2   9   2   0
  운동         2   0   0   1   0   0   0   3   1   0
  사람         3   0   0   0   2   0   1   1   0   0
  들이         2   1   1   0   0   0   2   3   2   2
  진실         0   0   0   0   0   0   0   0   0   1
  우리         0   0   1   0   0   0   0   0   0   0
  민주화       0   0   0   0   1   0   1   4   1   0
  택시운전사   2   0   1   0   0   1   0   0   0   0
In [15]:
findFreqTerms(tdm, lowfreq = 10)
findAssocs(tdm, "민주항쟁", 0.5)
  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. '역사'
  29. '국민'
  30. '마음'
  31. '기록'
  32. '상황'
  33. '모습'
  34. '배경'
  35. '실화'
  36. '작품'
  37. '장면'
  38. '사람'
  39. '관객'
  40. '현실'
  41. '평범'
  42. '표현'
  43. '학살'
  44. '시민'
  45. '폭도'
  46. '시절'
  47. '부분'
  48. '군인'
  49. '폭력'
  50. '해서'
  51. '그것'
  52. '용기'
  53. '왜곡'
  54. '만섭'
  55. '무엇'
  56. '내용'
  57. '세상'
  58. '자신'
  59. '연기'
  60. '이유'
  61. '가슴'
  62. '자유'
  63. '진짜'
  64. '감동'
  65. '현장'
  66. '시위'
  67. '누구'
  68. '분노'
  69. '권력'
  70. '취재'
  71. '진실'
  72. '목숨'
  73. '그날'
  74. '국가'
  75. '고통'
  76. '시대'
  77. '정치'
  78. '눈물'
  79. '감성'
  80. '명령'
  81. '처벌'
  82. '시작'
  83. '선동'
  84. '폭동'
  85. '정부'
  86. '사진'
  87. '존재'
  88. '그들'
  89. '주인'
  90. '운전사'
  91. '대통령'
  92. '사람들'
  93. '소시민'
  94. '김사복'
  95. '위르겐'
  96. '계엄군'
  97. '북한군'
  98. '이야기'
  99. '민주화'
  100. '빨갱이'
  101. '대학생'
  102. '전두환'
  103. '마지막'
  104. '민주주의'
  105. '광주시민'
  106. '택시기사'
  107. '김사복은'
  108. '마찬가지'
  109. '힌츠페터'
  110. '우리나라'
  111. '공수부대'
  112. '전두환을'
  113. '힌츠페터는'
  114. '택시운전사'
  115. '힌츠페터를'
  116. '광주민주화운동'
$민주항쟁 =
기점
0.75
초석
0.75
승락을
0.75
한국과
0.75
직선제
0.75
동맹관계
0.75
같이계엄령
0.75
성공하여대
0.75
같이계엄령을
0.75
발생한다이에
0.75
협박으로전두환을
0.75
탄압한다면미국은
0.75
전국적으로민주항쟁이
0.75
선포
0.61
압박
0.53
개헌
0.53
되었
0.53
미국
0.53
In [16]:
# creaste a word cloud. 
m <- as.matrix(tdm)

v <- sort(rowSums(m), decreasing = TRUE)
d <- data.frame(word = names(v),freq=v)
In [17]:
# '민주항쟁' 키워드 관련 전체 어휘빈도수: 상위 20개까지 표기
head(d, 20)
wordfreq
민주화민주화 138
역사역사 101
시민시민 99
운동운동 98
사람사람 94
택시운전사택시운전사 73
들이들이 70
진실진실 68
생각생각 66
우리우리 61
하게하게 60
폭동폭동 43
국민국민 41
이야기이야기 40
사실사실 37
장면장면 37
광주시민광주시민 35
사람들사람들 34
빨갱이빨갱이 34
민국민국 33
In [18]:
df <- d[c(d$freq >= 10), ]
In [19]:
library(wordcloud)
Loading required package: RColorBrewer
In [20]:
wordcloud(words = df$word, freq = df$freq, min.freq = 10,
          max.words= 100, random.order=FALSE, rot.per=0.35, 
          scale = c(4, 0.5), colors=brewer.pal(8, "Set2"))
In [21]:
library(wordcloud2)
In [29]:
wordcloud2(df, size = 1.6, shape = "circle", minRotation = -pi/4, maxRotation = -pi/4,
           rotateRatio = 0.4, ellipticity = .7, color = "random-light", backgroundColor = "grey", figPath = NULL)
wordcloud2
In [26]:
tdm <- as.matrix(tdm)
# row.names(tdm)
tdmrs <- sort(rowSums(tdm), decreasing = TRUE)
head(tdmrs,20)
tdmrs <- as.matrix(tdmrs)
# row.names(tdmrs)
tdmrs2 <- tdmrs[c(1:27), ]
tdmrs3 <- as.matrix(tdmrs2)

termMatrix <- tdmrs3 %*% t(tdmrs3)
민주화
138
역사
101
시민
99
운동
98
사람
94
택시운전사
73
들이
70
진실
68
생각
66
우리
61
하게
60
폭동
43
국민
41
이야기
40
사실
37
장면
37
광주시민
35
사람들
34
빨갱이
34
민국
33
In [27]:
library(igraph)

g <- graph.adjacency(termMatrix, weighted = TRUE, mode = "undirected") 
g <- graph_from_adjacency_matrix(termMatrix, weighted = TRUE, mode = "undirected")
g <- simplify(g)
Attaching package: ‘igraph’

The following objects are masked from ‘package:stats’:

    decompose, spectrum

The following object is masked from ‘package:base’:

    union

In [28]:
V(g)$label <- V(g)$name 
V(g)$degree <- degree(g) 
V(g)$label.cex <- seq(0.8, 0.2, length.out = 27)
V(g)$label.font <- 2
V(g)$size <- seq(30, 2, length.out = 27)
set.seed(3952) 
layout1 <- layout.fruchterman.reingold(g) 
egam <- (log(E(g)$weight) + 1.5) / max(log(E(g)$weight) + 1.5)
plot(g, edge.width = egam, 
     edge.arrow.size = 0.1,layout = layout1)

# make it look better
V(g)$label.cex <- 0.3 * V(g)$degree/max(V(g)$degree)+ .3 
V(g)$label.color <- rgb(0, 0, .2, .8) 
V(g)$size <- seq(25, 1, length.out = 27)
V(g)$frame.color <- NA
V(g)$label.font <- 2
egam <- (log(E(g)$weight) + 1.5) / max(log(E(g)$weight) + 1.5)

plot(g, edge.width = egam, 
     edge.arrow.size = 0.1,layout = layout1)