Zephyrnet-logo

Onderwerpidentificatie met Gensim-bibliotheek met Python

Datum:

Bron: Beeld

Topic Identification is een methode om verborgen onderwerpen in enorme hoeveelheden tekst te identificeren. De Latent Dirichlet Allocation (LDA)-techniek is een veelvoorkomend algoritme voor onderwerpmodellering dat geweldige implementaties heeft in het Gensim-pakket van Python. Het probleem is om te bepalen hoe thema's van hoge kwaliteit kunnen worden geëxtraheerd die onderscheiden, onderscheiden en significant zijn. Dit varieert afhankelijk van de kwaliteit van de tekstvoorbereiding en de aanpak voor het bepalen van het ideale aantal onderwerpen. Deze tutorial is bedoeld om beide problemen aan te pakken.

Introductie

Het automatisch extraheren van de thema's waarover mensen praten uit enorme hoeveelheden tekst is een van de fundamentele toepassingen van natuurlijke taalverwerking. Voorbeelden van grote tekst zijn feeds van sociale media, consumentenbeoordelingen van hotels, films en andere bedrijven, opmerkingen van gebruikers, nieuwsberichten en e-mails van bezorgde klanten.

Bedrijven, bestuurders en politieke campagnes hebben er veel baat bij te weten waar mensen het over hebben en hun zorgen en standpunten te begrijpen. En persoonlijk is het moeilijk om zulke enorme volumes door te lezen en de thema's samen te stellen.

Als gevolg hiervan hebben we een geautomatiseerd systeem nodig om tekstdocumenten te lezen en de genoemde onderwerpen automatisch uit te voeren.

In deze studie zullen we de dataset '20 nieuwsgroepen' gebruiken als een praktijkvoorbeeld om natuurlijk besproken thema's te extraheren met behulp van LDA.

Grondbeginselen van onderwerpidentificatie

De principes van subjectidentificatie en modellering komen aan bod. We zullen leren hoe we onderwerpen uit teksten kunnen detecteren met behulp van de bag-of-words-benadering en eenvoudige NLP-modellen.

Pijplijn van gegevens

De onbewerkte tekstgegevens zijn voorbewerkt voor de gegevenspijplijn met behulp van RegEx en andere normalisatiemogelijkheden. Ik heb exploratory data analysis (EDA) gebruikt om meer te weten te komen over hoe de data wordt gedistribueerd en gestructureerd, zodat ik de voorbewerking kon optimaliseren. Vervolgens ontwikkelde het de identificatiemodellen voor onderwerpen met behulp van Python-frameworks. We kunnen altijd terugkeren van modelontwikkeling naar EDA en er een iteratief proces van maken, in die zin dat we meer kunnen leren over welke methoden het beste zijn voor onze specifieke gegevens en doel. Zodra we een ultiem model hebben, kunnen we Docker, AWS of een andere cloudprovider gebruiken om het op te schalen tot een productiemodel.

De Bag-of-Words-methode

De bag-of-words-methode is een eenvoudige manier om onderwerpen in een document te identificeren. Het is omdat hoe vaker een term wordt gebruikt, hoe beter.

Tekstvoorbereiding

Hoewel het hierboven gegeven materiaal intrigerend is, is het niet nuttig voor het identificeren van onderwerpen. Dit komt omdat tokens zoals 'de' en 'was' veelvoorkomende termen zijn die weinig helpen bij het identificeren van onderwerpen. We gebruiken tekstvoorbereiding om dit te omzeilen.

Woord lemmatisering

Het reduceren van woorden tot hun wortels of stengels staat bekend als lemmatisering.

De WordNetLemmatizer wordt gemaakt met de eerste regel code. De tweede regel roept de klasse Counter aan en genereert een nieuwe teller met de naam bag-woorden, terwijl de derde regel de methode '.lemmatize()' aanroept om een ​​nieuwe lijst met de naam LEM-tokens op te bouwen. De vierde regel toont de zes meest voorkomende tokens.

lemmatizer = WordNetLemmatizer() lem_tokens = [lemmatizer.lemmatize(t) voor t in stopwords_removed] bag_words = Teller(lem_tokens) print(bag_words.most_common(6))

Gensim en latente dirichlet-toewijzing (LDA)

Gensim is een open-source bibliotheek voor natuurlijke taalverwerking (NLP) die corpus kan maken en opvragen. Het werkt door woordinbeddingen of vectoren te construeren, die vervolgens worden gebruikt om onderwerpen te modelleren.

Deep learning-algoritmen worden gebruikt om multidimensionale wiskundige representaties van woorden te bouwen die woordvectoren worden genoemd. Ze geven informatie over de relaties tussen termen in een corpus. De afstand tussen de woorden 'India' en 'New Delhi' kan bijvoorbeeld vergelijkbaar zijn met de afstand tussen de woorden 'China' en 'Beijing', aangezien dit de vectoren van 'Land-Hoofdstad' zijn.

Gensim voor het maken en opvragen van het corpus

Het is tijd om wat je in de vorige video hebt geleerd in de praktijk te brengen en je eerste gensim-woordenboek en corpus te ontwikkelen!

Deze gegevensstructuren kijken naar woordtrends en andere intrigerende thema's in uw documentenset. Om te beginnen hebben we nog een paar door elkaar gegooide Wikipedia-artikelen geïmporteerd, die zijn voorbewerkt door alle woorden in kleine letters te plaatsen, ze te symboliseren en stopwoorden en interpunctie te verwijderen. Deze werden vervolgens opgeslagen als artikelen, een lijst met documenttokens. U moet wat voorbereidend werk doen voordat u de gensim-vocabulaire en het corpus maakt.

Gensims zak vol woorden

Nu ga je je nieuwe gensim-corpus en woordenboek gebruiken om te zien welke termen het meest worden gebruikt in elk document en in alle documenten. U kunt de termen opzoeken in uw woordenboek.

Om te helpen bij het genereren van tussenliggende datastructuren voor analyse, heb je toegang tot het woordenboek en de corpusobjecten die je in de laatste oefening hebt gemaakt, evenals het Python-standaarddict en itertools.

We kunnen defaultdict gebruiken om een ​​woordenboek te maken dat een standaardwaarde toewijst aan niet-bestaande sleutels. We kunnen ervoor zorgen dat alle niet-bestaande sleutels automatisch een standaardwaarde van 0 krijgen door de parameter int te gebruiken.

Document-Term Matrix voor LDA

We trainen het LDA-modelobject op de documentterm-matrix nadat het is gemaakt. Het LDA-object wordt verzonden op de 'DT-matrix' in de eerste regel code hieronder, waarmee deze taak wordt uitgevoerd. Ook het aantal onderwerpen en het woordenboek moeten worden opgegeven. We kunnen het aantal onderwerpen beperken tot twee of drie omdat we een klein corpus van negen documenten hebben.

Wanneer teksten binnen zichzelf coherent zijn, is bag-of-words-informatie (LDA of TF-IDF) uitstekend geschikt voor het identificeren van onderwerpen door frequente woorden te detecteren. Wanneer teksten onsamenhangend zijn (wat betreft woordkeuze of zinsbetekenis), is meer contextuele informatie nodig om de ideeën van de teksten volledig weer te geven.

Tf-idf met gensim

TF-IDF

Termfrequentie - Inverse documentfrequentie

1) Hiermee kunt u ontdekken welke woorden in elk document het belangrijkst zijn.

2) Naast stopwoorden kan elk corpus gedeelde woorden bevatten.

3) Het belang van deze woorden moet worden verminderd.

4) Zorgt ervoor dat de meest voorkomende woorden niet als trefwoorden worden gebruikt.

5) Onderhoudt een zwaar gewogen document met gespecificeerde veel voorkomende woorden.

formule

Wik, j  = tfik, j * log(N/dfi)

 

  • wik,j​= tf-idf voor token ii in document jj
  • tfik, j = tfik, j​= aantal keren dat token ii voorkomt in document jj
  • dfi = dfik​= aantal documenten dat token ii . bevat
  • N =N= totaal aantal documenten

Download de datasets van sklearn

De dataset van 20Newsgroup is degene die ik heb gebruikt. Het is te vinden onder sklearn-gegevenssets en misschien snel te downloaden.

from sklearn.datasets import fetch_20newsgroups newsgroups_train = fetch_20newsgroups(subset='train', shuffle = True) newsgroups_test = fetch_20newsgroups(subset='test', shuffle = True)

Het nieuws in deze dataset is al gecategoriseerd in kernonderwerpen. Waar je langs kunt komen.

print(list(nieuwsgroepen_train.target_names))
datasets

Als we visueel naar de dataset kijken, kunnen we zien dat deze een verscheidenheid aan thema's omvat, zoals wetenschap, politiek, sport, religie en technologie. Laten we eens kijken naar enkele voorbeelden van recent nieuws.

nieuwsgroepen_train.data[:2]
Onderwerpidentificatie met Gensim-bibliotheek

Data Preprocessing

Dit zijn de stappen die we zullen nemen:

1) Splits de tekst in zinnen en de zinnen op in woorden met behulp van tokenisatie.

2) Verwijder alle leestekens en kleine letters.

3) Woorden met minder dan drie tekens worden weggelaten.

4) Alle stopwoorden zijn verwijderd.

5) Zelfstandige naamwoorden zijn gelemmatiseerd, dus woorden van de derde persoon worden getransformeerd naar de eerste persoon, en werkwoorden uit de verleden en toekomende tijd worden veranderd in tegenwoordige tijden.

6) Woorden zijn gestemt, wat betekent dat ze worden teruggebracht tot hun eenvoudigste vorm.

Download nltk stopwoorden en benodigde pakketten

import gensim van gensim.utils import simple_preprocess van gensim.parsing.preprocessing import STOPWORDS van nltk.stem import WordNetLemmatizer, SnowballStemmer van nltk.stem.porter import * import numpy als np np.random.seed(400) import nltk nltk.download( 'woordnet')

lemmatizer:

Laten we een lemmatiserend voorbeeld bekijken voordat we beginnen met het voorbewerken van onze gegevens. Wat zou er gebeuren als we het woord "Verdwenen" zouden lemmatiseren?

we zetten hier de verleden tijd om in de tegenwoordige tijd,

print(WordNetLemmatizer().lemmatize('gone', pos = 'v'))

Uitgang: ga

Laten we ook eens naar een stamvoorbeeld kijken. Laten we een paar woorden naar de stemmer gooien en kijken hoe deze reageert:

import panda's als pd stemmer = SnowballStemmer("english") original_words = ['sings', 'classes', 'dies', 'mules', 'denied','played', 'agreement', 'owner', 'humbled' , 'sized','meeting', 'stating', 'siezing', 'itemization','sensational', 'traditional', 'reference', 'colon', 'plotting'] singles = [stemmer.stem(meervoud) voor meervoud in original_words] pd.DataFrame(data={'original word':original_words, 'stemmed':singles })

Output:

Onderwerpidentificatie met Gensim-bibliotheek

Laten we een functie schrijven die de voorbewerkingsfasen voor de hele dataset doorloopt.

def lemmatize_stemming(text): return stemmer.stem(WordNetLemmatizer().lemmatize(text, pos='v')) # Tokenize en lemmatize def preprocess(text): result=[] voor token in gensim.utils.simple_preprocess(text ) : if token niet in gensim.parsing.preprocessing.STOPWORDS en len(token) > 3: result.append(lemmatize_stemming(token)) return resul

laten we nu een voorbeeld van een document bekijken na voorbewerking en het tokenized en gelemmatiseerde document ophalen.

document_number = 50 doc_sample = 'Sara hield niet van lezen. Ze was er niet zo goed in.' print("Origineel document: ") woorden = [] voor woord in doc_sample.split(' '): woorden.append(word) print(words) print("nnTokenized en gelemmatiseerd document: ") print(preprocess(doc_sample))

output:

Onderwerpidentificatie met Gensim-bibliotheek

Laten we beginnen met het voorbewerken van al onze nieuwskoppen. Om dit te doen, nemen we de lijst met documenten in ons trainingsvoorbeeld keer op keer door.

verwerkt_docs = [] verwerkt_docs.append(preprocess(doc)) ''' Voorbeeld 'processed_docs' ''' print(processed_docs[:2])
voor doc in nieuwsgroepen_train.data:
Print output

Nu gaan we 'verwerkte documenten' gebruiken om een ​​woordenboek samen te stellen dat het aantal keren bevat dat elk woord in de trainingsset voorkomt. Om dit te doen, noem het 'woordenboek' en geef verwerkte documenten aan gensim.corpora.Woordenboek().

Een zak met woorden maken van een tekst

Voordat we het onderwerp identificeren, transformeren we de tokenized en lemmatized tekst in een zak met woorden, die kan worden gezien als een woordenboek, waarbij de sleutel het woord is en de waarde het aantal keren dat dat woord in het corpus voorkomt.

Maak met behulp van gensim.corpora.Dictionary een woordenboek van 'verwerkte documenten' dat het aantal keren bevat dat een term in de trainingsset voorkomt en noem het 'woordenboek'.

woordenboek = gensim.corpora.Dictionary(processed_docs)

We moeten controleren of het woordenboek is gemaakt of niet,

count = 0 voor k, v in dictionary.iteritems(): print(k, v) count += 1 if count > 10: break

Output:

Zak vol woorden

Filter uitersten Gensim

Verwijder alle tokens die in de lijst verschijnen.

  • groter dan geen bovenstaande documenten (absoluut aantal) of
  • minder dan geen onderstaande documenten (absoluut aantal) (fractie van de totale corpusomvang, niet het absolute aantal).
  • Bewaar alleen de eerste keep n meest voorkomende tokens na (1) en (2). (of bewaar alles als Geen).

Syntax:

filter_extremes(no_below=5, no_above=0.5, keep_n=100000)
woordenboek.filter_extremes(no_below=15, no_above=0.1, keep_n= 100000)

We kunnen ook woorden uitfilteren die niet vaak of vaak voorkomen.

We gebruiken nu het woordenboekobject dat we hebben gegenereerd om elke voorbewerkte pagina om te zetten in een zak met woorden. dat wil zeggen, we ontwikkelen een woordenboek voor elk document dat aangeeft hoeveel termen en hoe vaak die woorden voorkomen.

Gensim doc2bow

doc2bow(document)

Converteer een document (een lijst met woorden) naar een lijst van (token id, token count) 2-tupels in het bag-of-word-formaat. Elk woord wordt beschouwd als een genormaliseerde en tokenized string (Unicode of utf8-gecodeerd). Voordat u deze functie aanroept, moet u tokenisatie, stammen en andere voorbewerkingen toepassen op de woorden in het document.

Voor elk document moeten we een woordenboek maken met het Bag-of-words-model, waarin we rapporteren hoeveel woorden en hoe vaak die woorden voorkomen. 'bow corpus' is een goede plek om dit op te slaan.

bow_corpus = [woordenboek.doc2bow(doc) voor doc in verwerkte_docs]

Nu, om BOW te bekijken voor ons voorbewerkte voorbeelddocument 11

document_num = 11

bow_doc_x = bow_corpus[document_num]

voor i in bereik (len (bow_doc_x)):

print(“Woord {} (“{}”) verschijnt {} tijd.”.format(bow_doc_x[i][0],

woordenboek[bow_doc_x[i][0]],

bow_doc_x[i][1]))


Gensim doc2bow

Bag of Words gebruiken om LDA uit te voeren

In het documentencorpus streven we naar tien onderwerpen.

Om modeltraining te parallelliseren en te versnellen, voeren we LDA uit op alle CPU-cores.

Hieronder volgen enkele parameters die we gaan aanpassen:

1) Het aantal aangevraagde latente thema's dat uit het opleidingscorpus moet worden gehaald is num topics.

2) De id2word-mapping zet woord-id's (gehele getallen) om in woorden (strings). Het wordt gebruikt voor het opsporen van fouten en het afdrukken van onderwerpen, evenals het bepalen van de woordenschatgrootte.

3) Het aantal extra processen dat voor parallellisatie moet worden gebruikt, is het aantal werkers. Standaard worden alle beschikbare cores gebruikt.

4) De hyperparameters alpha en eta beïnvloeden respectievelijk de schaarste van de document-topic (theta) en topic-word (lambda) distributies. Voorlopig zijn dit de standaardwaarden (de standaardwaarde is 1/num topics).

De onderwerpverdeling per document kennen we als Alpha.

Hoge alfa: elk document heeft een mix van thema's (documenten lijken op elkaar).
Lage alfa: Elk document omvat enkele onderwerpen.

De woordverdeling per onderwerp wordt Eta genoemd.

Hoge eta: elk onderwerp bevat verschillende termen (onderwerpen lijken op elkaar).
Lage eta: elk onderwerp bestaat uit een klein aantal woorden.

Omdat we het gensim LDA-model kunnen gebruiken, is dit vrij eenvoudig. Het aantal onderwerpen in de gegevensverzameling moet worden gespecificeerd. Laten we zeggen dat we beginnen met acht verschillende onderwerpen. Het aantal trainingspassen over het document wordt het aantal passen genoemd.

gensim.models zal ons LDA-model trainen. LdaMulticore en plaats deze in de map 'LDA model'.

lda_model = gensim.models.LdaMulticore(bow_corpus, num_topics = 8, id2word = woordenboek, passes = 10, worker = 2)

Nadat we het model hebben getraind, gaan we kijken naar de woorden die in dat onderwerp voorkomen en hun evenredige belang voor elk ervan.

voor idx, onderwerp in lda_model.print_topics(-1): print("Onderwerp: {} nWoorden: {}".format(idx, onderwerp )) print("n")
Bag of Words gebruiken om LDA uit te voeren

De onderwerpen labelen

Welke categorieën heb je kunnen afleiden uit de termen in elk onderwerp en hun bijbehorende gewichten?

  • 0: Geweld met wapens
  • 1: Sport
  • 2: Politiek
  • 3: ruimte
  • 4: Encryptie
  • 5: Technologie
  • 6: Grafische kaarten
  • 7: Religie

Modelfase testen

Voorbewerking van gegevens voor een voorheen ongezien document

num = 70 unseen_document = nieuwsgroepen_test.data[num] print(unseen_document)

Output:

Modelfase testen
bow_vector = woordenboek.doc2bow(preprocess(unseen_document)) voor index, score in gesorteerd(lda_model[bow_vector], key=lambda tup: -1*tup[1]): print("Score: {}t Topic: {}" .format(score, lda_model.print_topic(index, 5)))

Dat is alles! Het model is voltooid. Laten we eens kijken hoe we het moeten interpreteren en kijken of de resultaten logisch zijn.

Het model produceert een output van acht onderwerpen, die elk worden geclassificeerd door een reeks woorden. Het LDA-model geeft dergelijke woorden geen onderwerpnaam.

Evaluatie van het model

1) Het model presteerde bewonderenswaardig bij het extraheren van de verschillende onderwerpen van de dataset, die we kunnen controleren omdat we de doelnamen kennen.

2) Het model is extreem snel. Binnen enkele minuten kon ik onderwerpen uit een dataset halen.

3) Aangenomen wordt dat de dataset discrete onderwerpen bevat. Als de dataset een verzameling willekeurige tweets is, kunnen de modelbevindingen daarom moeilijk te interpreteren zijn.

Eindopmerkingen

1) Door zowel de LDA-onderwerpwaarschijnlijkheid als de zinsinbedding op te nemen, maakt het contextuele onderwerpidentificatiemodel gebruik van zowel woordenschat als contextuele informatie.

2) Hoewel LDA goed presteert voor het identificeren van onderwerpen, worstelt het met korte teksten met korte tekst om te modelleren en documenten die het onderwerp niet coherent uitleggen. Het is ook beperkt omdat het gebaseerd is op een zak met woorden.

3) Wanneer teksten binnen zichzelf coherent zijn, is bag-of-word-informatie (LDA of TF-IDF) uitstekend geschikt voor het identificeren van onderwerpen door frequente woorden te detecteren. Wanneer teksten onsamenhangend zijn (wat betreft woordkeuze of zinsbetekenis), is meer informatie nodig om de ideeën van de teksten weer te geven.

Ik hoop dat dit artikel meer beschrijvend en verfrissend zal zijn!

Als u nog vragen heeft, kunt u deze in het opmerkingengedeelte plaatsen. Als je geïnteresseerd bent in het lezen van mijn andere artikelen, bekijk ze dan eens hier!

Bedankt voor het lezen van mijn artikel over onderwerpidentificatie. Ik hoop dat je het leuk vind.

Over mezelf

Hallo, mijn naam is Lavanya en ik kom uit Chennai. Als gepassioneerd schrijver en enthousiaste contentmaker surfte ik vroeger door veel nieuwe technologische concepten. De meest hardnekkige problemen ontroeren me altijd. Ik ben bezig met mijn afstuderen in B. Tech in Computer Science Engineering en heb een sterke interesse op het gebied van data-engineering, machine learning, data science, kunstmatige intelligentie en Natural Language Processing, en ik ben gestaag op zoek naar manieren om deze velden te integreren met andere disciplines van wetenschap en technologieën om mijn onderzoeksdoelen te bevorderen.

LinkedIn-URL: https://www.linkedin.com/in/lavanya-srinivas-949b5a16a/

E-mail: [e-mail beveiligd]

Conclusie

In deze handleiding hebben we geleerd hoe u de woordenzakstrategie kunt gebruiken om een ​​onderwerp te identificeren. Je leerde ook over LDA met behulp van 'gensim', een sterke open-source NLP-bibliotheek.

De document-term-matrix vertegenwoordigt de termen die in het corpus zijn opgenomen, en hun prestaties hangen ervan af. Omdat deze matrix schaars is, kan het verlagen van de afmetingen ervoor zorgen dat het model beter presteert. Omdat ons corpus echter klein was, kunnen we redelijk zeker zijn van de resultaten die we hebben gekregen.

De in dit artikel getoonde media zijn geen eigendom van Analytics Vidhya en worden naar goeddunken van de auteur gebruikt. 

spot_img

Laatste intelligentie

spot_img