{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "![resources/images/dhlab-logo-nb.png](../resources/images/dhlab-logo-nb.png)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# NER og POS med Spacy\n", "\n", "Hent ut navn og steder fra en tekst i Nasjonalbibliotekets samling med `NER`.\n", "\n", "Finn ordklasser med `POS`." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import dhlab as dh\n", "from dhlab import Corpus\n", "from dhlab.text.parse import NER, POS, Models" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Hent ut en urn" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_1631794/3202258208.py:4: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", " my_urn = urns[1]\n" ] } ], "source": [ "# Bygg et korpus basert Agnar Mykle og hent ut urn-kolonnen som liste\n", "urns = Corpus(doctype=\"digibok\", author=\"mykle\", title=\"røde\").frame.urn\n", "# Hent ut en urn\n", "my_urn = urns[1]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Oversikt over modeller: \n", "Dhlab støtter Per januar 2023 språkene norsk, dansk og engelsk. Tilgjengelige modeller finnes ved å bruke `Models`. Man kan lese mer om de enkelte modellene på [Spacys hjemmesider](https://spacy.io/). \n", "\n", "`nb_core_news_sm` er et bra utgangspunkt for en norskspråklig bok eller avis." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['nb_core_news_lg',\n", " 'da_core_news_lg',\n", " 'nb_core_news_sm',\n", " 'en_core_web_lg',\n", " 'en_core_web_md',\n", " 'da_core_news_trf']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "l = Models()\n", "l.models" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## NER\n", "\n", "NER (Named Entity Recognition) brukes for å finne navngitte entiteter, som personer, steder, osv. i teksten." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/larsm/.cache/pypoetry/virtualenvs/digital-tekstanalyse-kDjkoATB-py3.10/lib/python3.10/site-packages/dhlab/api/dhlab_api.py:59: FutureWarning: Passing literal json to 'read_json' is deprecated and will be removed in a future version. To read from a literal string, wrap it in a 'StringIO' object.\n", " df = pd.read_json(r.json())\n" ] } ], "source": [ "result = NER(urn=my_urn, model=\"nb_core_news_sm\", start_page=0, to_page=1000000)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tokennerfrekv
887MyklePER310
2117sORG129
183BlomPER123
1141Sangen om den røde rubinMISC119
905MyklesPER114
............
988Olav DuunPER1
987Olav DalgardPER1
986Olav Arnulv NygaardPER1
985Olaf Gosta LagerkrantzPER1
2564™ eMISC1
\n", "

2565 rows × 3 columns

\n", "
" ], "text/plain": [ " token ner frekv\n", "887 Mykle PER 310\n", "2117 s ORG 129\n", "183 Blom PER 123\n", "1141 Sangen om den røde rubin MISC 119\n", "905 Mykles PER 114\n", "... ... ... ...\n", "988 Olav Duun PER 1\n", "987 Olav Dalgard PER 1\n", "986 Olav Arnulv Nygaard PER 1\n", "985 Olaf Gosta Lagerkrantz PER 1\n", "2564 ™ e MISC 1\n", "\n", "[2565 rows x 3 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result.ner" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## POS – Ordklassetagging\n", "\n", "Finn ordklasser og dependens for en tekst med `POS`" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_1631794/4208546902.py:1: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", " res = POS(urn=urns[1], model=l.models[2], to_page=10000)\n", "/home/larsm/.cache/pypoetry/virtualenvs/digital-tekstanalyse-kDjkoATB-py3.10/lib/python3.10/site-packages/dhlab/api/dhlab_api.py:73: FutureWarning: Passing literal json to 'read_json' is deprecated and will be removed in a future version. To read from a literal string, wrap it in a 'StringIO' object.\n", " df = pd.read_json(r.json())\n" ] } ], "source": [ "res = POS(urn=urns[1], model=l.models[2], to_page=10000)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tokenlemmaposdepheadhead_lemmahead_poshead_headhead_head_lemmahead_head_posfrekv
9167..PUNCTpunctharhaveAUXharhaveAUX7
7254..PUNCTpunctmenermeneVERBmenermeneVERB5
4843,,PUNCTpunctnr.nummerNOUNfellesfelleVERB4
7713..PUNCTpuncterværeAUXerværeAUX4
11701..PUNCTpunctharhaveVERBharhaveVERB4
....................................
54409diskusjonendiskusjonNOUNobjavavINTJbekymretbekymreVERB1
54410diskusjonendiskusjonNOUNoblgavgiveVERBgavgiveVERB1
54411diskusjonerdiskusjonNOUNconjdetaljbeskriveiserdetaljbeskriveiseNOUNgjennomgjennomVERB1
54412diskusjonerdiskusjonNOUNconjaviseravisNOUNangrepangrepNOUN1
162381VERBamodNOUNNOUN1
\n", "

162382 rows × 11 columns

\n", "
" ], "text/plain": [ " token lemma pos dep head \\\n", "9167 . . PUNCT punct har \n", "7254 . . PUNCT punct mener \n", "4843 , , PUNCT punct nr. \n", "7713 . . PUNCT punct er \n", "11701 . . PUNCT punct har \n", "... ... ... ... ... ... \n", "54409 diskusjonen diskusjon NOUN obj av \n", "54410 diskusjonen diskusjon NOUN obl gav \n", "54411 diskusjoner diskusjon NOUN conj detaljbeskriveiser \n", "54412 diskusjoner diskusjon NOUN conj aviser \n", "162381 ■ ■ VERB amod ■ \n", "\n", " head_lemma head_pos head_head head_head_lemma head_head_pos \\\n", "9167 have AUX har have AUX \n", "7254 mene VERB mener mene VERB \n", "4843 nummer NOUN felles felle VERB \n", "7713 være AUX er være AUX \n", "11701 have VERB har have VERB \n", "... ... ... ... ... ... \n", "54409 av INTJ bekymret bekymre VERB \n", "54410 give VERB gav give VERB \n", "54411 detaljbeskriveise NOUN gjennom gjennom VERB \n", "54412 avis NOUN angrep angrep NOUN \n", "162381 ■ NOUN ■ ■ NOUN \n", "\n", " frekv \n", "9167 7 \n", "7254 5 \n", "4843 4 \n", "7713 4 \n", "11701 4 \n", "... ... \n", "54409 1 \n", "54410 1 \n", "54411 1 \n", "54412 1 \n", "162381 1 \n", "\n", "[162382 rows x 11 columns]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res.pos" ] } ], "metadata": { "kernelspec": { "display_name": "digital_tekstanalyse-d0erqq9h", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "9d2feb1b19ad0b3ff64e928cca20630895d4b7a3e63fa8b7c2ceb66e49090d11" } } }, "nbformat": 4, "nbformat_minor": 2 }