R로 BCWJ를 조사하고 그래프를 그리는 노트

5677 단어 RubyBCCWJ
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)의 연어수가 클수록 작다는 것이다.

좋은 웹페이지 즐겨찾기