Part-of-Speech Tagging for Spanish#
Note
This section, “Working in Languages Beyond English,” is co-authored with Quinn Dombrowski, the Academic Technology Specialist at Stanford University and a leading voice in multilingual digital humanities. I’m grateful to Quinn for helping expand this textbook to serve languages beyond English.
In this lesson, we’re going to learn about the textual analysis methods part-of-speech tagging and keyword extraction for Spanish-language texts. These methods will help us computationally parse sentences and better understand words in context.
spaCy and Natural Language Processing (NLP)#
To computationally identify parts of speech, we’re going to use the natural language processing library spaCy. For a more extensive introduction to NLP and spaCy, see the previous lesson.
To parse sentences, spaCy relies on machine learning models that were trained on large amounts of labeled text data. If you’ve used the preprocessing or named entity recognition notebooks for this language, you can skip the steps for installing spaCy and downloading the language model.
Install spaCy#
To use spaCy, we first need to install the library.
!pip install -U spacy
Import Libraries#
Then we’re going to import spacy
and displacy
, a special spaCy module for visualization.
import spacy
from spacy import displacy
from collections import Counter
import pandas as pd
pd.set_option("max_rows", 400)
pd.set_option("max_colwidth", 400)
We’re also going to import the Counter
module for counting nouns, verbs, adjectives, etc., and the pandas
library for organizing and displaying data (we’re also changing the pandas default max row and column width display setting).
Download Language Model#
Next we need to download the Spanish-language model (es_core_news_md
), which will be processing and making predictions about our texts. This is the model that was trained on the annotated “AnCora” corpus. You can download the es_core_news_md
model by running the cell below:
!python -m spacy download es_core_news_md
Collecting es-core-news-md==3.1.0
Downloading https://github.com/explosion/spacy-models/releases/download/es_core_news_md-3.1.0/es_core_news_md-3.1.0-py3-none-any.whl (42.7 MB)
|████████████████████████████████| 42.7 MB 6.3 MB/s eta 0:00:01
?25hRequirement already satisfied: spacy<3.2.0,>=3.1.0 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from es-core-news-md==3.1.0) (3.1.2)
Requirement already satisfied: thinc<8.1.0,>=8.0.8 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (8.0.8)
Requirement already satisfied: spacy-legacy<3.1.0,>=3.0.7 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (3.0.8)
Requirement already satisfied: blis<0.8.0,>=0.4.0 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (0.7.4)
Requirement already satisfied: pathy>=0.3.5 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (0.6.0)
Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (2.0.5)
Requirement already satisfied: wasabi<1.1.0,>=0.8.1 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (0.8.2)
Requirement already satisfied: numpy>=1.15.0 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (1.20.1)
Requirement already satisfied: typer<0.4.0,>=0.3.0 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (0.3.2)
Requirement already satisfied: requests<3.0.0,>=2.13.0 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (2.25.1)
Requirement already satisfied: jinja2 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (2.11.3)
Requirement already satisfied: setuptools in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (52.0.0.post20210125)
Requirement already satisfied: catalogue<2.1.0,>=2.0.4 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (2.0.6)
Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (1.0.5)
Requirement already satisfied: pydantic!=1.8,!=1.8.1,<1.9.0,>=1.7.4 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (1.8.2)
Requirement already satisfied: packaging>=20.0 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (20.9)
Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (4.59.0)
Requirement already satisfied: srsly<3.0.0,>=2.4.1 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (2.4.1)
Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (3.0.5)
Requirement already satisfied: pyparsing>=2.0.2 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from packaging>=20.0->spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (2.4.7)
Requirement already satisfied: smart-open<6.0.0,>=5.0.0 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from pathy>=0.3.5->spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (5.2.0)
Requirement already satisfied: typing-extensions>=3.7.4.3 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from pydantic!=1.8,!=1.8.1,<1.9.0,>=1.7.4->spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (3.7.4.3)
Requirement already satisfied: certifi>=2017.4.17 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (2020.12.5)
Requirement already satisfied: chardet<5,>=3.0.2 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (4.0.0)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (1.26.4)
Requirement already satisfied: idna<3,>=2.5 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (2.10)
Requirement already satisfied: click<7.2.0,>=7.1.1 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from typer<0.4.0,>=0.3.0->spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (7.1.2)
Requirement already satisfied: MarkupSafe>=0.23 in /Users/melwalsh/opt/anaconda3/lib/python3.8/site-packages (from jinja2->spacy<3.2.0,>=3.1.0->es-core-news-md==3.1.0) (1.1.1)
✔ Download and installation successful
You can now load the package via spacy.load('es_core_news_md')
Note: spaCy offers models for other languages including Chinese, German, French, Spanish, Portuguese, Russian, Italian, Dutch, Greek, Norwegian, and Lithuanian.
spaCy offers language and tokenization support for other language via external dependencies — such as PyviKonlpy for Korean.
Load Language Model#
Once the model is downloaded, we need to load it with spacy.load()
and assign it to the variable nlp
.
nlp = spacy.load('es_core_news_md')
Create a Processed spaCy Document#
Whenever we use spaCy, our first step will be to create a processed spaCy document
with the loaded NLP model nlp()
. Most of the heavy NLP lifting is done in this line of code. After processing, the document
object will contain tons of juicy language data — named entities, sentence boundaries, parts of speech — and the rest of our work will be devoted to accessing this information.
filepath = '../texts/es.txt'
text = open(filepath, encoding='utf-8').read()
document = nlp(text)
spaCy Part-of-Speech Tagging#
The tags that spaCy uses for part-of-speech are based on work done by Universal Dependencies, an effort to create a set of part-of-speech tags that work across many different languages. Texts from various languages are annotated using this common set of tags, and contributed to a common repository that can be used to train models like spaCy.
The Universal Dependencies page has information about the annotated corpora available for each language; it’s worth looking into the corpora that were annotated for your language.
POS |
Description |
Examples |
---|---|---|
ADJ |
adjective |
big, old, green, incomprehensible, first |
ADP |
adposition |
in, to, during |
ADV |
adverb |
very, tomorrow, down, where, there |
AUX |
auxiliary |
is, has (done), will (do), should (do) |
CONJ |
conjunction |
and, or, but |
CCONJ |
coordinating conjunction |
and, or, but |
DET |
determiner |
a, an, the |
INTJ |
interjection |
psst, ouch, bravo, hello |
NOUN |
noun |
girl, cat, tree, air, beauty |
NUM |
numeral |
1, 2017, one, seventy-seven, IV, MMXIV |
PART |
particle |
’s, not, |
PRON |
pronoun |
I, you, he, she, myself, themselves, somebody |
PROPN |
proper noun |
Mary, John, London, NATO, HBO |
PUNCT |
punctuation |
., (, ), ? |
SCONJ |
subordinating conjunction |
if, while, that |
SYM |
symbol |
$, %, §, ©, +, −, ×, ÷, =, :), 😝 |
VERB |
verb |
run, runs, running, eat, ate, eating |
X |
other |
sfpksdpsxmsa |
SPACE |
space |
Above is a POS chart taken from spaCy’s website, which shows the different parts of speech that spaCy can identify as well as their corresponding labels. To quickly see spaCy’s POS tagging in action, we can use the spaCy module displacy
on our sample document
with the style=
parameter set to “dep” (short for dependency parsing):
Practicing with the example text#
When working with languages that have inflection, we typically use token.lemma_
instead of token.text
like you’ll find in the English examples. This is important when we’re counting, so that differently-inflected forms of a word (e.g. masculine vs. feminine or singular vs. plural) aren’t counted as if they were different words.
filepath = "../texts/es.txt"
document = nlp(open(filepath, encoding="utf-8").read())
Get Adjectives#
POS |
Description |
Examples |
---|---|---|
ADJ |
adjective |
big, old, green, incomprehensible, first |
To extract and count the adjectives in the example text, we will follow the same model as above, except we’ll add an if
statement that will pull out words only if their POS label matches “ADJ.”
Python Review
While we demonstrate how to extract parts of speech in the sections below, we’re also going to reinforce some integral Python skills. Notice how we use for
loops and if
statements to .append()
specific words to a list. Then we count the words in the list and make a pandas dataframe from the list.
Here we make a list of the adjectives identified in the example text:
adjs = []
for token in document:
if token.pos_ == 'ADJ':
adjs.append(token.lemma_)
adjs
['político',
'sombrío',
'imbuído',
'terrenal',
'desconsolado',
'ingrato',
'humano',
'plausibl',
'nuevo',
'eficaz',
'innúmera',
'multiplicado',
'social',
'venerable',
'entendido',
'grave',
'_',
'político',
'_',
'moralizadoro',
'colectivo',
'precioso',
'especulativo',
'individual',
'concluido',
'abstracto',
'ilustre',
'elevado',
'intelectual',
'americano',
'creador',
'lujuriós',
'invoco',
'presente',
'atrayente',
'económico',
'natural',
'ingénuo',
'intrigo',
'social',
'noble',
'fuerte',
'arenoso',
'privilegiado',
'prestigioso',
'suficiente',
'soñadora',
'adusta',
'economista',
'_',
'último',
'marcado',
'chamusquinas',
'extremo',
'armado',
'primero',
'último',
'último',
'cariñoso',
'pálido',
'mojado',
'primero',
'aguardado',
'auroro',
'dramático',
'forzado',
'risa.--solo',
'contento',
'diario',
'encorvado',
'implacable',
'terrible',
'sano',
'fuerte',
'propuesto',
'pésimo',
'querido',
'mejor',
'largo',
'uncido',
'rudo',
'pegado',
'editorial',
'folletinista',
'corrector',
'avaro',
'derrochador',
'insoluble',
'franco',
'bueno',
'largo',
'engolfado',
'presuroso',
'habitual',
'contado',
'plácido',
'bello',
'apuesto',
'melancólico',
'adverso',
'adverso',
'adverso',
'mecido',
'extraño',
'desierto',
'solo',
'solo',
'subyugado',
'siniestro',
'pobre',
'temeroso',
'acoquinado',
'fatídico',
'espiado',
'suspicaz',
'inexorable',
'gozós',
'inocente',
'desconfiado',
'ocúltanse',
'ocúltanse',
'primero',
'triste',
'enemigo',
'hostil',
'propicio',
'retrospectivo',
'tristísima',
'arrebatado',
'inglés',
'pobre',
'cruel',
'materno',
'necesario',
'bello',
'característico',
'social',
'irresistible',
'consignado',
'buen',
'benévolo',
'expansivo',
'pobre',
'oprimido',
'feliz',
'nuevo',
'caluroso',
'dulce',
'largo',
'clásico',
'superior',
'vestido',
'infantil',
'viril',
'primero',
'imponente',
'tierno',
'cumplido',
'divino',
'virtuoso',
'bueno',
'celebrante',
'derrama',
'gozosa',
'alto',
'central',
'solo',
'solemne',
'solo',
'mr',
'buen',
'enternecido',
'lindo',
'viejo',
'recuerdo',
'debido',
'primero',
'imponente',
'prez',
'profundo',
'viejo',
'lejano',
'angelical',
'santo',
'notable',
'inquieto',
'cosmopolita',
'exaltado',
'clásico',
'tricolor',
'_',
'_',
'azul',
'sagrado',
'nacional',
'lejano',
'aparecíale',
'inmenso',
'magestuoso',
'cerúlea',
'poderoso',
'luminoso',
'siniestro',
'humillante',
'consultado',
'corregido',
'dictado',
'déspoto',
'acabado',
'rendido',
'último',
'vergonzoso',
'eterno',
'profundo',
'único',
'inesperado',
'honorable',
'--«alejado',
'otro--decíale',
'sagrado.--y',
'único',
'urbano',
'rural',
'esposo',
'pidióle',
'dicho',
'motivado',
'conyugal',
'angustioso',
'aliviado',
'grave',
'largo',
'fuerte',
'persuadido',
'floreciente',
'buen',
'subido',
'réstame',
'ignorado',
'favorable',
'alejado',
'funesta',
'hostil',
'desechado',
'previsoro',
'moribundo',
'forzoso',
'independiente',
'profundo',
'honrado',
'doloroso',
'doble',
'cumplido',
'pleno',
'desamparado',
'melancólico',
'bullicioso',
'libre',
'independiente',
'pródigo',
'intelectual',
'activo',
'principal',
'brillante',
'firmado',
'pálido',
'ardiente',
'ideal',
'evocado',
'latente',
'activo',
'americano',
'intelectual',
'íntimo',
'cansado',
'empobrecido',
'rico',
'jóven',
'vano',
'idéntico',
'portador',
'nuevo',
'fuerte',
'resignado',
'querido',
'carta.--por',
'envuelto',
'producido',
'sócio',
'bribon',
'fulminante',
'munido',
'numerario',
'existente',
'enorme',
'pasivo',
'particular',
'infame',
'impuesto',
'súbita',
'desventurado',
'silencioso',
'alto',
'muerto',
'verdadero',
'humano',
'acompañado',
'especial',
'buen',
'nacional',
'cobrado',
'nacional',
'adjunto',
'noble',
'rara',
'inmenso',
'solo',
'nacional',
'puro',
'ardiente',
'severo',
'pobre',
'desterrado',
'tambien',
'desamparado',
'tutelar',
'intelectual',
'riente',
'hospitalario',
'adio',
'antiguo',
'sábio',
'buen',
'buen',
'maternal',
'helado',
'pobre',
'pequeño',
'largo',
'inglés',
'larga',
'frio',
'inmenso',
'desconocido',
'gris',
'piadosa',
'tratado',
'tierno',
'cuidado',
'reconcentrado',
'entumecido',
'dulce',
'plácido',
'necesario',
'perpétuo',
'amable',
'anciano',
'digno',
'argentino',
'halagado',
'francés',
'porteño',
'jóven',
'cariñoso',
'conocido',
'noble',
'neutral',
'fuerte',
'fuerte',
'jóven',
'musical',
'europeo',
'llegado',
'pobre',
'solo',
'hundido',
'rendido',
'último',
'viejo',
'útil',
'solo',
'agradable',
'mala',
'fuerte',
'impuesto',
'mayor',
'enternecido',
'noble',
'servicial',
'benéfico',
'venido',
'solo',
'sentado',
'vestido',
'largo',
'grande',
'negro',
'fijo',
'lejano',
'caluroso',
'tristísima',
'inglés',
'desconocido',
'lloroso',
'lontananza',
'perpétuo',
'exhalóse',
'bullicioso',
'alegre',
'despabilado',
'doloroso',
'oculto',
'ruidoso',
'insignificante',
'solitario',
'incierto',
'jóven',
'enlutado',
'nocturno',
'jóven',
'indiscreta',
'sagrado',
'solitario',
'cubierto',
'largo',
'sentado',
'primero',
'propio',
'interesante',
'jóven',
'anciano',
'implacable',
'temible',
'nublado',
'surto',
'natal',
'extraño',
'mejor',
'forastero',
'forastero',
'gran',
'buena',
'gran',
'mejor',
'gran',
'_',
'triste',
'grandioso',
'grande',
'glorioso',
'nivelada',
'lleno',
'surcada',
'férreo',
'ancho',
'rico',
'renovado',
'transformado',
'adornado',
'fabuloso',
'suntuoso',
'visitado',
'régio',
'tutelar',
'aglomerado',
'vasto',
'poderoso',
'fuerte',
'nacional',
'extranjero',
'pobre',
'desconocido',
'nacional',
'suntuoso',
'hecho',
'lúgubre',
'triste',
'solo',
'colocado',
'amargo',
'ceniza',
'opuesto',
'aislado',
'solitario',
'severo',
'_',
'_',
'siguiente',
'caro',
'indicado',
'instalado',
'acreditado',
'distinguido',
'literato',
'jóven',
'amable',
'alentadoro',
'importante',
'editorial',
'frecuente',
'material',
'intimado',
'nuevo',
'domicilio',
'pensionado',
'francés',
'cercano',
'francés',
'amable',
'viejo',
'agrado',
'gran',
'imposible',
'pensionado',
'femenino',
'general',
'excluido',
'verdadero',
'antiguo',
'célebre',
'querido',
'contínuo',
'invisible',
'terrible',
'contentaré',
'invisible',
'fuerte',
'expuesto',
'espontáneo',
'francés',
'--reunido',
'atenuant',
'jóven',
'adverso',
'viejo',
'rigoroso',
'de--forzós',
'_',
'primero',
'_',
'único',
'pequeño',
'aseado',
'azul',
'blanco',
'empapelado',
'clavado',
'alto',
'oculto',
'azul',
'vecino',
'blanco',
'cómodo',
'central',
'modesto',
'pequeño',
'deficiente',
'buen',
'parisiense',
'_',
'encantado',
'nuevo',
'encendido',
'abierto',
'mullido',
'sahumado',
'alhucema',
'preparado',
'damasco',
'azul',
'cómodo',
'blanco',
'benéfico',
'ramilletito',
'pobre',
'proscrito',
'distraido',
'larga',
'reunido',
'casual',
'humano',
'esperado',
'fortuito',
'solemne',
'trivial',
'entero',
'silencioso',
'ligero',
'suavísimo',
'ténue',
'seguido',
'primero',
'inmóvil',
'misterioso',
'léjo',
'primaveral',
'fantástico',
'aéreo',
'misterioso',
'cuarto',
'vecino',
'silencioso',
'encantado',
'bello',
'cierto',
'encargado',
'necesario',
'encerrado',
'exterior',
'establecido',
'_',
'_',
'bello',
'buen',
'encerrado',
'rigoroso',
'vecino',
'tonto',
'dábame',
'ideal',
'malo',
'gran',
'_',
'entero',
'espiritual',
'colaborador',
'suscrito',
'principal',
'oculto',
'camarero',
'ocupado',
'pesado',
'quejumbroso',
'dulcísimo',
'pesado',
'--¡por',
'brutal',
'delicado',
'insoportable',
'necesario',
'preciso',
'loco',
'dulce',
'jóven',
'florido',
'lijera',
'sencillo',
'mismo',
'lindo!--añado',
'último',
'odiós',
'único',
'mismo',
'buen',
'malo',
'quédate',
'--imposible',
'vestido',
'largo',
'corbatita',
'teatral',
'interior',
'joven',
'entero',
'excelente',
'picante',
'pintoresco',
'gracioso',
'_',
'_',
'sencillo',
'caprichoso',
'griego',
'romano',
'--esquisito',
'condensado',
'mágico',
'maravilloso',
'emporio',
'rico',
'suculento',
'bello',
'grande',
'acreditado',
'destinado',
'decorado',
'reservado',
'amable',
'insoportable',
'pestilente',
'frecuentado',
'cuarto',
'profundo',
'inclinado',
'azul',
'servido',
'dorado',
'apetitoso',
'frio',
'exquisito',
'resentido',
'ofendido',
'solo',
'primaveral',
'agrupada',
'perfume--gústano',
'buena',
'avergonzado',
'nuevo',
'agachado',
'fisgón',
'francés',
'dorado',
'lábio',
'pegado',
'entendido',
'pegado',
'muerto',
'astuto',
'quietecito',
'absorto',
'gran',
'deseado',
'buen',
'inocente',
'dulcísimo',
'cierto',
'ocupado',
'extático',
'cierto',
'excelente',
'verdadero',
'francés',
'honrado',
'natural',
'solo',
'encerrado',
'fresco',
'femenino',
'penoso',
'confuso',
'avergonzado',
'íntimo',
'misterioso',
'sirviento',
'ideal',
'dulcísimo',
'ruidoso',
'inmediato',
'inteligente',
'único',
'francés',
'picado',
'precioso',
'limeño',
'partidario',
'firmado',
'literario',
'vino»--y',
'primero',
'equivocado',
'pleno',
'evangélico',
'teólogo',
'remoto',
'presente',
'humano',
'último',
'repugnante',
'odioso',
'alto',
'doble',
'largo',
'femenil',
'mismo',
'angosta',
'mayor',
'mismo',
'autoritario',
'eterno',
'desventurado',
'triste',
'solo',
'alegre',
'contento',
'--de',
'buen',
'mejor',
'poderoso',
'querido',
'memoria!--oyóse',
'piadoso',
'explícito',
'implícito',
'integrante',
'destinado',
'humano',
'deliciós',
'mismo',
'radioso',
'disipado',
'apasionado',
'encarnado',
'misterioso',
'elevado',
'concluido',
'enrollado',
'avergonzado',
'urgente',
'central',
'cerrado',
'misterioso',
'insoluble',
'claro',
'sencillo',
'seguido',
'biográfica',
'cronológico',
'alegrísimo',
'rico',
'estanciero',
'innumerable',
'referente',
'desordenado',
'inagotable',
'antiguo',
'fundado',
'servido',
'recto',
'limpio',
'_',
'siguiente',
'delatado',
'profesoro',
'tranquilo',
'profundo',
'abierto',
'dulcísimo',
'todas--pues',
'grande',
'rosado',
'pálido',
'rubio',
'último',
'ofrenda',
'jóven',
'morén',
'esbelto',
'oval',
'elevado',
'abundoso',
'vestido',
'elegante',
'severo',
'cruzado',
'grande',
'negro',
'ténue',
'juvenil',
'reflexivo',
'indefinible',
'negro',
'absorto',
'alzáronse',
'tímido',
'desnudo',
'angustioso',
'guiado',
'ahogado',
'cerrado',
'encarado',
'tercero',
'primero',
'libre',
'guiado',
'herido',
'empecinado',
'largo',
'entre',
'acostado',
'cubierto',
'sordo',
'persistente',
'espeso',
'sentado',
'gran',
'negro',
'único',
'sentado',
'blanco',
'fino',
'satinado',
'rosado',
'transparente',
'bello',
'presente',
'primero',
'agudo',
'dulce',
'amoroso',
'desconocido',
'aterrado',
'largo',
'inmóvil',
'dulce',
'desvarío',
'vecino',
'diagnóstico',
'anciana--un',
'automático',
'inmóvil',
'herido',
'natural',
'necesario',
'completo',
'hábil',
'buen',
'radioso',
'adorable',
'feliz!--concluyó--¡rodeado',
'bello',
'desalmado',
'nacional',
'central',
'femenil',
'claro',
'oscuro',
'blanco',
'pálido',
'extraida',
'seda',
'abierto',
'inútil--díjole',
'cortesito',
'convertido',
'grande',
'sábán',
'natal',
'aguardábale',
'gran',
'necesario',
'mismo',
'amante',
'adio',
'fúnebre',
'junto',
'amado',
'desaparecido',
'misio',
'éco',
'delicioso',
'deliciós',
'malsano',
'mejor',
'magnífico',
'delicado',
'afabl',
'cortés',
'xxiii',
'empleado',
'preciso',
'distinguido',
'femenino',
'galante',
'mias,--dijo',
'solo',
'rodeado',
'amable',
'verdadero',
'silencio--repuso',
'laurencia.--pero',
'fuerte',
'espiritual',
'editorial',
'folletinista--le',
'romanz',
'furtivo',
'esbelto',
'dulcísimo',
'final',
'misterioso',
'alto',
'juvenil',
'fortificante',
'convalecencias--añadió',
'cómico',
'autoridad;--diz',
'delicioso',
'solo',
'primero',
'buen',
'jóven',
'mismo',
'cicatrizado',
'increible',
'buen',
'convaleciente',
'ido--por',
'excelente',
'decaido',
...]
Then we count the unique adjectives in this list with the Counter()
module:
adjs_tally = Counter(adjs)
adjs_tally.most_common()
[('_', 18),
('solo', 16),
('buen', 16),
('primero', 15),
('jóven', 13),
('último', 11),
('largo', 11),
('bello', 11),
('gran', 11),
('fuerte', 10),
('pobre', 10),
('único', 9),
('mismo', 9),
('blanco', 8),
('misterioso', 8),
('nuevo', 7),
('dulce', 7),
('profundo', 7),
('nacional', 7),
('desconocido', 7),
('francés', 7),
('humano', 6),
('querido', 6),
('mejor', 6),
('necesario', 6),
('alto', 6),
('viejo', 6),
('antiguo', 6),
('grande', 6),
('negro', 6),
('natural', 5),
('azul', 5),
('verdadero', 5),
('amable', 5),
('dulcísimo', 5),
('amado', 5),
('intelectual', 4),
('presente', 4),
('noble', 4),
('pálido', 4),
('adverso', 4),
('triste', 4),
('vestido', 4),
('central', 4),
('inmenso', 4),
('rico', 4),
('silencioso', 4),
('benéfico', 4),
('sentado', 4),
('vecino', 4),
('sencillo', 4),
('cerrado', 4),
('social', 3),
('grave', 3),
('precioso', 3),
('elevado', 3),
('contento', 3),
('pegado', 3),
('editorial', 3),
('inglés', 3),
('feliz', 3),
('imponente', 3),
('divino', 3),
('solemne', 3),
('lindo', 3),
('lejano', 3),
('poderoso', 3),
('eterno', 3),
('ideal', 3),
('particular', 3),
('severo', 3),
('tutelar', 3),
('helado', 3),
('pequeño', 3),
('oculto', 3),
('solitario', 3),
('lleno', 3),
('distinguido', 3),
('femenino', 3),
('abierto', 3),
('entero', 3),
('seguido', 3),
('inmóvil', 3),
('primaveral', 3),
('cierto', 3),
('encerrado', 3),
('excelente', 3),
('avergonzado', 3),
('penoso', 3),
('rosado', 3),
('elegante', 3),
('junto', 3),
('político', 2),
('entendido', 2),
('concluido', 2),
('americano', 2),
('económico', 2),
('cariñoso', 2),
('implacable', 2),
('terrible', 2),
('sano', 2),
('insoluble', 2),
('bueno', 2),
('plácido', 2),
('melancólico', 2),
('extraño', 2),
('siniestro', 2),
('fatídico', 2),
('inocente', 2),
('ocúltanse', 2),
('hostil', 2),
('tristísima', 2),
('cruel', 2),
('benévolo', 2),
('caluroso', 2),
('clásico', 2),
('tierno', 2),
('cumplido', 2),
('celebrante', 2),
('enternecido', 2),
('sagrado', 2),
('rendido', 2),
('dicho', 2),
('angustioso', 2),
('persuadido', 2),
('favorable', 2),
('independiente', 2),
('honrado', 2),
('doloroso', 2),
('doble', 2),
('pleno', 2),
('desamparado', 2),
('bullicioso', 2),
('libre', 2),
('activo', 2),
('principal', 2),
('firmado', 2),
('ardiente', 2),
('íntimo', 2),
('idéntico', 2),
('resignado', 2),
('impuesto', 2),
('desventurado', 2),
('muerto', 2),
('acompañado', 2),
('adio', 2),
('larga', 2),
('frio', 2),
('perpétuo', 2),
('anciano', 2),
('digno', 2),
('mayor', 2),
('alegre', 2),
('ruidoso', 2),
('cubierto', 2),
('propio', 2),
('natal', 2),
('forastero', 2),
('buena', 2),
('adornado', 2),
('suntuoso', 2),
('amargo', 2),
('siguiente', 2),
('acreditado', 2),
('pensionado', 2),
('invisible', 2),
('rigoroso', 2),
('cómodo', 2),
('modesto', 2),
('encantado', 2),
('proscrito', 2),
('suavísimo', 2),
('ténue', 2),
('cuarto', 2),
('malo', 2),
('espiritual', 2),
('ocupado', 2),
('pesado', 2),
('delicado', 2),
('insoportable', 2),
('preciso', 2),
('griego', 2),
('mágico', 2),
('destinado', 2),
('servido', 2),
('dorado', 2),
('absorto', 2),
('femenil', 2),
('deliciós', 2),
('radioso', 2),
('claro', 2),
('tranquilo', 2),
('morén', 2),
('esbelto', 2),
('juvenil', 2),
('guiado', 2),
('herido', 2),
('fino', 2),
('satinado', 2),
('hábil', 2),
('delicioso', 2),
('trasparent', 2),
('nupcial', 2),
('encantador', 2),
('curioso', 2),
('simpático', 2),
('formado', 2),
('sombrío', 1),
('imbuído', 1),
('terrenal', 1),
('desconsolado', 1),
('ingrato', 1),
('plausibl', 1),
('eficaz', 1),
('innúmera', 1),
('multiplicado', 1),
('venerable', 1),
('moralizadoro', 1),
('colectivo', 1),
('especulativo', 1),
('individual', 1),
('abstracto', 1),
('ilustre', 1),
('creador', 1),
('lujuriós', 1),
('invoco', 1),
('atrayente', 1),
('ingénuo', 1),
('intrigo', 1),
('arenoso', 1),
('privilegiado', 1),
('prestigioso', 1),
('suficiente', 1),
('soñadora', 1),
('adusta', 1),
('economista', 1),
('marcado', 1),
('chamusquinas', 1),
('extremo', 1),
('armado', 1),
('mojado', 1),
('aguardado', 1),
('auroro', 1),
('dramático', 1),
('forzado', 1),
('risa.--solo', 1),
('diario', 1),
('encorvado', 1),
('propuesto', 1),
('pésimo', 1),
('uncido', 1),
('rudo', 1),
('folletinista', 1),
('corrector', 1),
('avaro', 1),
('derrochador', 1),
('franco', 1),
('engolfado', 1),
('presuroso', 1),
('habitual', 1),
('contado', 1),
('apuesto', 1),
('mecido', 1),
('desierto', 1),
('subyugado', 1),
('temeroso', 1),
('acoquinado', 1),
('espiado', 1),
('suspicaz', 1),
('inexorable', 1),
('gozós', 1),
('desconfiado', 1),
('enemigo', 1),
('propicio', 1),
('retrospectivo', 1),
('arrebatado', 1),
('materno', 1),
('característico', 1),
('irresistible', 1),
('consignado', 1),
('expansivo', 1),
('oprimido', 1),
('superior', 1),
('infantil', 1),
('viril', 1),
('virtuoso', 1),
('derrama', 1),
('gozosa', 1),
('mr', 1),
('recuerdo', 1),
('debido', 1),
('prez', 1),
('angelical', 1),
('santo', 1),
('notable', 1),
('inquieto', 1),
('cosmopolita', 1),
('exaltado', 1),
('tricolor', 1),
('aparecíale', 1),
('magestuoso', 1),
('cerúlea', 1),
('luminoso', 1),
('humillante', 1),
('consultado', 1),
('corregido', 1),
('dictado', 1),
('déspoto', 1),
('acabado', 1),
('vergonzoso', 1),
('inesperado', 1),
('honorable', 1),
('--«alejado', 1),
('otro--decíale', 1),
('sagrado.--y', 1),
('urbano', 1),
('rural', 1),
('esposo', 1),
('pidióle', 1),
('motivado', 1),
('conyugal', 1),
('aliviado', 1),
('floreciente', 1),
('subido', 1),
('réstame', 1),
('ignorado', 1),
('alejado', 1),
('funesta', 1),
('desechado', 1),
('previsoro', 1),
('moribundo', 1),
('forzoso', 1),
('pródigo', 1),
('brillante', 1),
('evocado', 1),
('latente', 1),
('cansado', 1),
('empobrecido', 1),
('vano', 1),
('portador', 1),
('carta.--por', 1),
('envuelto', 1),
('producido', 1),
('sócio', 1),
('bribon', 1),
('fulminante', 1),
('munido', 1),
('numerario', 1),
('existente', 1),
('enorme', 1),
('pasivo', 1),
('infame', 1),
('súbita', 1),
('especial', 1),
('cobrado', 1),
('adjunto', 1),
('rara', 1),
('puro', 1),
('desterrado', 1),
('tambien', 1),
('riente', 1),
('hospitalario', 1),
('sábio', 1),
('maternal', 1),
('gris', 1),
('piadosa', 1),
('tratado', 1),
('cuidado', 1),
('reconcentrado', 1),
('entumecido', 1),
('argentino', 1),
('halagado', 1),
('porteño', 1),
('conocido', 1),
('neutral', 1),
('musical', 1),
('europeo', 1),
('llegado', 1),
('hundido', 1),
('útil', 1),
('agradable', 1),
('mala', 1),
('servicial', 1),
('venido', 1),
('fijo', 1),
('lloroso', 1),
('lontananza', 1),
('exhalóse', 1),
('despabilado', 1),
('insignificante', 1),
('incierto', 1),
('enlutado', 1),
('nocturno', 1),
('indiscreta', 1),
('interesante', 1),
('temible', 1),
('nublado', 1),
('surto', 1),
('grandioso', 1),
('glorioso', 1),
('nivelada', 1),
('surcada', 1),
('férreo', 1),
('ancho', 1),
('renovado', 1),
('transformado', 1),
('fabuloso', 1),
('visitado', 1),
('régio', 1),
('aglomerado', 1),
('vasto', 1),
('extranjero', 1),
('hecho', 1),
('lúgubre', 1),
('colocado', 1),
('ceniza', 1),
('opuesto', 1),
('aislado', 1),
('caro', 1),
('indicado', 1),
('instalado', 1),
('literato', 1),
('alentadoro', 1),
('importante', 1),
('frecuente', 1),
('material', 1),
('intimado', 1),
('domicilio', 1),
('cercano', 1),
('agrado', 1),
('imposible', 1),
('general', 1),
('excluido', 1),
('célebre', 1),
('contínuo', 1),
('contentaré', 1),
('expuesto', 1),
('espontáneo', 1),
('--reunido', 1),
('atenuant', 1),
('de--forzós', 1),
('aseado', 1),
('empapelado', 1),
('clavado', 1),
('deficiente', 1),
('parisiense', 1),
('encendido', 1),
('mullido', 1),
('sahumado', 1),
('alhucema', 1),
('preparado', 1),
('damasco', 1),
('ramilletito', 1),
('distraido', 1),
('reunido', 1),
('casual', 1),
('esperado', 1),
('fortuito', 1),
('trivial', 1),
('ligero', 1),
('léjo', 1),
('fantástico', 1),
('aéreo', 1),
('encargado', 1),
('exterior', 1),
('establecido', 1),
('tonto', 1),
('dábame', 1),
('colaborador', 1),
('suscrito', 1),
('camarero', 1),
('quejumbroso', 1),
('--¡por', 1),
('brutal', 1),
('loco', 1),
('florido', 1),
('lijera', 1),
('lindo!--añado', 1),
('odiós', 1),
('quédate', 1),
('--imposible', 1),
('corbatita', 1),
('teatral', 1),
('interior', 1),
('joven', 1),
('picante', 1),
('pintoresco', 1),
('gracioso', 1),
('caprichoso', 1),
('romano', 1),
('--esquisito', 1),
('condensado', 1),
('maravilloso', 1),
('emporio', 1),
('suculento', 1),
('decorado', 1),
('reservado', 1),
('pestilente', 1),
('frecuentado', 1),
('inclinado', 1),
('apetitoso', 1),
('exquisito', 1),
('resentido', 1),
('ofendido', 1),
('agrupada', 1),
('perfume--gústano', 1),
('agachado', 1),
('fisgón', 1),
('lábio', 1),
('astuto', 1),
('quietecito', 1),
('deseado', 1),
('extático', 1),
('fresco', 1),
('confuso', 1),
('sirviento', 1),
('inmediato', 1),
('inteligente', 1),
('picado', 1),
('limeño', 1),
('partidario', 1),
('literario', 1),
('vino»--y', 1),
('equivocado', 1),
('evangélico', 1),
('teólogo', 1),
('remoto', 1),
('repugnante', 1),
('odioso', 1),
('angosta', 1),
('autoritario', 1),
('--de', 1),
('memoria!--oyóse', 1),
('piadoso', 1),
('explícito', 1),
('implícito', 1),
('integrante', 1),
('disipado', 1),
('apasionado', 1),
('encarnado', 1),
('enrollado', 1),
('urgente', 1),
('biográfica', 1),
('cronológico', 1),
('alegrísimo', 1),
('estanciero', 1),
('innumerable', 1),
('referente', 1),
('desordenado', 1),
('inagotable', 1),
('fundado', 1),
('recto', 1),
('limpio', 1),
('delatado', 1),
('profesoro', 1),
('todas--pues', 1),
('rubio', 1),
('ofrenda', 1),
('oval', 1),
('abundoso', 1),
('cruzado', 1),
('reflexivo', 1),
('indefinible', 1),
('alzáronse', 1),
('tímido', 1),
('desnudo', 1),
('ahogado', 1),
('encarado', 1),
('tercero', 1),
('empecinado', 1),
('entre', 1),
('acostado', 1),
('sordo', 1),
('persistente', 1),
('espeso', 1),
('transparente', 1),
('agudo', 1),
('amoroso', 1),
('aterrado', 1),
('desvarío', 1),
('diagnóstico', 1),
('anciana--un', 1),
('automático', 1),
('completo', 1),
('adorable', 1),
('feliz!--concluyó--¡rodeado', 1),
('desalmado', 1),
('oscuro', 1),
('extraida', 1),
('seda', 1),
('inútil--díjole', 1),
('cortesito', 1),
('convertido', 1),
('sábán', 1),
('aguardábale', 1),
('amante', 1),
('fúnebre', 1),
('desaparecido', 1),
('misio', 1),
('éco', 1),
('malsano', 1),
('magnífico', 1),
('afabl', 1),
('cortés', 1),
('xxiii', 1),
('empleado', 1),
('galante', 1),
('mias,--dijo', 1),
('rodeado', 1),
('silencio--repuso', 1),
('laurencia.--pero', 1),
('folletinista--le', 1),
('romanz', 1),
('furtivo', 1),
('final', 1),
('fortificante', 1),
('convalecencias--añadió', 1),
('cómico', 1),
('autoridad;--diz', 1),
('cicatrizado', 1),
('increible', 1),
('convaleciente', 1),
('ido--por', 1),
('decaido', 1),
('mejillas--yo', 1),
('comprendido', 1),
('aceptado', 1),
('bajo', 1),
('--¡paro', 1),
('radiosa', 1),
('sobrenatural', 1),
('terrestre', 1),
('visible', 1),
('sobrefalda', 1),
('hermoso', 1),
('mias--dijo', 1),
('conmovido--¡cuánto', 1),
('pícaro', 1),
('--condenado', 1),
('negado', 1),
('--honorable', 1),
('sentenciado', 1),
('manecita', 1),
('discreto', 1),
('túnica', 1),
('perdido', 1),
('caballeresca', 1),
('posible', 1),
('figurin', 1),
('cegado', 1),
('julia,--pero', 1),
('ausente', 1),
('listo', 1),
('tendido', 1),
('inundado', 1),
('semejante', 1),
('novio', 1),
('inminente', 1),
('rápido', 1),
('inquietándolo', 1),
('holgado', 1),
('idolatrado', 1),
('seguro', 1),
('lento', 1),
('audaz', 1),
('tenebrosa', 1),
('surjir', 1),
('áspero', 1),
('ella--pero', 1),
('restante', 1),
('empleado--con', 1),
('caracterizado', 1),
('atraido', 1),
('ocurrido', 1),
('accionista', 1),
('presentado', 1),
('demandado', 1),
('perteneciente', 1),
('grato', 1),
('depositado', 1),
('encontráronse', 1),
('endosado', 1),
('segundo', 1),
('lucrecia,--decía', 1),
('habrás', 1),
('valioso', 1),
('filial', 1),
('entusiasta', 1),
('sério', 1),
('guant', 1),
('abanico', 1),
('liso', 1),
('--poca', 1),
('doctor', 1),
('elocuentísimo', 1),
('contrayent', 1),
('sacramental', 1),
('pronunciado', 1),
('conmovedor', 1),
('animoso', 1),
('débil', 1),
('creado', 1),
('futuro', 1),
('altísimo', 1),
('alineado', 1),
('entrelazado', 1),
('corazon!--le', 1),
('sorprendido', 1)]
Then we make a dataframe from this list:
df = pd.DataFrame(adjs_tally.most_common(), columns=['adj', 'count'])
df[:100]
adj | count | |
---|---|---|
0 | _ | 18 |
1 | solo | 16 |
2 | buen | 16 |
3 | primero | 15 |
4 | jóven | 13 |
5 | último | 11 |
6 | largo | 11 |
7 | bello | 11 |
8 | gran | 11 |
9 | fuerte | 10 |
10 | pobre | 10 |
11 | único | 9 |
12 | mismo | 9 |
13 | blanco | 8 |
14 | misterioso | 8 |
15 | nuevo | 7 |
16 | dulce | 7 |
17 | profundo | 7 |
18 | nacional | 7 |
19 | desconocido | 7 |
20 | francés | 7 |
21 | humano | 6 |
22 | querido | 6 |
23 | mejor | 6 |
24 | necesario | 6 |
25 | alto | 6 |
26 | viejo | 6 |
27 | antiguo | 6 |
28 | grande | 6 |
29 | negro | 6 |
30 | natural | 5 |
31 | azul | 5 |
32 | verdadero | 5 |
33 | amable | 5 |
34 | dulcísimo | 5 |
35 | amado | 5 |
36 | intelectual | 4 |
37 | presente | 4 |
38 | noble | 4 |
39 | pálido | 4 |
40 | adverso | 4 |
41 | triste | 4 |
42 | vestido | 4 |
43 | central | 4 |
44 | inmenso | 4 |
45 | rico | 4 |
46 | silencioso | 4 |
47 | benéfico | 4 |
48 | sentado | 4 |
49 | vecino | 4 |
50 | sencillo | 4 |
51 | cerrado | 4 |
52 | social | 3 |
53 | grave | 3 |
54 | precioso | 3 |
55 | elevado | 3 |
56 | contento | 3 |
57 | pegado | 3 |
58 | editorial | 3 |
59 | inglés | 3 |
60 | feliz | 3 |
61 | imponente | 3 |
62 | divino | 3 |
63 | solemne | 3 |
64 | lindo | 3 |
65 | lejano | 3 |
66 | poderoso | 3 |
67 | eterno | 3 |
68 | ideal | 3 |
69 | particular | 3 |
70 | severo | 3 |
71 | tutelar | 3 |
72 | helado | 3 |
73 | pequeño | 3 |
74 | oculto | 3 |
75 | solitario | 3 |
76 | lleno | 3 |
77 | distinguido | 3 |
78 | femenino | 3 |
79 | abierto | 3 |
80 | entero | 3 |
81 | seguido | 3 |
82 | inmóvil | 3 |
83 | primaveral | 3 |
84 | cierto | 3 |
85 | encerrado | 3 |
86 | excelente | 3 |
87 | avergonzado | 3 |
88 | penoso | 3 |
89 | rosado | 3 |
90 | elegante | 3 |
91 | junto | 3 |
92 | político | 2 |
93 | entendido | 2 |
94 | concluido | 2 |
95 | americano | 2 |
96 | económico | 2 |
97 | cariñoso | 2 |
98 | implacable | 2 |
99 | terrible | 2 |
Get Nouns#
POS |
Description |
Examples |
---|---|---|
NOUN |
noun |
girl, cat, tree, air, beauty |
To extract and count nouns, we can follow the same model as above, except we will change our if
statement to check for POS labels that match “NOUN”.
nouns = []
for token in document:
if token.pos_ == 'NOUN':
nouns.append(token.lemma_)
nouns_tally = Counter(nouns)
df = pd.DataFrame(nouns_tally.most_common(), columns=['noun', 'count'])
df[:100]
noun | count | |
---|---|---|
0 | mano | 48 |
1 | señor | 32 |
2 | hora | 28 |
3 | casa | 27 |
4 | trabajo | 25 |
5 | señora | 25 |
6 | vida | 24 |
7 | padre | 23 |
8 | hombre | 22 |
9 | voz | 22 |
10 | alma | 20 |
11 | ojo | 20 |
12 | vez | 19 |
13 | mujer | 17 |
14 | año | 16 |
15 | hijo | 16 |
16 | tiempo | 15 |
17 | mirada | 15 |
18 | dia | 15 |
19 | corazon | 14 |
20 | puerta | 14 |
21 | cuarto | 13 |
22 | palabra | 12 |
23 | niño | 12 |
24 | doctor | 12 |
25 | nombre | 11 |
26 | lágrima | 11 |
27 | muerte | 11 |
28 | tanto | 11 |
29 | carta | 11 |
30 | dolor | 11 |
31 | señorita | 11 |
32 | luz | 10 |
33 | brazo | 10 |
34 | destino | 10 |
35 | embargo | 10 |
36 | patria | 10 |
37 | noche | 10 |
38 | sentimiento | 10 |
39 | fortuna | 10 |
40 | joven | 10 |
41 | tambien | 10 |
42 | mesa | 9 |
43 | verdad | 9 |
44 | paso | 9 |
45 | órden | 9 |
46 | diario | 9 |
47 | idea | 8 |
48 | vino | 8 |
49 | poder | 8 |
50 | felicidad | 8 |
51 | familia | 8 |
52 | madre | 8 |
53 | cama | 8 |
54 | calle | 8 |
55 | bien | 7 |
56 | rayo | 7 |
57 | jóven | 7 |
58 | semblante | 7 |
59 | hácia | 7 |
60 | mente | 7 |
61 | gusto | 7 |
62 | silencio | 7 |
63 | momento | 7 |
64 | amigo | 7 |
65 | camarera | 7 |
66 | médico | 7 |
67 | gracia | 6 |
68 | sepulcro | 6 |
69 | esposa | 6 |
70 | recuerdo | 6 |
71 | aire | 6 |
72 | lugar | 6 |
73 | pecho | 6 |
74 | compañero | 6 |
75 | amor | 6 |
76 | persona | 6 |
77 | valor | 6 |
78 | gratitud | 6 |
79 | parte | 6 |
80 | torno | 6 |
81 | pié | 6 |
82 | --¡oh | 6 |
83 | velo | 6 |
84 | huésped | 6 |
85 | dedo | 6 |
86 | paquete | 6 |
87 | enfermo | 6 |
88 | pan | 5 |
89 | espíritu | 5 |
90 | libro | 5 |
91 | página | 5 |
92 | pensamiento | 5 |
93 | cuello | 5 |
94 | rostro | 5 |
95 | sueño | 5 |
96 | hogar | 5 |
97 | colegio | 5 |
98 | país | 5 |
99 | clase | 5 |
Get Verbs#
POS |
Description |
Examples |
---|---|---|
VERB |
verb |
run, runs, running, eat, ate, eating |
To extract and count works of art, we can follow a similar-ish model to the examples above. This time, however, we’re going to make our code even more economical and efficient (while still changing our if
statement to match the POS label “VERB”).
Python Review
We can use a list comprehension to get our list of verbs in a single line of code! Closely examine the first line of code below:
verbs = [token.lemma_ for token in document if token.pos_ == 'VERB']
verbs_tally = Counter(verbs)
df = pd.DataFrame(verbs_tally.most_common(), columns=['verb', 'count'])
df[:100]
verb | count | |
---|---|---|
0 | hacer | 55 |
1 | decir | 37 |
2 | tener | 33 |
3 | dar | 27 |
4 | ver | 22 |
5 | venir | 21 |
6 | saber | 21 |
7 | creer | 20 |
8 | querer | 20 |
9 | hablar | 20 |
10 | llegar | 18 |
11 | dejar | 17 |
12 | tomar | 15 |
13 | volver | 15 |
14 | escuchar | 15 |
15 | encontrar | 14 |
16 | quedar | 13 |
17 | sentir | 13 |
18 | llevar | 12 |
19 | escribir | 12 |
20 | ir | 12 |
21 | parecer | 11 |
22 | salir | 11 |
23 | estar | 11 |
24 | leer | 11 |
25 | conocer | 10 |
26 | pensar | 10 |
27 | despertar | 10 |
28 | guardar | 10 |
29 | poner | 9 |
30 | buscar | 9 |
31 | seguir | 9 |
32 | recibir | 9 |
33 | pasar | 8 |
34 | aguardar | 8 |
35 | llorar | 8 |
36 | caer | 8 |
37 | llamar | 8 |
38 | abrir | 8 |
39 | entrar | 8 |
40 | comenzar | 7 |
41 | entregar | 7 |
42 | vivir | 7 |
43 | llenar | 7 |
44 | pedir | 7 |
45 | oir | 6 |
46 | recordar | 6 |
47 | amar | 6 |
48 | volver él | 6 |
49 | estrechar | 6 |
50 | reir | 6 |
51 | acabar | 5 |
52 | cubrir | 5 |
53 | existir | 5 |
54 | ver él | 5 |
55 | cerrar | 5 |
56 | contemplar | 5 |
57 | comprender | 5 |
58 | unir | 5 |
59 | presentar | 5 |
60 | echar | 5 |
61 | deber | 4 |
62 | ocupar | 4 |
63 | formar | 4 |
64 | encerrar | 4 |
65 | arrojar | 4 |
66 | morir | 4 |
67 | apoyar | 4 |
68 | enviar | 4 |
69 | alejar | 4 |
70 | tender | 4 |
71 | visitar | 4 |
72 | anhelar | 4 |
73 | declarar | 4 |
74 | alzar | 4 |
75 | continuar | 4 |
76 | lograr | 4 |
77 | fijar | 4 |
78 | encontróse | 4 |
79 | decir él | 4 |
80 | almorzar | 4 |
81 | interrumpir | 4 |
82 | realizar | 3 |
83 | recorrer | 3 |
84 | esperar | 3 |
85 | rodear | 3 |
86 | consultar | 3 |
87 | reír | 3 |
88 | extender | 3 |
89 | obedecer | 3 |
90 | deír | 3 |
91 | tornar | 3 |
92 | colocar | 3 |
93 | mirar | 3 |
94 | efectuar | 3 |
95 | yacer | 3 |
96 | contener | 3 |
97 | desear | 3 |
98 | preferir | 3 |
99 | prescribir | 3 |
Keyword Extraction#
Get Sentences with Keyword#
spaCy can also identify sentences in a document. To access sentences, we can iterate through document.sents
and pull out the .text
of each sentence.
We can use spaCy’s sentence-parsing capabilities to extract sentences that contain particular keywords, such as in the function below. Note that the function assumes that the keyword provided will be exactly the same as it appears in the text (e.g. matching all inflection for case, number, gender, etc. As a Spanish example, if you use bueno
as the keyboard, it won’t match buena
or buenos
.)
With the function find_sentences_with_keyword()
, we will iterate through document.sents
and pull out any sentence that contains a particular “keyword.” Then we will display these sentence with the keywords bolded.
import re
from IPython.display import Markdown, display
def find_sentences_with_keyword(keyword, document):
#Iterate through all the sentences in the document and pull out the text of each sentence
for sentence in document.sents:
sentence = sentence.text
#Check to see if the keyword is in the sentence (and ignore capitalization by making both lowercase)
if keyword.lower() in sentence.lower():
#Use the regex library to replace linebreaks and to make the keyword bolded, again ignoring capitalization
sentence = re.sub('\n', ' ', sentence)
sentence = re.sub(f"{keyword}", f"**{keyword}**", sentence, flags=re.IGNORECASE)
display(Markdown(sentence))
find_sentences_with_keyword(keyword="bueno", document=document)
Á «LA **bueno**S AIRES» _LA AUTORA.
Enigma insoluble es para mí este jóven, tan franco, sin embargo, y tan bueno… Y Emilio dejando la pluma en largo holgorio, quedóse engolfado en sus pensamientos y en el humo de su cigarro.
¡Qué ceremonia, á la vez tan imponente y tierna! Cumplido en él, el divino misterio, de rodillas ante el altar, el niño tiende la mano sobre el Sagrado Libro y jura ser virtuoso y bueno.
Suscribíala el escribano D…, uno de los hombres más honorables de buenos Aires.
En el momento que Mauricio preparaba la realizacion de tan lisongero propósito, una carta de buenos Aires, portadora de fatales nuevas, vino á destruir sus proyectos y sus esperanzas.
Además, en buenos Aires que se agita á impulsos de un inmenso progreso, podrá Vd. con el trabajo rehacer su fortuna».
Por los diarios de buenos Aires y su propia correspondencia, éranle conocidas sus desgracias y su noble abnegacion.
¡Ah! hé ahí, por ejemplo, un modelo de valor y de resignacion: esta jóven hija de buenos Aires, vino hace tres años para perfeccionarse en sus estudios musicales.
Su padre, ingeniero en comision, regresó á buenos Aires dejándola en casa de una parienta lejana.
Rendidos al padre los últimos deberes, vuelve á buenos Aires, donde vá á buscar en el trabajo la subsistencia……
De la buenos Aires de sus recuerdos, solo reconocía el nombre: tan grande y bella, la gloriosa metrópoli habíase tornado.
millares de edificios aglomerados en aquel vasto conjunto, brillaba la placa de la Compañía de Seguros «La buenos Aires», poderosa asociacion que cuenta en su seno á los más fuertes capitalistas nacionales y extranjeros.
Una vez instalado, buscó trabajo en uno de los diarios más acreditados de buenos Aires.
–bueno ó malo, déjelas Vd. en él.
–El señor Eduardo M. Coll, hijo mio, es Gerente de «La buenos Aires», Compañía de Seguros en la que yo mismo soy accionista ¿qué será ello?
XXX Antes de aquel término el Gerente de «La **bueno**s Aires» recibía una citacion del Banco Nacional con motivo del aviso que por su órden registraban «La Prensa» y «La Tribuna Nacional».
Acudió el Gerente, y supo que allí se hallaba, depositado por el señor Cárlos Ridel, un paquete cerrado, que en Junio de 1888 debía ser entregado á la Compañía de Seguros «La buenos Aires».
Abierto el paquete, encontráronse con la póliza de seguro sobre la vida de Cárlos Ridel, por 20,000 $ m/n. en 20 años, y en la que constaba el abono de la primera anualidad de 792 $ m/n.; una carta á su esposa, y en defecto de ésta, á su hijo Mauricio; y una letra por 792 $ m/n. á la órden de Cárlos Ridel y endosada por éste á «La buenos Aires», como la segunda cuota que debía pagar por su póliza.
«Entre estas, las Compañías de Seguros sónme especialmente simpáticas, sobretodo, «La **bueno**s Aires», por su importancia y valiosa organizacion.
En el seno de una de esas asociaciones tutelares, «La buenos Aires», la Providencia guardaba un tesoro que á su hora, hizo surgir para recompensar la abnegacion filial y dar la felicidad á los que, creyendo en ella, esperaban.
Get Keyword in Context#
We can also find out about a keyword’s more immediate context — its neighboring words to the left and right — and we can fine-tune our search with POS tagging.
To do so, we will first create a list of what’s called ngrams. “Ngrams” are any sequence of n tokens in a text. They’re an important concept in computational linguistics and NLP. (Have you ever played with Google’s Ngram Viewer?)
Below we’re going to make a list of bigrams, that is, all the two-word combinations from the sample text. We’re going to use these bigrams to find the neighboring words that appear alongside particular keywords.
#Make a list of tokens and POS labels from document if the token is a word
tokens_and_labels = [(token.text, token.pos_) for token in document if token.is_alpha]
#Make a function to get all two-word combinations
def get_bigrams(word_list, number_consecutive_words=2):
ngrams = []
adj_length_of_word_list = len(word_list) - (number_consecutive_words - 1)
#Loop through numbers from 0 to the (slightly adjusted) length of your word list
for word_index in range(adj_length_of_word_list):
#Index the list at each number, grabbing the word at that number index as well as N number of words after it
ngram = word_list[word_index : word_index + number_consecutive_words]
#Append this word combo to the master list "ngrams"
ngrams.append(ngram)
return ngrams
bigrams = get_bigrams(tokens_and_labels)
Let’s take a peek at the bigrams:
bigrams[5:20]
[[('imbuído', 'ADJ'), ('sin', 'ADP')],
[('sin', 'ADP'), ('duda', 'NOUN')],
[('duda', 'NOUN'), ('en', 'ADP')],
[('en', 'ADP'), ('las', 'DET')],
[('las', 'DET'), ('ideas', 'NOUN')],
[('ideas', 'NOUN'), ('de', 'ADP')],
[('de', 'ADP'), ('los', 'DET')],
[('los', 'DET'), ('Santos', 'PROPN')],
[('Santos', 'PROPN'), ('Padres', 'PROPN')],
[('Padres', 'PROPN'), ('de', 'ADP')],
[('de', 'ADP'), ('la', 'DET')],
[('la', 'DET'), ('Iglesia', 'PROPN')],
[('Iglesia', 'PROPN'), ('que', 'PRON')],
[('que', 'PRON'), ('predicaban', 'VERB')],
[('predicaban', 'VERB'), ('el', 'DET')]]
Now that we have our list of bigrams, we’re going to make a function get_neighbor_words()
. This function will return the most frequent words that appear next to a particular keyword. The function can also be fine-tuned to return neighbor words that match a certain part of speech by changing the pos_label
parameter.
def get_neighbor_words(keyword, bigrams, pos_label = None):
neighbor_words = []
keyword = keyword.lower()
for bigram in bigrams:
#Extract just the lowercased words (not the labels) for each bigram
words = [word.lower() for word, label in bigram]
#Check to see if keyword is in the bigram
if keyword in words:
for word, label in bigram:
#Now focus on the neighbor word, not the keyword
if word.lower() != keyword:
#If the neighbor word matches the right pos_label, append it to the master list
if label == pos_label or pos_label == None:
neighbor_words.append(word.lower())
return Counter(neighbor_words).most_common()
get_neighbor_words("bien", bigrams)
[('más', 2),
('que', 2),
('así', 1),
('fuerte', 1),
('y', 1),
('ya', 1),
('invisible', 1),
('pudiera', 1),
('distraido', 1),
('lo', 1),
('te', 1),
('cosa', 1),
('duerme', 1),
('charlábamos', 1),
('vá', 1),
('no', 1),
('si', 1),
('seguro', 1),
('mi', 1),
('amada', 1),
('tan', 1),
('esta', 1),
('palabra', 1),
('estaba', 1)]
get_neighbor_words("bien", bigrams, pos_label='VERB')
[('duerme', 1), ('charlábamos', 1), ('vá', 1)]
Your Turn!#
Try out find_sentences_with_keyword()
and get_neighbor_words
with your own keywords of interest.
find_sentences_with_keyword(keyword="YOUR KEY WORD", document=document)
get_neighbor_words(keyword="YOUR KEY WORD", bigrams, pos_label=None)