R로 BCWJ를 조사하고 그래프를 그리는 노트
tidyverse
데이터를 효율적으로 통계하기 위해 dplyr와tidyr라는 프로그램 라이브러리를 사용했습니다.예쁜 도표를 그리기 위해 ggplot2라는 프로그램 라이브러리를 사용합니다.이것도 단독으로 설치할 수 있지만 tidyverse라는 프로그램 라이브러리를 설치하면 함께 사용할 수 있다.
install.packages("tidyverse")
설치 후 포장에 넣습니다.library(tidyverse)
(BCWJ)
BCWJ DVD에 수록된 레이블을 사용하여 데이터를 구분합니다.DVD는 학원이면 5만 엔 정도 되니까 연구비로 사요.core는 DVD 어딘가에 있어요.LUW.txt라는 파일이 있어요.BCWJ 핵심 데이터의 긴 단위 탭으로 텍스트를 구분합니다.R로 이것을 읽어서 분석하다.DVD에서 직접 읽는 것은 매우 느리기 때문에 PC의 적당한 폴더로 미리 복사합니다.
돈이 없는 경우 하늘문고 등 적합한 데이터를 mecab로 분석해 탭 구분 데이터(RMeCab이라는 R의 라이브러리도 있는 것 같다)를 작성한다.여기에는 데이터의 제작을 설명하지 않는다.DVD가 있다는 전제로 대화를 진행하다.
데이터 읽기
tidyverse에 포함된readr 패키지를 사용하면 데이터를 읽는 데 매우 편리합니다.탭 문자로 데이터를 구분하면readr::readtsv를 사용합니다.
source <- read_tsv('core_LUW.txt', col_names = F, na = character() )
열명이 없으면 불편하니 열명을 붙여야 한다.열의 정의는 여기.를 참조하십시오.colnames(source) <- c(
'reg', 'sample_id', 'start', 'end',
'b', 'suw', 'fix', 'var', 'lemma', 'lform',
'wtype', 'pos', 'ctype', 'cform', 'wform',
'orthbase', 'orth', 'orig', 'pron',
'order', 'o_start', 'o_end', 's'
)
자료 라이브러리의 규모를 확인하다
BCWJ 핵심 데이터는 스마트백(OC), 백서(OW), 블로그(OY), 서적(PB), 잡지(PM), 신문(PN) 레지스터 6개다.각 레지스터에 대해 견본수, 문수, 문절수, 긴 단수를 합계한다.
source %>%
group_by(reg, sample_id) %>%
summarise(
sentences = sum(s == 'B'),
chunks = sum(b == 'B'),
words = n()
) %>%
group_by(reg) %>%
summarise(
samples = n(),
sentences = sum(sentences),
chunks = sum(chunks),
words = sum(words)
)
group_by 조합으로 사용되는 열 이름을 지정하고,summarise로 각 그룹을 합계하는 등 처리합니다.n()은 각 그룹의 총 행 수를 계산합니다.sum (name)은 그룹별로 열name의 합계를 계산합니다.sum(name==value)은 열name의 값이value인 줄의 수를 계산한다(이론적으로name=value의 부분이 사실이라면 1이고 가짜라면 0으로 합계를 계산한다).결과는 다음과 같다.# A tibble: 6 × 5
reg samples sentences chunks words
<chr> <int> <int> <int> <int>
1 OC 938 6413 36740 94655
2 OW 62 6037 68449 158909
3 OY 471 7455 38577 98783
4 PB 83 10075 84736 199407
5 PM 86 12953 83078 194961
6 PN 340 17050 116960 273132
핵심 데이터는 각 레지스터의 짧은 단자릿수와 같은 정도의 샘플링이어야 하지만 긴 단위라면 상당한 차이가 있을 수 있다.문장 길이
각 견본의 자수/자수를 계산하고 문장의 평균 자수를 조사한다.
samples <-
source %>%
group_by(reg, sample_id) %>%
summarise(
sentences = sum(s == 'B'),
words = n()
) %>%
mutate(len = words / sentences)
문자 수는 다음과 같습니다.samples <-
group_by(reg, sample_id) %>%
summarise(
sentences = sum(s == 'B'),
chars = sum(nchar(orig))
) %>%
mutate(len = chars / sentences)
히스토그램ggplot(samples) +
aes(x = len) +
geom_histogram() +
facet_wrap(~reg)
상자형 수염도
ggplot(samples) +
aes(x = reg, y = len) +
geom_boxplot()
언어의 종류
명사에만 한정되어 각 레지스터의 어종의 세목을 도표로 만든다.
source %>%
separate(pos, c("pos1", "pos2", "pos3", "pos4"), fill = "right") %>%
filter(pos1 == "名詞") %>%
group_by(reg, wtype) %>%
summarise(n = n()) %>%
ggplot() +
aes(x = reg, y = n, fill = wtype) +
geom_bar(stat = "identity", position = "fill") +
theme_gray(base_family = "HiraginoSans-W3")
도대체 백서는 중국어가 많다.
지프의 법칙
단어의 주파수 순서와 주파수가 반비례하는 법칙.
source %>%
group_by(lemma, lform, pos) %>%
summarise(n = n()) %>%
ungroup %>%
arrange(desc(n)) %>%
mutate(rank = c(1:nrow(.))) %>%
ggplot() +
aes(x = log(rank), y = log(n)) %>%
geom_line()
두 대수의 도표를 만들면 아마 곧아질 것이다.
서로 다른 어수와 연어수
source %>%
group_by(reg, sample_id, lemma, lform, pos) %>%
summarise(tokens = n()) %>%
group_by(reg, sample_id) %>%
summarise(types = n(), tokens = sum(tokens)) %>%
ggplot() +
aes(x = tokens, y = types, colour = reg) %>%
geom_point()
다른 것은 어수와 연어수는 비례가 없다는 것이다.이른바 TTR(Type-Token Ratio)의 연어수가 클수록 작다는 것이다.
Reference
이 문제에 관하여(R로 BCWJ를 조사하고 그래프를 그리는 노트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/aadiimmz/items/4577d522fb5fe5d597ce텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)