Python

Zinnen uit tekst extraheren met behulp van de NLTK Python-module

Zinnen uit tekst extraheren met behulp van de NLTK Python-module
De Natural Language Toolkit (NLTK) is een taal- en tekstverwerkingsmodule voor Python. NLTK kan tekst die in veel verschillende talen beschikbaar is analyseren, verwerken en tokeniseren met behulp van de ingebouwde bibliotheek met corpora en een grote verzameling lexicale gegevens. Python is een van de meest populaire programmeertalen die wordt gebruikt in datawetenschap en taalverwerking, voornamelijk vanwege de veelzijdigheid van de taal en de beschikbaarheid van handige modules zoals NLTK. In dit artikel wordt uitgelegd hoe u zinnen uit tekstparagrafen kunt extraheren met NLTK. De code in deze handleiding is getest met Python 3.8.2 en NLTK 3.4.5 op Ubuntu 20.04 LTS.

NLTK installeren in Linux

Voer de onderstaande opdracht uit om NLTK in Ubuntu te installeren:

$ sudo apt install python3-nltk

NLTK-pakketten zijn beschikbaar in alle grote Linux-distributies. Zoek naar het trefwoord “NLTK” in de pakketbeheerder om de pakketten te installeren. Als om de een of andere reden NLTK niet beschikbaar is in de repositories van uw distributie, kunt u het installeren vanuit de pip-pakketbeheerder door de onderstaande opdracht uit te voeren:

$ pip install --user -U nltk

Merk op dat je eerst pip vanuit je pakketbeheerder moet installeren om de bovenstaande opdracht te laten werken. Op sommige distributies kan het pip3 worden genoemd. U kunt ook de gedetailleerde installatie-instructies volgen die beschikbaar zijn op de: officiële website van NLTK.

Zinnen uit een alinea extraheren met NLTK

Voor alinea's zonder complexe interpunctie en spatiëring, kunt u de ingebouwde NLTK-zintokenizer gebruiken, genaamd "Punkt-tokenizer", die wordt geleverd met een vooraf getraind model. U kunt ook uw eigen getrainde gegevensmodellen gebruiken om tekst in zinnen te tokeniseren. Op maat getrainde datamodellen vallen buiten het bestek van dit artikel, dus de onderstaande code gebruikt de ingebouwde Punkt Engelse tokenizer. Om het Punkt-bronbestand te downloaden, voert u de volgende drie opdrachten achter elkaar uit en wacht u tot het downloaden is voltooid:

$ python3
$ import nltk
$ nltk.downloaden('punkt')

Een alinea uit "Alice's Adventures in Wonderland" zal worden gebruikt in het onderstaande codevoorbeeld:

import nltk
para = "Of de put was erg diep, of ze viel heel langzaam, want ze had
genoeg tijd toen ze naar beneden ging om om zich heen te kijken en zich af te vragen wat er aan de hand was
als volgende gebeuren. Eerst probeerde ze naar beneden te kijken en te zien waar ze naar toe kwam,
maar het was te donker om iets te zien; toen keek ze naar de zijkanten van de put, en..
merkte op dat ze vol stonden met kasten en boekenplanken; hier en daar is ze
zag kaarten en foto's opgehangen aan pinnen. Ze pakte een pot van een van de planken
toen ze voorbijging; het was gelabeld 'ORANGE MARMALADE', maar tot haar grote teleurstelling was het
was leeg: ze liet de pot niet graag vallen uit angst iemand te doden, dus slaagde ze erin
om het in een van de kasten te leggen toen ze er langs viel."
tokens = nltk.sent_tokenize(para)
voor t in tokens:
afdrukken (t, "\n")

Als u de bovenstaande code uitvoert, krijgt u de volgende uitvoer:

Of de put was heel diep, of ze viel heel langzaam, want ze had tijd genoeg om..
ze ging naar beneden om om zich heen te kijken en zich af te vragen wat er nu zou gebeuren.
Eerst probeerde ze naar beneden te kijken en te zien waar ze heen ging, maar het was te donker
iets zien; toen keek ze naar de zijkanten van de put en zag dat ze..
gevuld met kasten en boekenplanken; hier en daar zag ze kaarten en foto's opgehangen
op pinnen.
Ze pakte een pot van een van de planken terwijl ze langskwam; het was gelabeld 'ORANGEMARMALADE',
maar tot haar grote teleurstelling was het leeg: ze liet de pot niet graag vallen uit angst voor..
iemand vermoorden, dus slaagde erin om het in een van de kasten te leggen toen ze er langs viel.

De ingebouwde Punkt-zintokenizer werkt goed als je eenvoudige alinea's wilt tokeniseren. Na het importeren van de NLTK-module, hoeft u alleen maar de methode "sent_tokenize()" op een groot tekstcorpus te gebruiken. Het is echter mogelijk dat de Punkt-zintokenizer zinnen niet correct detecteert wanneer er een complexe alinea is die veel leestekens, uitroeptekens, afkortingen of herhalende symbolen bevat. Het is niet mogelijk om een ​​standaardmanier te definiëren om deze problemen op te lossen. U moet aangepaste code schrijven om deze problemen aan te pakken met behulp van regex, tekenreeksmanipulatie of door uw eigen gegevensmodel te trainen in plaats van het ingebouwde Punkt-gegevensmodel te gebruiken.

Je kunt ook proberen het bestaande Punkt-model aan te passen om onjuiste tokenisatie te corrigeren door enkele aanvullende parameters te gebruiken. Volg hiervoor de officiële Punkt-tokenisatiedocumentatie die beschikbaar is hier. Om uw eigen aangepaste tweaks te gebruiken, is een kleine wijziging in de code vereist:

van nltk.symboliseren.punkt import PunktSentenceTokenizer, PunktParameters
para = "Of de put was erg diep, of ze viel heel langzaam, want ze had genoeg
van de tijd toen ze naar beneden ging om om zich heen te kijken en zich af te vragen wat er ging gebeuren
De volgende. Eerst probeerde ze naar beneden te kijken en te zien waar ze naar toe kwam, maar het was..
te donker om iets te zien; toen keek ze naar de zijkanten van de put en merkte op:
dat ze waren gevuld met kasten en boekenplanken; hier en daar zag ze kaarten
en foto's opgehangen aan pinnen. Ze pakte een pot van een van de planken terwijl ze
geslaagd; het was gelabeld 'ORANGE MARMALADE', maar tot haar grote teleurstelling was het
leeg: ze vond het niet leuk om de pot te laten vallen uit angst iemand te doden, dus slaagde ze erin
legde het in een van de kasten toen ze er langs viel."
punkt_params = PunktParameters()
punkt_params.abbrev_types = set(['Dhr', 'Mevrouw', 'LLC'])
tokenizer = PunktSentenceTokenizer (punkt_params)
tokens = tokenizer.tokenize (para)
voor t in tokens:
afdrukken (t, "\n")

De bovenstaande code doet hetzelfde werk als de "sent_tokenize()" methode. U kunt nu echter uw eigen regels definiëren met behulp van ingebouwde methoden en deze als argumenten doorgeven, zoals beschreven in de documentatie. Er zijn bijvoorbeeld enkele afkortingen toegevoegd aan de bovenstaande code. Als deze afkortingen worden gevolgd door interpunctie, worden ze niet opgesplitst in een nieuwe zin. Het normale gedrag is om een ​​punt of punt te gebruiken als aanduiding van het einde van een zin.

Conclusie

NLTK en zijn tokenisatiemethoden zijn behoorlijk efficiënt in het tokeniseren en verwerken van tekstgegevens. Het is echter mogelijk dat de vooraf getrainde modellen niet 100% werken met verschillende soorten teksten. Mogelijk moet u de bestaande modellen verbeteren, uw eigen modellen trainen en leveren, of uw eigen code schrijven om afwijkingen op te lossen.

Handige hulpmiddelen voor Linux-gamers
Als je graag games op Linux speelt, is de kans groot dat je apps en hulpprogramma's zoals Wine, Lutris en OBS Studio hebt gebruikt om de game-ervaring...
HD Remastered Games voor Linux die nog nooit eerder een Linux-release hebben gehad
Veel game-ontwikkelaars en uitgevers komen met HD-remaster van oude games om de levensduur van franchise te verlengen, fans die compatibiliteit met mo...
Hoe AutoKey te gebruiken om Linux-spellen te automatiseren
AutoKey is een hulpprogramma voor desktopautomatisering voor Linux en X11, geprogrammeerd in Python 3, GTK en Qt. Met behulp van de scripting- en MACR...