From d5bdb60c560da03175c8a52c687640ecfbe81965 Mon Sep 17 00:00:00 2001 From: Filip Gralinski Date: Sat, 26 Feb 2022 19:04:33 +0100 Subject: [PATCH] 02 --- wyk/02_Jezyki.org | 185 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) diff --git a/wyk/02_Jezyki.org b/wyk/02_Jezyki.org index 60fe8f4..84b302e 100644 --- a/wyk/02_Jezyki.org +++ b/wyk/02_Jezyki.org @@ -242,6 +242,94 @@ Tę własność tekstów nazywamy **prawem Zipfa**. #+RESULTS: [[file:pt-words-log-log.png]] +*** Związek między frekwencją a długością + +Powiązane z prawem Zipfa prawo językowe opisuje zależność między +częstością użycia słowa a jego długością. Generalnie im krótsze słowo, tym częstsze. + +#+BEGIN_SRC python :session mysession :results file + def freq_vs_length(name, g, top=None): + freq = freq_list(g) + + plt.figure().clear() + plt.scatter([len(x) for x in freq.keys()], [log(y) for y in freq.values()], + facecolors='none', edgecolors='r') + + fname = f'{name}.png' + + plt.savefig(fname) + + return fname + + freq_vs_length('pt-lengths', get_words(pan_tadeusz)) +#+END_SRC + +#+RESULTS: +[[file:pt-lengths.png]] + +** N-gramy + +W modelowaniu języka często rozpatruje się n-gramy, czyli podciągi o +rozmiarze $n$. + +Na przykład /digramy/ (/bigramy/) to zbitki dwóch jednostek, np. liter albo wyrazów. + +|$n$| | nazwa | +|---+---------+---------------+ +| 1 | 1-gram | unigram | +| 2 | 2-gram | digram/bigram | +| 3 | 3-gram | trigram | +| 4 | 4-gram | tetragram | +| 5 | 5-gram | pentagram | + +**Pytanie** Jak nazywa się 6-gram? + +Jak widać, dla symetrii mówimy czasami o unigramach, jeśli operujemy +po prostu na jednostkach, nie na ich podciągach. + +*** N-gramy z Pana Tadeusza + +Statystyki, które policzyliśmy dla pojedynczych liter czy wyrazów możemy powtórzyć dla n-gramów. + +#+BEGIN_SRC python :session mysession :exports both :results raw drawer + def ngrams(iter, size): + ngram = [] + for item in iter: + ngram.append(item) + if len(ngram) == size: + yield tuple(ngram) + ngram = ngram[1:] + + list(ngrams("kotek", 3)) +#+END_SRC + +#+RESULTS: +:results: +[('k', 'o', 't'), ('o', 't', 'e'), ('t', 'e', 'k')] +:end: + +Zauważmy, że policzyliśmy wszystkie n-gramy, również częściowo pokrywające się. + +Zawsze powinniśmy się upewnić, że jest jasne, czy chodzi o n-gramy znakowe czy wyrazowe + +*** 3-gramy znakowe + +#+BEGIN_SRC python :session mysession :results file + log_rang_log_freq('pt-3-char-ngrams-log-log', ngrams(get_characters(pan_tadeusz), 3)) +#+END_SRC + +#+RESULTS: +[[file:pt-3-char-ngrams-log-log.png]] + +*** 2-gramy wyrazowe + +#+BEGIN_SRC python :session mysession :results file + log_rang_log_freq('pt-2-word-ngrams-log-log', ngrams(get_words(pan_tadeusz), 3)) +#+END_SRC + +#+RESULTS: +[[file:pt-2-word-ngrams-log-log.png]] + ** Tajemniczy język Manuskryptu Wojnicza [[https://pl.wikipedia.org/wiki/Manuskrypt_Wojnicza][Manuskrypt Wojnicza]] to powstały w XV w. manuskrypt spisany w @@ -306,3 +394,100 @@ dramatycznie na analizę statystyczną. #+RESULTS: [[file:voy-words-log-log.png]] + +** Język DNA + +Kod genetyczny przejawia własności zaskakująco podobne do języków naturalnych. +Przede wszystkim ma charakter dyskretny, genotyp to ciąg symboli ze skończonego alfabetu. +Podstawowe litery są tylko cztery, reprezentują one nukleotydy, z których zbudowana jest nić DNA: +a, g, c, t. + + +#+BEGIN_SRC python :session mysession :exports both :results raw drawer + import requests + + dna_url = 'https://raw.githubusercontent.com/egreen18/NanO_GEM/master/rawGenome.txt' + dna = requests.get(dna_url).content.decode('utf-8') + + dna = ''.join(dna.split('\n')[1:]) + dna = dna.replace('N', 'A') + + dna[0:100] +#+END_SRC + +#+RESULTS: +:results: +TATAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTA +:end: + +#+BEGIN_SRC python :session mysession :results file + rang_freq_with_labels('dna-chars', get_characters(dna)) +#+END_SRC + +#+RESULTS: +[[file:dna-chars.png]] + +*** Tryplety — znaczące cząstki genotypu + +Nukleotydy rzeczywiście są jak litery, same w sobie nie niosą +znaczenia. Dopiero ciągi trzech nukleotydów, /tryplety/, kodują jeden +z dwudziestu aminokwasów. + +#+BEGIN_SRC python :session mysession :results file + genetic_code = { + 'ATA':'I', 'ATC':'I', 'ATT':'I', 'ATG':'M', + 'ACA':'T', 'ACC':'T', 'ACG':'T', 'ACT':'T', + 'AAC':'N', 'AAT':'N', 'AAA':'K', 'AAG':'K', + 'AGC':'S', 'AGT':'S', 'AGA':'R', 'AGG':'R', + 'CTA':'L', 'CTC':'L', 'CTG':'L', 'CTT':'L', + 'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCT':'P', + 'CAC':'H', 'CAT':'H', 'CAA':'Q', 'CAG':'Q', + 'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGT':'R', + 'GTA':'V', 'GTC':'V', 'GTG':'V', 'GTT':'V', + 'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCT':'A', + 'GAC':'D', 'GAT':'D', 'GAA':'E', 'GAG':'E', + 'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGT':'G', + 'TCA':'S', 'TCC':'S', 'TCG':'S', 'TCT':'S', + 'TTC':'F', 'TTT':'F', 'TTA':'L', 'TTG':'L', + 'TAC':'Y', 'TAT':'Y', 'TAA':'_', 'TAG':'_', + 'TGC':'C', 'TGT':'C', 'TGA':'_', 'TGG':'W', + } + + def get_triplets(t): + for triplet in re.finditer(r'.{3}', t): + yield genetic_code[triplet.group(0)] + + rang_freq_with_labels('dna-aminos', get_triplets(dna)) +#+END_SRC + +#+RESULTS: +[[file:dna-aminos.png]] + +*** „Zdania” w języku DNA + +Z aminokwasów zakodowanych przez tryplet budowane są białka. +Maszyneria budująca białka czyta sekwencję aż do napotkania +trypletu STOP (_ powyżej). Taka sekwencja to /gen/. + +#+BEGIN_SRC python :session mysession :results file + def get_genes(triplets): + gene = [] + for ammino in triplets: + if ammino == '_': + yield gene + gene = [] + else: + gene.append(ammino) + + plt.figure().clear() + plt.hist([len(g) for g in get_genes(get_triplets(dna))], bins=100) + + fname = 'dna_length.png' + + plt.savefig(fname) + + fname +#+END_SRC + +#+RESULTS: +[[file:dna_length.png]]