---
title: "ICC Written Launch"
output:
  html_document:
    css: style.css
    self_contained: yes
date: "`r Sys.Date()`"
---

```{r setup, include=FALSE, echo=FALSE, warning=FALSE}
knitr::opts_chunk$set(echo = FALSE, warnings = FALSE)
source("common.R")
```

# Actual composition of ICC parts

## Composition by ICC genre

```{r composition_by_genre, message = FALSE}
icc_genre <- icc %>%
  expand_grid(genre) %>%
  mutate(vc = paste0("iccGenre=", genre)) %>%
  rowwise() %>%
  mutate(tokens= corpusStats(icc_con(lang, token), vc = vc)@tokens)

icc_genre %>% ggplot(aes(x=lang, fill=genre, y=tokens)) +
  geom_col() + scale_y_continuous(labels = label_number(scale_cut = cut_short_scale())) +
  theme_ids() +
  scale_fill_ids() +
  geom_text(aes(label=if_else(tokens > 0, as.character(tokens), ""), y=tokens), position= position_stack(reverse = F, vjust = 0.5), color="black", size=3.2, family="Fira Sans Condensed")

```

## Composition by date of publication


```{r composition_by_pubdate}
year <- c(1988:2023)

icc_year <- icc %>%
  expand_grid(year) %>%
  mutate(vc = paste0("pubDate in ", year)) %>%
  rowwise() %>%
  mutate(tokens= corpusStats(icc_con(lang, token), vc = vc)@tokens)

icc_year %>% ggplot(aes(x=year, fill=lang, color=lang, y=tokens)) +
  geom_line() +
  geom_point() +
  scale_y_continuous(labels = label_number(scale_cut = cut_short_scale())) +
  theme_ids()
```

## Part-of-Speech proportions

```{r pos_proportions}
POS_tag <- c(
  "ADJ", 	"ADP",#	"PUNCT",
  "ADV",	"AUX",	# "SYM",
  # "INTJ",
  "CCONJ", #	"X",
  "NOUN",	"DET",
  "PROPN",	#"NUM",
  "VERB",	#"PART",
  "PRON",
  "SCONJ"
  )

icc_by_pos_tag <- icc %>% expand_grid(POS = POS_tag) %>%
  rowwise() %>%
  mutate(f = frequencyQuery(icc_con(lang), sprintf("[ud/p=%s]", POS))$f)

icc_by_pos_tag %>% ggplot(aes(x=lang, fill = POS, y=f)) +
  geom_col() + scale_y_continuous(labels = label_number(scale_cut = cut_short_scale())) +
  scale_fill_ids() + scale_color_ids() +
  theme_ids(base_size = 12) +
  geom_text(aes(label=sprintf("%.2f%%", 100*f), y=f), position= position_stack(reverse = F, vjust = 0.5), color="black", size=3.2, family="Fira Sans Condensed")
```

# Pilot study: Identification of Light Verb Constructions with *take*

```{r prepare_ca, output=FALSE, message=FALSE}




```

## English: *take*

```{r take_icc, echo=TRUE, message=FALSE}
take_ca_icc <-
  collocationAnalysis(
    icc_con("eng"),
    "focus({[ud/l=take]} [ud/p=NOUN])",
    leftContextSize = 0,
    rightContextSize = 1,
    minOccur = 2,
    addExamples = T
  )

take_ca_icc %>% show_table()
```

## German: *nehmen*

```{r nehmen_icc, echo=TRUE}
nehmen_ca_icc <-
  collocationAnalysis(
    icc_con("ger"),
    "focus([tt/p=NN] {[tt/l=nehmen]})",
    leftContextSize = 1,
    rightContextSize = 0,
    minOccur = 2,
    addExamples = T
  )
nehmen_ca_icc %>% show_table()
```

### For comparison based on the whole DeReKo

```{r nehmen_dereko}
nehmen_ca_dereko <- readRDS("../data/ca_nehmen_dereko_examples")
nehmen_ca_dereko %>% show_table()
```

## Norwegian: *ta*

```{r ta_icc, echo=T, message=FALSE}
ta_ca_icc <-
  collocationAnalysis(
    icc_con("nor"),
    "focus({[ud/l=ta]} [ud/p=NOUN])",
    leftContextSize = 0,
    rightContextSize = 1,
    minOccur = 2,
    addExamples = T
  )
ta_ca_icc %>% show_table()
```

