텍스트처리

텍스트 분할 strsplit() 함수

fox.said <- "what is essential is invisible to the eye"
fox.said
## [1] "what is essential is invisible to the eye"
strsplit(x=fox.said, split=" ")  # 리스트 출력
## [[1]]
## [1] "what"      "is"        "essential" "is"        "invisible" "to"       
## [7] "the"       "eye"

벡터화후 원소 접근

fox.said <- "what is essential is invisible to the eye"
fox.said
## [1] "what is essential is invisible to the eye"
fox.said.words <- unlist(strsplit(fox.said, " "))
fox.said.words
## [1] "what"      "is"        "essential" "is"        "invisible" "to"       
## [7] "the"       "eye"
fox.said.words[3]
## [1] "essential"

list 인덱싱 이용 접근

fox.said <- "what is essential is invisible to the eye"
fox.said
## [1] "what is essential is invisible to the eye"
fox.said.words <- strsplit(fox.said, " ")[[1]]
fox.said.words
## [1] "what"      "is"        "essential" "is"        "invisible" "to"       
## [7] "the"       "eye"
fox.said.words[3]
## [1] "essential"
p1 <- "You come at four in the afternoon, then at three I shall begin to be happy"
p2 <- "One runs the risk of weeping a little, if one lets himself be tamed"
p3 <- "What makes the desert beautiful is that somewhere it hides a well"
littleprince <- c(p1, p2, p3)
strsplit(littleprince, " ")
## [[1]]
##  [1] "You"        "come"       "at"         "four"       "in"        
##  [6] "the"        "afternoon," "then"       "at"         "three"     
## [11] "I"          "shall"      "begin"      "to"         "be"        
## [16] "happy"     
## 
## [[2]]
##  [1] "One"     "runs"    "the"     "risk"    "of"      "weeping" "a"      
##  [8] "little," "if"      "one"     "lets"    "himself" "be"      "tamed"  
## 
## [[3]]
##  [1] "What"      "makes"     "the"       "desert"    "beautiful" "is"       
##  [7] "that"      "somewhere" "it"        "hides"     "a"         "well"
strsplit(littleprince, " ")[[3]]
##  [1] "What"      "makes"     "the"       "desert"    "beautiful" "is"       
##  [7] "that"      "somewhere" "it"        "hides"     "a"         "well"
strsplit(littleprince, " ")[[3]][5]
## [1] "beautiful"

텍스트로 부터 중복되지 않은 단어 추출

fox.said <- "WHAT IS ESSENTIAL is invisible to the Eye"
fox.said.words <- strsplit(fox.said, " ")[[1]]
fox.said.words
## [1] "WHAT"      "IS"        "ESSENTIAL" "is"        "invisible" "to"       
## [7] "the"       "Eye"
unique(fox.said.words)
## [1] "WHAT"      "IS"        "ESSENTIAL" "is"        "invisible" "to"       
## [7] "the"       "Eye"
unique(tolower(fox.said.words))
## [1] "what"      "is"        "essential" "invisible" "to"        "the"      
## [7] "eye"

텍스트 결합 paste() 함수

#묶이지 않은 원소의 결합 및 결합시 사용할 separator

paste("Everybody", "wants", "to", "fly")
## [1] "Everybody wants to fly"
paste("Everybody", "wants", "to", "fly", sep=" ")
## [1] "Everybody wants to fly"
paste("Everybody", "wants", "to", "fly", sep="-")
## [1] "Everybody-wants-to-fly"
paste("Everybody", "wants", "to", "fly", sep="")
## [1] "Everybodywantstofly"
paste0("Everybody", "wants", "to", "fly") # paste0는 paste(..., sep="")과 동일
## [1] "Everybodywantstofly"
paste(pi, sqrt(pi))
## [1] "3.14159265358979 1.77245385090552"
paste("25 degrees Celsius is", 25*1.8 + 32, "degrees Fahrenheit")
## [1] "25 degrees Celsius is 77 degrees Fahrenheit"

#paste는 벡터로 묶인 1개의 인수가 주어진 경우, 해당 벡터를 분리후 결합하지 않음

paste(c("Everybody", "wants", "to", "fly")) # 결과 변화 없음
## [1] "Everybody" "wants"     "to"        "fly"
fox.said <- "WHAT IS ESSENTIAL is invisible to the Eye"
fox.said.words <- strsplit(fox.said, " ")[[1]]
fox.said.words
## [1] "WHAT"      "IS"        "ESSENTIAL" "is"        "invisible" "to"       
## [7] "the"       "Eye"
paste(fox.said.words)    # 결과 변화 없음
## [1] "WHAT"      "IS"        "ESSENTIAL" "is"        "invisible" "to"       
## [7] "the"       "Eye"

#paste()는 벡터로 묶인 인수와 다른 인수가 주어질 경우, #벡터의 elementwise 결합 및 원소 부족시 확장이 일어남

heroes <- c("Batman", "Captain America", "Hulk")
colors <- c("Black", "Blue", "Green")
paste(colors, heroes)
## [1] "Black Batman"         "Blue Captain America" "Green Hulk"
rank <- c(1,2,3,4)
heroes <- c("Batman", "Captain America", "Hulk")
paste(rank, heroes)
## [1] "1 Batman"          "2 Captain America" "3 Hulk"           
## [4] "4 Batman"
paste("Type", 1:5)
## [1] "Type 1" "Type 2" "Type 3" "Type 4" "Type 5"
heroes <- c("Batman", "Captain America", "Hulk")
paste(heroes, "wants", "to", "fly")
## [1] "Batman wants to fly"          "Captain America wants to fly"
## [3] "Hulk wants to fly"

paste는 결과에 대해 collapse를 이용한 최종 결합 여부 수행

(default는 collapse=NULL즉 최종 결합 안함)

paste(c("Everybody", "wants", "to", "fly"))
## [1] "Everybody" "wants"     "to"        "fly"
paste(c("Everybody", "wants", "to", "fly"), collapse=" ")
## [1] "Everybody wants to fly"
heroes <- c("Batman", "Captain America", "Hulk")
paste(heroes, "wants", "to", "fly", collapse=", and ")
## [1] "Batman wants to fly, and Captain America wants to fly, and Hulk wants to fly"
heroes <- c("Batman", "Captain America", "Hulk")
paste(heroes, "wants", "to", "fly", sep="-", collapse="; ")
## [1] "Batman-wants-to-fly; Captain America-wants-to-fly; Hulk-wants-to-fly"
paste(month.abb, 1:12, sep="_", collapse="-")
## [1] "Jan_1-Feb_2-Mar_3-Apr_4-May_5-Jun_6-Jul_7-Aug_8-Sep_9-Oct_10-Nov_11-Dec_12"

2개 텍스트 집합으로 가능한 모든 텍스트 결합 수행 - outer()와 paste() 활용

outer(c(1,2,3), c(100,10,1)) # 2개 집합에 대해 모든 순서쌍의 곱을 수행
##      [,1] [,2] [,3]
## [1,]  100   10    1
## [2,]  200   20    2
## [3,]  300   30    3
asian.countries <- c("Korea", "China", "Japan")
info <- c("GDP", "Population", "Area")
outer(asian.countries, info, FUN=paste, sep="-")
##      [,1]        [,2]               [,3]        
## [1,] "Korea-GDP" "Korea-Population" "Korea-Area"
## [2,] "China-GDP" "China-Population" "China-Area"
## [3,] "Japan-GDP" "Japan-Population" "Japan-Area"
out <- outer(asian.countries, info, FUN=paste, sep="-")
as.vector(out)
## [1] "Korea-GDP"        "China-GDP"        "Japan-GDP"        "Korea-Population"
## [5] "China-Population" "Japan-Population" "Korea-Area"       "China-Area"      
## [9] "Japan-Area"
outer(asian.countries, asian.countries, paste, sep="-")
##      [,1]          [,2]          [,3]         
## [1,] "Korea-Korea" "Korea-China" "Korea-Japan"
## [2,] "China-Korea" "China-China" "China-Japan"
## [3,] "Japan-Korea" "Japan-China" "Japan-Japan"

cameraData <- read.csv(“cameras.csv”) str(cameraData) head(cameraData) grep(“Alameda”, cameraData\(intersection) table(grepl("Alameda", cameraData\)intersection)) grep(“Alameda”, cameraData\(intersection, value=TRUE) table(grepl("Alameda", cameraData\)intersection))

head(islands)
##       Africa   Antarctica         Asia    Australia Axel Heiberg       Baffin 
##        11506         5500        16988         2968           16          184
landmasses <- names(islands)
landmasses
##  [1] "Africa"           "Antarctica"       "Asia"             "Australia"       
##  [5] "Axel Heiberg"     "Baffin"           "Banks"            "Borneo"          
##  [9] "Britain"          "Celebes"          "Celon"            "Cuba"            
## [13] "Devon"            "Ellesmere"        "Europe"           "Greenland"       
## [17] "Hainan"           "Hispaniola"       "Hokkaido"         "Honshu"          
## [21] "Iceland"          "Ireland"          "Java"             "Kyushu"          
## [25] "Luzon"            "Madagascar"       "Melville"         "Mindanao"        
## [29] "Moluccas"         "New Britain"      "New Guinea"       "New Zealand (N)" 
## [33] "New Zealand (S)"  "Newfoundland"     "North America"    "Novaya Zemlya"   
## [37] "Prince of Wales"  "Sakhalin"         "South America"    "Southampton"     
## [41] "Spitsbergen"      "Sumatra"          "Taiwan"           "Tasmania"        
## [45] "Tierra del Fuego" "Timor"            "Vancouver"        "Victoria"
grep(pattern="New", x=landmasses)
## [1] 30 31 32 33 34
index <- grep("New", landmasses)
landmasses[index]
## [1] "New Britain"     "New Guinea"      "New Zealand (N)" "New Zealand (S)"
## [5] "Newfoundland"
grep(pattern="New", x=landmasses, value=TRUE)
## [1] "New Britain"     "New Guinea"      "New Zealand (N)" "New Zealand (S)"
## [5] "Newfoundland"
grepl(pattern="New", x=landmasses)
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [25] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
table(grepl(pattern="New", x=landmasses))
## 
## FALSE  TRUE 
##    43     5
grepl(pattern="new", x=landmasses)
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
length(grep(pattern="new", x=landmasses))
## [1] 0

정규표현식의 활용 예

names <- c("김남수","하이연","정진성","김우주","박구수","성우장","박의수", "박수")
grep("^박.*수$",names)
## [1] 5 7 8

정규표현식

임의의 문자 1개 매치

x <- c("Idare","\t")
grep('.',x)
## [1] 1 2
regmatches(x,regexpr(".",x)) 
## [1] "I"  "\t"
# stringr::str_extract를 사용하면 편리
stringr::str_extract(x,".") 
## [1] "I"  "\t"

문자열의 시작 매치

x <- c("Idare","i dare","Oh, I dare", "!!??!")
grep('^[Ii]',x)
## [1] 1 2
grepl('^[Ii]',x)
## [1]  TRUE  TRUE FALSE FALSE
regmatches(x,regexpr('^[Ii]',x)) 
## [1] "I" "i"
# stringr::str_extract를 사용하면 편리
stringr::str_extract(x,'^[Ii]') 
## [1] "I" "i" NA  NA

내에서 사용하는 POSIX 브라켓

x <- c('I dare to love you', 'I dare to love you!', 'Oh1', 'Dear, my love.2', '!!?!')
grep('[[:punct:]]',x)   # 문장부호가 포함되어 있는가? 
## [1] 2 4 5
grep('[[:punct:]1]',x)  # 문장부호 또는 1이 포함되어 있는가? 
## [1] 2 3 4 5
grep('[1[[:punct:]]',x) # 1 또는 문장부호가 포함되어 있는가? 
## [1] 2 3 4 5
grep('[^[:punct:]]',x)  # 문장부호가 아닌 문자가 포함되어 있는가? 
## [1] 1 2 3 4

밖에서 사용가능한 escape 문자

x <- c('Idaretoloveyou','I dare to love you!', 'Oh1', 'Dear, my love.1', '!!?!')
grep('\\w',x)
## [1] 1 2 3 4
grep('\\W',x)
## [1] 2 4 5
grep('\\s',x)
## [1] 2 4
grep('\\S',x)
## [1] 1 2 3 4 5
x <- c('\t','\r')
grep('\\t',x)
## [1] 1

위치를 나타내는 정규표현식 - 단어의 경계

x <- c("hook", "I have a hook", "He shook me")

grepl("hook",x)
## [1] TRUE TRUE TRUE
grepl("\\bhook$",x)
## [1]  TRUE  TRUE FALSE
grepl("\\Bhook$",x)
## [1] FALSE FALSE FALSE

문자 혹은 문자집합의 반복

x <- c("Test On. <h> Hi! </h> Test off.","Test offf")
grepl("<.+>",x)
## [1]  TRUE FALSE
grepl("<.+?>",x)
## [1]  TRUE FALSE
grepl("of{1,4}",x)
## [1] TRUE TRUE
regmatches(x,regexpr("<.+>",x))   # <와 > 사이에 문자가 1개 이상 존재하는 최대 매치
## [1] "<h> Hi! </h>"
stringr::str_extract(x,"<.+>")    # stringr::str_extract를 사용하면 편리
## [1] "<h> Hi! </h>" NA
regmatches(x,regexpr("<.+?>",x))  # <와 > 사이에 문자가 1개 이상 존재하는 최소 매치
## [1] "<h>"
stringr::str_extract(x,"<.+?>")   # stringr::str_extract를 사용하면 편리
## [1] "<h>" NA
regmatches(x,regexpr("of{1,4}",x))
## [1] "off"  "offf"
stringr::str_extract(x,"of{1,4}") 
## [1] "off"  "offf"

괄호() : 우선순위 변경, 캡쳐, 부분일치

x <- c("abcxabc","abxab","abcxab","abxabc")

grepl("[abc]{2,3}x[abc]{2,3}",x)
## [1] TRUE TRUE TRUE TRUE
grepl("([abc]{2,3})x\\1",x)
## [1]  TRUE  TRUE FALSE  TRUE
x <- c("abba","2xx2","a22z","xaxx")
grepl("(\\w)(\\w)\\2\\1",x)
## [1]  TRUE  TRUE FALSE FALSE
x <- c("axxbba","2xyba","2yyxx2","cxy22c")

grepl("(\\w)(xx|yy)(\\w)\\3\\1",x)
## [1]  TRUE FALSE  TRUE FALSE
# More metacharacters : * and -
x <-c("working as MP here 720 MP battallion, 42nd birgade",
      "so say 2 or 3 years at college and 4 at uni makes us 23 when and if we fin",
      "it went down on several occasions for like, 3 or 4 *days*",
      "Mmmm its time 4 me 2 go 2 bed")

grep("[0-9]+(.*)[0-9]+",x)
## [1] 1 2 3 4
regmatches(x,regexpr("[0-9]+(.*)[0-9]+",x))
## [1] "720 MP battallion, 42"                           
## [2] "2 or 3 years at college and 4 at uni makes us 23"
## [3] "3 or 4"                                          
## [4] "4 me 2 go 2"
stringr::str_extract(x,"[0-9]+(.*)[0-9]+") 
## [1] "720 MP battallion, 42"                           
## [2] "2 or 3 years at college and 4 at uni makes us 23"
## [3] "3 or 4"                                          
## [4] "4 me 2 go 2"
regmatches(x,regexpr("[0-9]+(.*)[0-9]+",x))
## [1] "720 MP battallion, 42"                           
## [2] "2 or 3 years at college and 4 at uni makes us 23"
## [3] "3 or 4"                                          
## [4] "4 me 2 go 2"
stringr::str_extract(x,"[0-9]+(.*)[0-9]+") 
## [1] "720 MP battallion, 42"                           
## [2] "2 or 3 years at college and 4 at uni makes us 23"
## [3] "3 or 4"                                          
## [4] "4 me 2 go 2"

날짜

Dates in R

x <- as.Date("1970-01-01")
x
## [1] "1970-01-01"
class(x)
## [1] "Date"
unclass(x)               # 1970년 1월 1일 즉 Julian date 0일 기준으로 계산
## [1] 0
unclass(as.Date("1970-01-02"))
## [1] 1
y <- x + 7
y
## [1] "1970-01-08"
unclass(y)               # 1970년 1월 1일 즉 Julian date 0일 기준으로 계산
## [1] 7
as.integer(y)            # 1970년 1월 1일 즉 Julian date 0일 기준으로 계산
## [1] 7
julian(y)                # 1970년 1월 1일 즉 Julian date 0일 기준으로 계산 
## [1] 7
## attr(,"origin")
## [1] "1970-01-01"
weekdays(y)
## [1] "목요일"
months(y)
## [1] "1월"
quarters(y)
## [1] "Q1"
y + 1:7
## [1] "1970-01-09" "1970-01-10" "1970-01-11" "1970-01-12" "1970-01-13"
## [6] "1970-01-14" "1970-01-15"
weekdays(y + 1:7)
## [1] "금요일" "토요일" "일요일" "월요일" "화요일" "수요일" "목요일"
start <- as.Date("2021-01-01")
end <- as.Date("2021-01-31")
seq(from=start, to=end, by=1)
##  [1] "2021-01-01" "2021-01-02" "2021-01-03" "2021-01-04" "2021-01-05"
##  [6] "2021-01-06" "2021-01-07" "2021-01-08" "2021-01-09" "2021-01-10"
## [11] "2021-01-11" "2021-01-12" "2021-01-13" "2021-01-14" "2021-01-15"
## [16] "2021-01-16" "2021-01-17" "2021-01-18" "2021-01-19" "2021-01-20"
## [21] "2021-01-21" "2021-01-22" "2021-01-23" "2021-01-24" "2021-01-25"
## [26] "2021-01-26" "2021-01-27" "2021-01-28" "2021-01-29" "2021-01-30"
## [31] "2021-01-31"
seq(from=start, by=1, length.out=7)
## [1] "2021-01-01" "2021-01-02" "2021-01-03" "2021-01-04" "2021-01-05"
## [6] "2021-01-06" "2021-01-07"
seq(from=start, by="7 days", length.out=9)
## [1] "2021-01-01" "2021-01-08" "2021-01-15" "2021-01-22" "2021-01-29"
## [6] "2021-02-05" "2021-02-12" "2021-02-19" "2021-02-26"
seq(from=start, by="week", length.out=9)
## [1] "2021-01-01" "2021-01-08" "2021-01-15" "2021-01-22" "2021-01-29"
## [6] "2021-02-05" "2021-02-12" "2021-02-19" "2021-02-26"
seq(from=start, by="month", length.out=12)
##  [1] "2021-01-01" "2021-02-01" "2021-03-01" "2021-04-01" "2021-05-01"
##  [6] "2021-06-01" "2021-07-01" "2021-08-01" "2021-09-01" "2021-10-01"
## [11] "2021-11-01" "2021-12-01"
seq(from=start, by="3 months", length.out=4)
## [1] "2021-01-01" "2021-04-01" "2021-07-01" "2021-10-01"
seq(from=start, by="year", length.out=10)
##  [1] "2021-01-01" "2022-01-01" "2023-01-01" "2024-01-01" "2025-01-01"
##  [6] "2026-01-01" "2027-01-01" "2028-01-01" "2029-01-01" "2030-01-01"
seq(from=as.Date("2020-01-30"), by="month", length.out=6)
## [1] "2020-01-30" "2020-03-01" "2020-03-30" "2020-04-30" "2020-05-30"
## [6] "2020-06-30"
start <- as.Date("2020-01-01")
qrt <- seq(from=start, by="3 months", length.out=4)
months(qrt)
## [1] "1월"  "4월"  "7월"  "10월"
quarters(qrt)
## [1] "Q1" "Q2" "Q3" "Q4"
Sys.setlocale("LC_ALL", "English")
## [1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"
months(qrt)
## [1] "January" "April"   "July"    "October"
Sys.setlocale("LC_ALL", "Korean")
## [1] "LC_COLLATE=Korean_Korea.949;LC_CTYPE=Korean_Korea.949;LC_MONETARY=Korean_Korea.949;LC_NUMERIC=C;LC_TIME=Korean_Korea.949"
months(qrt)
## [1] "1월"  "4월"  "7월"  "10월"

Times in R

x <- Sys.time()
x                  # 현재 POSIXct class
## [1] "2020-05-20 05:01:47 KST"
p <- as.POSIXlt(x) # POSIXlt class로 변환
p
## [1] "2020-05-20 05:01:47 KST"
names(unclass(p))
##  [1] "sec"    "min"    "hour"   "mday"   "mon"    "year"   "wday"   "yday"  
##  [9] "isdst"  "zone"   "gmtoff"
p$year+1900 # 1900을 더해야 실제 연도가 나옴
## [1] 2020
p$mon +1    # 1을 더해야 실제 월이 나옴 
## [1] 5
p$mday
## [1] 20
p$wday      #일요일은 0, 월요일은 1, 화요일은 2, ...
## [1] 3
p$hour
## [1] 5
p$min
## [1] 1
p$sec
## [1] 47.91181
x <- Sys.time()
x           ## 현재 POSIXct class
## [1] "2020-05-20 05:01:47 KST"
unclass(x)
## [1] 1589918508
# x$sec    # Error
p <- as.POSIXlt(x)
p$sec
## [1] 47.94418
y <- "2020"
m <- "05"
d <- "10"
ISOdate(y, m, d)               # ISODate()함수는 POSIXct객체(날짜정보 초단위 저장) 생성
## [1] "2020-05-10 12:00:00 GMT"
class(ISOdate(y, m, d))
## [1] "POSIXct" "POSIXt"
as.Date(ISOdate(y, m, d))      # Date 클래스(날짜정보 일단위 저장)로 전환
## [1] "2020-05-10"

Operations on Dates and Times

Sys.setlocale("LC_ALL", "English")
## [1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"
x <- as.Date("12/31/2020",format="%m/%d/%Y" )
x
## [1] "2020-12-31"
y <- strptime("9 Jan 2019 11:34:21", "%d %b %Y %H:%M:%S")
# x-y   # Error
x <- as.POSIXlt(x)    # x를 POSIXlt class로 변환
x-y
## Time difference of 721.8928 days

format conversion

x <- as.Date("12/31/2020",format="%m/%d/%Y")  # Date class전환을 위한 format 인식
format(x, format="%B %d, %Y, %A")             # format 변환
## [1] "December 31, 2020, Thursday"
a <- Sys.time()                               # POSIXct class
a 
## [1] "2020-05-20 05:01:48 KST"
format(a,format="%B %d, %Y, %a")              # format 변환
## [1] "May 20, 2020, Wed"

#locale 변경

Sys.setlocale("LC_ALL","Korean")              # Korean으로 변경 
## [1] "LC_COLLATE=Korean_Korea.949;LC_CTYPE=Korean_Korea.949;LC_MONETARY=Korean_Korea.949;LC_NUMERIC=C;LC_TIME=Korean_Korea.949"
format(a,format="%B %d, %Y, %a")              # format 변환
## [1] "5월 20, 2020, 수"
moon <- as.POSIXct("1969/07/20, 20:17:39", format="%Y/%m/%d, %H:%M:%S", tz="UTC")
moon
## [1] "1969-07-20 20:17:39 UTC"
format(moon, "The time of the Apollo moon landing was %Y-%b-%d, at %H:%M:%S.")
## [1] "The time of the Apollo moon landing was 1969-7-20, at 20:17:39."
format(moon, "인류 최초의 달 착륙은 %Y년 %m월 %d일, %H시 %M분 %S초에 이루어졌다")
## [1] "<U+C778><U+B958> <U+CD5C><U+CD08><U+C758> <U+B2EC> <U+CC29><U+B959><U+C740> 1969<U+B144> 07<U+C6D4> 20<U+C77C>, 20<U+C2DC> 17<U+BD84> 39<U+CD08><U+C5D0> <U+C774><U+B8E8><U+C5B4><U+C84C><U+B2E4>"