NPL - Natural Language Processing PSDT - Prelucrarea statistica a datelor text
Incarcarea pachetelor necesare in sesiunea de lucru:
Setul de date analizata in cadrul articolului este creat de la zero, fiind format din sapte poezii diferite, in limba engleza, scrise de diferiti autori. Poeziile incluse in setul de date sunt disponibile pe platforma Poetryfoundation. Setul de date rezultat va fi analizat utilizand instrumentele NLP (Natural Language Processing) pentru analiza datelor text si vizualizare.
Textul complet al poeziei este disponibil aici (Still I Rise de Maya Angelou)
Vizualizam primele 6 randuri din textul poeziei:
## [1] "You may write me down in history" "With your bitter, twisted lies,"
## [3] "You may trod me in the very dirt" "But still, like dust, I'll rise."
## [5] "Does my sassiness upset you?" "Why are you beset with gloom?"
Textul complet al poeziei este disponibil aici (Kubla Khan de Samuel Taylor Coleridge)
Vizualizam primele 6 randuri din textul poeziei:
## [1] "In Xanadu did Kubla Khan"
## [2] "A stately pleasure-dome decree:"
## [3] "Where Alph, the sacred river, ran"
## [4] "Through caverns measureless to man"
## [5] "Down to a sunless sea."
## [6] "So twice five miles of fertile ground"
Textul complet al poeziei este disponibil aici (Song of Myself (1892 version) de Walt Whitman)
Vizualizam primele 6 randuri din textul poeziei:
## [1] "Turning and turning in the widening gyre"
## [2] "The falcon cannot hear the falconer;"
## [3] "Things fall apart; the centre cannot hold;"
## [4] "Mere anarchy is loosed upon the world,"
## [5] "The blood-dimmed tide is loosed, and everywhere"
## [6] "The ceremony of innocence is drowned;"
Textul complet al poeziei este disponibil aici (Because I could not stop for Death – (479) de Emily Dickinson)
Vizualizam primele 6 randuri din textul poeziei:
## [1] "Because I could not stop for Death"
## [2] "He kindly stopped for me"
## [3] "The Carriage held but just Ourselves"
## [4] "And Immortality."
## [5] "We slowly drove He knew no haste"
## [6] "And I had put away"
Textul complet al poeziei este disponibil aici (Ode to a Nightingale de John Keats)
Vizualizam primele 6 randuri din textul poeziei:
## [1] "My heart aches, and a drowsy numbness pains"
## [2] "My sense, as though of hemlock I had drunk,"
## [3] "Or emptied some dull opiate to the drains"
## [4] "One minute past, and Lethe-wards had sunk:"
## [5] "'Tis not through envy of thy happy lot,"
## [6] "But being too happy in thine happiness, "
Textul complet al poeziei este disponibil aici (The Rime of the Ancient Mariner de Samuel Taylor Coleridge)
Vizualizam primele 6 randuri din textul poeziei:
## [1] " It is an ancient Mariner,"
## [2] "And he stoppeth one of three."
## [3] "By thy long grey beard and glittering eye,"
## [4] "Now wherefore stopp'st thou me?"
## [5] "The Bridegroom's doors are opened wide,"
## [6] "And I am next of kin;"
Textul complet al poeziei este disponibil aici (Ode to the West Wind de Percy Bysshe Shelley)
Vizualizam primele 6 randuri din textul poeziei:
## [1] "O wild West Wind, thou breath of Autumn's being,"
## [2] "Thou, from whose unseen presence the leaves dead"
## [3] "Are driven, like ghosts from an enchanter fleeing,"
## [4] "Yellow, and black, and pale, and hectic red,"
## [5] "Pestilence-stricken multitudes: O thou,"
## [6] "Who chariotest to their dark wintry bed"
Vom adauga o coloana cu denumirea poeziei si o coloana cu pozitia fiecarui vers in cadrul poeziei
line | versuri | title |
---|---|---|
1 | You may write me down in history | Still_I_Rise |
2 | With your bitter, twisted lies, | Still_I_Rise |
3 | You may trod me in the very dirt | Still_I_Rise |
4 | But still, like dust, I'll rise. | Still_I_Rise |
5 | Does my sassiness upset you? | Still_I_Rise |
6 | Why are you beset with gloom? | Still_I_Rise |
line | versuri | title |
---|---|---|
1 | In Xanadu did Kubla Khan | Kubla_Khan |
2 | A stately pleasure-dome decree: | Kubla_Khan |
3 | Where Alph, the sacred river, ran | Kubla_Khan |
4 | Through caverns measureless to man | Kubla_Khan |
5 | Down to a sunless sea. | Kubla_Khan |
6 | So twice five miles of fertile ground | Kubla_Khan |
line | versuri | title |
---|---|---|
1 | Turning and turning in the widening gyre | Song_of_Myself |
2 | The falcon cannot hear the falconer; | Song_of_Myself |
3 | Things fall apart; the centre cannot hold; | Song_of_Myself |
4 | Mere anarchy is loosed upon the world, | Song_of_Myself |
5 | The blood-dimmed tide is loosed, and everywhere | Song_of_Myself |
6 | The ceremony of innocence is drowned; | Song_of_Myself |
line | versuri | title |
---|---|---|
1 | Because I could not stop for Death | Because_I_could_not_stop_for_Death |
2 | He kindly stopped for me | Because_I_could_not_stop_for_Death |
3 | The Carriage held but just Ourselves | Because_I_could_not_stop_for_Death |
4 | And Immortality. | Because_I_could_not_stop_for_Death |
5 | We slowly drove He knew no haste | Because_I_could_not_stop_for_Death |
6 | And I had put away | Because_I_could_not_stop_for_Death |
line | versuri | title |
---|---|---|
1 | My heart aches, and a drowsy numbness pains | Ode_to_a_Nightingale |
2 | My sense, as though of hemlock I had drunk, | Ode_to_a_Nightingale |
3 | Or emptied some dull opiate to the drains | Ode_to_a_Nightingale |
4 | One minute past, and Lethe-wards had sunk: | Ode_to_a_Nightingale |
5 | 'Tis not through envy of thy happy lot, | Ode_to_a_Nightingale |
6 | But being too happy in thine happiness, | Ode_to_a_Nightingale |
line | versuri | title |
---|---|---|
1 | It is an ancient Mariner, | Rime_of_the_Ancient_Mariner |
2 | And he stoppeth one of three. | Rime_of_the_Ancient_Mariner |
3 | By thy long grey beard and glittering eye, | Rime_of_the_Ancient_Mariner |
4 | Now wherefore stopp'st thou me? | Rime_of_the_Ancient_Mariner |
5 | The Bridegroom's doors are opened wide, | Rime_of_the_Ancient_Mariner |
6 | And I am next of kin; | Rime_of_the_Ancient_Mariner |
line | versuri | title |
---|---|---|
1 | O wild West Wind, thou breath of Autumn's being, | Ode_to_the_West_Wind |
2 | Thou, from whose unseen presence the leaves dead | Ode_to_the_West_Wind |
3 | Are driven, like ghosts from an enchanter fleeing, | Ode_to_the_West_Wind |
4 | Yellow, and black, and pale, and hectic red, | Ode_to_the_West_Wind |
5 | Pestilence-stricken multitudes: O thou, | Ode_to_the_West_Wind |
6 | Who chariotest to their dark wintry bed | Ode_to_the_West_Wind |
Urmatorul pas este sa construim cu ajutorul functiei rbind() setul de date denumit poezii:
line | versuri | title |
---|---|---|
1 | You may write me down in history | Still_I_Rise |
2 | With your bitter, twisted lies, | Still_I_Rise |
3 | You may trod me in the very dirt | Still_I_Rise |
4 | But still, like dust, I'll rise. | Still_I_Rise |
5 | Does my sassiness upset you? | Still_I_Rise |
6 | Why are you beset with gloom? | Still_I_Rise |
Setul de date (poezii) este format din 7 poezii, in care fiecare linie ofera informatii cu privire la:
numarul versului in cadrul poemului,
textul versului
titlul poeziei din care face parte versul
Cele 7 titluri ale poeziilor analizate sunt:
title |
---|
Still_I_Rise |
Kubla_Khan |
Song_of_Myself |
Because_I_could_not_stop_for_Death |
Ode_to_a_Nightingale |
Rime_of_the_Ancient_Mariner |
Ode_to_the_West_Wind |
“Tabelul. Structura datafram-ului analizat.Setul de date: contine 7 poezii
Nr.Crt. | line | versuri | title |
---|---|---|---|
1 | 1 | You may write me down in history | Still_I_Rise |
2 | 2 | With your bitter, twisted lies, | Still_I_Rise |
3 | 3 | You may trod me in the very dirt | Still_I_Rise |
4 | 4 | But still, like dust, I'll rise. | Still_I_Rise |
5 | 5 | Does my sassiness upset you? | Still_I_Rise |
371 | 66 | Scatter, as from an unextinguish'd hearth | Ode_to_the_West_Wind |
372 | 67 | Ashes and sparks, my words among mankind! | Ode_to_the_West_Wind |
373 | 68 | Be through my lips to unawaken'd earth | Ode_to_the_West_Wind |
374 | 69 | The trumpet of a prophecy! O Wind, | Ode_to_the_West_Wind |
375 | 70 | If Winter comes, can Spring be far behind? | Ode_to_the_West_Wind |
Mai sus este prezentata structura setului de date creat (primele si ultimele 5 observatii) pe care il vom analiza.
Vom sparge versurile in cuvinte cu ajutorul functiei unnest_tokens().
Structura setului de date după aplicarea functiei unnest_tokens() este prezentat mai jos. Observam ca setul inițial conține un număr de 375 de observații (versuri), in timp ce setul de date procesat este format din 2546 observații/cuvinte. Setul de date continue atat cuvinte de legatura, cat și cuvinte ce pot exprima emotii.
Nr.Crt. | metrics | values |
---|---|---|
1 | min_length | 6 |
2 | avg_length | 37.7 |
3 | median_length | 39 |
4 | max_length | 53 |
5 | var_length | 58.8 |
6 | sd_lengthy | 7.67 |
7 | skewness | -0.745 |
8 | kurtosis | 0.838 |
9 | total_length | 9.6e+04 |
10 | num_verse | 375 |
Mai sus sunt prezentati indicatorii statistici corespunzatori versurilor analizate (numarul de caractere a unui vers, lungimea medie a numarului de caractere etc. ). Observam ca avem un total de 375 de versuri. Numarul mediu de caractere a unui vers este 37.7 caractere. 50% din versuri prezinta un numar de caractere mai mic de 39 caractere, in timp ce 50% din versuri prezinta un numar de caractere mai mare de 39 caractere. Versurile cu cel mai mare numar de caractere sunt cele din poeziile Kubla_Khan si Ode_to_the_West_Wind, in timp ce numarul minim de caractere dintr-un vers este 6 si corespunde versului I rise din poezia Still I Rise.
## 'data.frame': 2546 obs. of 12 variables:
## $ line : int 1 1 1 1 1 1 1 2 2 2 ...
## $ title : chr "Still_I_Rise" "Still_I_Rise" "Still_I_Rise" "Still_I_Rise" ...
## $ word : chr "you" "may" "write" "me" ...
## $ versuri : chr "You may write me down in history" "You may write me down in history" "You may write me down in history" "You may write me down in history" ...
## $ verse : chr "You may write me down in history" "You may write me down in history" "You may write me down in history" "You may write me down in history" ...
## $ word_length : int 3 3 5 2 4 2 7 4 4 6 ...
## $ num_vowels : int 2 1 2 1 1 1 2 1 2 2 ...
## $ num_consonants : int 1 2 3 1 3 1 5 3 2 4 ...
## $ verse_length : int 32 32 32 32 32 32 32 31 31 31 ...
## $ num_vowels_verse : int 10 10 10 10 10 10 10 9 9 9 ...
## $ num_consonants_verse: int 16 16 16 16 16 16 16 16 16 16 ...
## $ word_count_verse : int 7 7 7 7 7 7 7 5 5 5 ...
Nr.Crt. | metrics | values |
---|---|---|
1 | min_length | 2 |
2 | avg_length | 7.09 |
3 | median_length | 7 |
4 | max_length | 11 |
5 | var_length | 2.4 |
6 | sd_lengthy | 1.55 |
7 | skewness | -0.376 |
8 | kurtosis | 0.185 |
9 | total_length | 1.8e+04 |
10 | num_verse | 375 |
Mai sus sunt prezentati indicatorii statisticii descriptive corespunzatori cuvintelor dintr-un vers. Dupa cum se poate observa numarul minim de cuvinte dintr-un vers sunt 2 cuvinte (si corespunde versurilor din poeziile Still I Rise si Because_I_could_not_stop_for_Death), in timp ce numarul maxim de cuvinte dintr-un vers sunt 11 cuvinte si corespunde versului din poezia Song_of_Myself. Numarul mediu de cuvinte dintr-un vers este de 7 cuvinte.
## 'data.frame': 2546 obs. of 12 variables:
## $ line : int 1 1 1 1 1 1 1 2 2 2 ...
## $ title : chr "Still_I_Rise" "Still_I_Rise" "Still_I_Rise" "Still_I_Rise" ...
## $ word : chr "you" "may" "write" "me" ...
## $ versuri : chr "You may write me down in history" "You may write me down in history" "You may write me down in history" "You may write me down in history" ...
## $ verse : chr "You may write me down in history" "You may write me down in history" "You may write me down in history" "You may write me down in history" ...
## $ word_length : int 3 3 5 2 4 2 7 4 4 6 ...
## $ num_vowels : int 2 1 2 1 1 1 2 1 2 2 ...
## $ num_consonants : int 1 2 3 1 3 1 5 3 2 4 ...
## $ verse_length : int 32 32 32 32 32 32 32 31 31 31 ...
## $ num_vowels_verse : int 10 10 10 10 10 10 10 9 9 9 ...
## $ num_consonants_verse: int 16 16 16 16 16 16 16 16 16 16 ...
## $ word_count_verse : int 7 7 7 7 7 7 7 5 5 5 ...
Observam ca ambele distributii sunt usor asimetrice la stanga, ceea ce inseamna ca predomina versurile cu un numar mare de caractere, respectiv cuvinte.Modul este mai mare decat mediana care este mai mare decat media.
Nr.Crt. | metrics | values |
---|---|---|
1 | min_length | 1 |
2 | avg_length | 4.26 |
3 | median_length | 4 |
4 | max_length | 14 |
5 | var_length | 3.97 |
6 | sd_lengthy | 1.99 |
7 | skewness | 0.891 |
8 | kurtosis | 0.954 |
9 | total_length | 1.08e+04 |
10 | num_words | 2.55e+03 |
In Tabelul de mai sus sunt prezentați principali indicatori ai statisticii descriptive corespunzătoari cuvintelor analizate. Observam ca lungimea minima a unui cuvant este de un caracter, în timp ce lungimea maximă a unui cuvant este de 14 caractere. Observam ca 50% din cuvinte au un număr mai mic de 4 caractere, în timp ce 50% au un număr mai mare de 4 caractere. Lungimea medie a unui cuvant este de 4.3 caractere.
Cuvintele cu cele mai putine caractere si poezia corespunzatoare sunt:
cuvintele cu cele mai multe caractere si poezia corespunzatoare sunt:
Nr.Crt. | metrics | values |
---|---|---|
1 | min_vowels | 3 |
2 | avg_vowels | 11.2 |
3 | median_vowels | 12 |
4 | max_vowels | 18 |
5 | var_vowels | 6.28 |
6 | sd_vowels | 2.51 |
7 | skewness | -0.377 |
8 | kurtosis | 0.183 |
9 | total_vowels | 2.86e+04 |
10 | num_verse | 375 |
In Tabelul de mai sus sunt prezentați principali indicatori ai statisticii descriptive corespunzătoari vocalelor din versurile analizate. Observam ca numarul minim de vocale dintr-un vers este de 3 vocale, în timp ce numarul maxim de vocale dintr-un vers este de 18 vocale. Observam ca 50% din cuvinte au un număr de vocale mai mic de 12 vocale, în timp ce 50% au un număr de vocale mai mare de 12 vocale Numarul medie de vocale dintr-un vers este de 11.2 vocale. Numarul total de vocale inregistrat la nivelul setului de date este de ~ 28600 vocale. Numarul de vocale se abate, in medie, de la valoare nivelului mediu de vocale cu plus/minus 2.5 vocale.
Versurile cu cele mai mic numar de vocale sunt:
Versurile cu cele mai mare numar de vocale sunt:
Nr.Crt. | metrics | values |
---|---|---|
1 | min_consonants | 2 |
2 | avg_consonants | 18.9 |
3 | median_consonants | 19 |
4 | max_consonants | 29 |
5 | var_consonants | 19.5 |
6 | sd_consonants | 4.42 |
7 | skewness | -0.516 |
8 | kurtosis | 0.326 |
9 | total_consonants | 4.82e+04 |
10 | num_verse | 375 |
In Tabelul de mai sus sunt prezentați principali indicatori ai statisticii descriptive corespunzătoari consoanelor din versurile analizate. La nivelul intregului set de date avem un numar de ~ 48200 de consoane. Observam ca numarul minim de consoane dintr-un vers este de 2 consoane, în timp ce numarul maxim de consoane dintr-un vers este de 29 consoane. Observam ca 50% din cuvinte au un număr de consoane mai mic de 19, în timp ce restul au un număr de consoane mai mare de 19. Numarul mediu de consoane dintr-un vers este de 18.9 consoane.
Versurile cu cele mai mic numar de consoane sunt:
Versurile cu cele mai mare numar de consoane sunt:
Nr.Crt. | metrics | values |
---|---|---|
1 | min_vowels | 0 |
2 | avg_vowels | 1.58 |
3 | median_vowels | 1 |
4 | max_vowels | 6 |
5 | var_vowels | 0.667 |
6 | sd_vowels | 0.816 |
7 | skewness | 1.17 |
8 | kurtosis | 1.79 |
9 | total_vowels | 4.02e+03 |
10 | num_verse | 375 |
Cuvintele cu cele mai mic numar de vocale sunt:
Cuvintele cu cele mai mare numar de vocale sunt:
Nr.Crt. | metrics | values |
---|---|---|
1 | min_consonants | 0 |
2 | avg_consonants | 2.66 |
3 | median_consonants | 2 |
4 | max_consonants | 9 |
5 | var_consonants | 2.05 |
6 | sd_consonants | 1.43 |
7 | skewness | 0.615 |
8 | kurtosis | 0.396 |
9 | total_consonants | 6.78e+03 |
10 | num_verse | 375 |
Cuvintele cu cele mai mic numar de consoane sunt:
Cuvintele cu cele mai mare numar de consoane sunt:
Observam ca poezia Ode to the West Wind prezinta cele mai multe caractere per vers (42.85 caractere), in timp ce la polul opus se situeaza poezia Because I could not stop for Death cu un numar mediu de caractere de 29.39.
Observam ca poezia Still I rise prezinta cel mai mare procent al raportului v/c. Poeziile cu versuri lungi tind să aibă un raport vocale/consoane moderat (cum ar fi de exemplu versurile poeziei Ode to the West Wind (0.62) sau Ode to a Nightingale (0.6) ). Poeziile cu versuri scurte și raport mic vocale/consoane (Rime of the Ancient Mariner) sunt mai concentrate și au un stil dramatic. Poezia Still I Rise (cu un raport v/c = 6.69) prezinta versuri relativ scurte, dar foarte placute, cel mai probabil reflectând optimismul autorului.
Numarul mediu de cuvinte utilizate de autor intr-un vers reprezinta lungimea medie a versurilor si ofera informatii cu privire la stilul autorului. Versurile scurte - cu un numar mic de cuvinte indica un stil simplu si concentrat cum ar fi de exemplu versurile din poezia Rime of the Ancient Mariner care prezinta versuri scurte, cu un numar mediu de cuvinte per vers de 6.18 cuvinte. In timp ce versurile lungi indica un stil mai descriptiv/filosofic, cum ar fi in cazul nostru versurile din poeziile Ode to the West Wind (cu un numar mediu de cuvinte per vers de 7.98 cuvinte) și Song of Myself (cu un numar mediu de cuvinte per vers de 7.72) care prezinta cele mai lungi versuri.
Pentru a pune in evidenta caracteristicile fonetice ale poeziilor analizate s-a calculate raportul dintre numarul de vocale si numarul de consoane. S-a constatat ca textele cu un numar mai mare de vocale sunt mai placut de ascultat (pe principiu vorba dulce mult aduce). In timp ce, textele cu un numar mai mare de consoane sunt mai dure, mai dramatice. Still_I_Rise (0.62) are cel mai mare raport vocale/consoane, ceea ce sugerează că textul este cel mai probabil mai eufonic. Rime_of_the_Ancient_Mariner (0.550) și Because_I_could_not_stop_for_Death (0.550) au cele mai mici rapoarte, sugerând un ton mai dramatic. Poeziile precum Ode_to_the_West_Wind (0.590) și Ode_to_a_Nightingale (0.570) pare sa prezinte, in acest caz, un echilibru între cele doua tipuri de texte, ceea ce poate reflecta stilului autorilor.
In aceasta sectiune ne propunem sa vedem daca exista diferente semnificative intre valorile medii ale celor spate poezii.
Observam ca in toate cazurile ipoteza nula este respinsa, cu un risc asumat de 5%. Prin urmare, exista diferente semnficative intre mediile testate. Rezultatul testului ANOVA indică faptul că structura versurilor (modul in care sunt distributie cuvintele in vers, distributia lungimii versului, distributia vocalelor și distribuția consoanelor în cadrul versurilor) joacă un rol important în definirea stilului autorilor care au scris poeziile analizate.
Dupa cum se poate observa, setului de date initial contine un numar de 2546 cuvinte (cuvinte ce pot exprima emotii si cuvinte de legatura).
Vom analiza mai intai cuvintele de legatura folosite in cadrul poeziilor analizate
Avem un numar de 210 observatii (cuvinte de legatura unice), precum: the, and, of etc.
Distributia dupa cuvintele de legatura
Numarul de cuvinte ce ar putea exprima o emotie dupa eliminarea cuvintelor de legatura este:
Observam ca avem un numar de 867 de cuvinte unice ce ar putea exprima emotii
## [1] 867 3
Qiushi Yan, Notes for Text Mining with R: A Tidy Approach, 2020, https://bookdown.org/Maxine/tidy-text-mining/compare-word-frequency.html accessed on 14.01.2025.
https://github.com/dgrtwo/tidy-text-mining/blob/master/01-tidy-text.Rmd accessed on 14.01.2025.
Silge, Julia and David Robinson. “Text Mining with R: A Tidy Approach.”, 2017.
Exploratory Data Analysis of a Dataset Consisting of Seven Poems using various R libraries, https://rpubs.com/mihaela123/1263158 accessed on 22.01.2025.