1
votes

Stemming et lemmatisation PNL à l'aide de la tokenisation d'expression régulière

Définissez une fonction appelée performStemAndLemma , qui prend un paramètre. Le premier paramètre, textcontent , est une chaîne. Le stub de code de définition de fonction est donné dans l'éditeur. Effectuez les tâches spécifiées suivantes:

1.Tokenize tous les mots donnés dans textcontent . Le mot doit contenir des alphabets ou des nombres ou des traits de soulignement. Stockez la liste de mots tokenisés dans tokenizedwords . (Indice: utilisez regexp_tokenize)

  1. Convertit tous les mots en minuscules. Stockez le résultat dans la variable tokenizedwords .

  2. Supprimez tous les mots vides de l'ensemble unique de tokenizedwords . Stockez le résultat dans la variable filteredwords . (Astuce: utilisez des corpus de mots vides)

  3. Stem chaque mot présent dans filteredwords avec PorterStemmer, et stocker le résultat dans la liste porterstemmedwords .

  4. Stem chaque mot présent dans filteredwords avec LancasterStemmer, et stocker le résultat dans la liste lancasterstemmedwords .

  5. Lemmatiser chaque mot présent dans mots filtrés avec WordNetLemmatizer, et stocker le résultat dans la liste mots lemmatisés .

Renvoie les variables porterstemmedwords , lancasterstemmedwords , lemmatizedwords depuis la fonction.

Mon code:

from nltk.corpus import stopwords
def performStemAndLemma(textcontent):
    # Write your code here
    #Step 1
    tokenizedword = nltk.tokenize.regexp_tokenize(textcontent, pattern = '\w*', gaps = False)
    #Step 2
    tokenizedwords = [x.lower() for x in tokenizedword if x != '']
    #Step 3
    unique_tokenizedwords = set(tokenizedwords)
    stop_words = set(stopwords.words('english')) 
    filteredwords = []
    for x in unique_tokenizedwords:
        if x not in stop_words:
            filteredwords.append(x)
    #Steps 4, 5 , 6
    ps = nltk.stem.PorterStemmer()
    ls = nltk.stem.LancasterStemmer()
    wnl = nltk.stem.WordNetLemmatizer()
    porterstemmedwords =[]
    lancasterstemmedwords = []
    lemmatizedwords = []
    for x in filteredwords:
        porterstemmedwords.append(ps.stem(x))
        lancasterstemmedwords.append(ls.stem(x))
        lemmatizedwords.append(wnl.lemmatize(x))
    return porterstemmedwords, lancasterstemmedwords, lemmatizedwords

Le programme ne fonctionne toujours pas correctement. Ne pas passer les 2 cas de test. Mettez en évidence l'erreur dans le code ci-dessus et fournissez une solution alternative pour la même chose.


5 commentaires

veuillez préciser votre question. Quels sont les cas de test qui ont échoué? Quelle étape a échoué? À quel résultat vous attendiez-vous?


Entrée: Je suis allé par inadvertance chez See's Candy la semaine dernière (j'étais dans le centre commercial à la recherche d'une réparation de téléphone), et il s'avère que See's Candy facture maintenant un dollar - un dollar complet - pour même la plus simple de leurs offres de confection minuscules . J'ai acheté deux sucettes au chocolat et deux choses au chocolat-caramel-amande. Le coût total était de quatre quelque chose. Je veux dire, les bonbons étaient savoureux et tout, mais soyons réalistes: une barre Snickers coûte cinquante cents. Après cette révélation d'un dollar par bonbon, je ne me retrouverai peut-être pas de sitôt à errer rêveusement dans un See's Candy.


Ma sortie: ['amande', 'retour', 'bar', 'acheté', 'candi', 'candi', 'caramel', 'cent', 'cent', 'cent', 'charg', 'chocol ',' confect ',' cost ',' dollar ',' dreamili ',' even ',' fifti ',' find ',' four ',' full ',' inadvert ',' last ',' let ', 'lollipop', 'look', 'mall', 'may', 'mean', 'offer', 'per', 'phone', 'real', 'repair', 'revel', 'see', 'simplest ',' ricaner ',' quelque chose ',' bientôt ',' tasti ',' chose ',' temps ',' total ',' tourner ',' deux ',' errer ',' wee ',' semaine ', 'est allé'] Porter Stemming o / p et voir candi apparaître deux fois


Résultats attendus: ['amande', 'retour', 'bar', 'acheté', 'candi', 'candi', 'candi', 'caramel', 'cent', 'charg', 'chocol', 'confect ',' cost ',' dollar ',' dreamili ',' even ',' fifti ',' find ',' four ',' full ',' inadvert ',' last ',' let ',' lollipop ', 'look', 'mall', 'may', 'mean', 'offer', 'per', 'phone', 'real', 'repair', 'revel', 'see', 'simplest', 'snicker ',' quelque chose ',' bientôt ',' tasti ',' chose ',' temps ',' total ',' tourner ',' deux ',' errer ',' wee ',' semaine ',' est allé '] Porter sortant o / p voir candi apparaître trois fois


Le problème est le même que celui de stackoverflow.com/questions/62626878/...


3 Réponses :


1
votes
def performStemAndLemma(textcontent):
    from nltk.corpus import stopwords
Just import stopwords after defining the function as above. The rest of the code remains the same.

1 commentaires

alors je n'ai aucune idée



2
votes

En fait, le résultat attendu est de considérer les mots majuscules et minuscules comme des jetons séparés. Par conséquent, vous devez récupérer tous les mots uniques avant de les convertir tous en minuscules. J'espère que le code suivant devrait fonctionner.

from nltk.corpus import stopwords
def performStemAndLemma(textcontent):
    # Write your code here
    #Step 1
    tokenizedword = nltk.regexp_tokenize(textcontent, pattern = r'\w*', gaps = False)
    #Step 2
    tokenizedwords = [y for y in tokenizedword if y != '']
    unique_tokenizedwords = set(tokenizedwords)
    tokenizedwords = [x.lower() for x in unique_tokenizedwords if x != '']
    #Step 3
    #unique_tokenizedwords = set(tokenizedwords)
    stop_words = set(stopwords.words('english')) 
    filteredwords = []
    for x in tokenizedwords:
        if x not in stop_words:
            filteredwords.append(x)
    #Steps 4, 5 , 6
    ps = nltk.stem.PorterStemmer()
    ls = nltk.stem.LancasterStemmer()
    wnl = nltk.stem.WordNetLemmatizer()
    porterstemmedwords =[]
    lancasterstemmedwords = []
    lemmatizedwords = []
    for x in filteredwords:
        porterstemmedwords.append(ps.stem(x))
        lancasterstemmedwords.append(ls.stem(x))
        lemmatizedwords.append(wnl.lemmatize(x))
    return porterstemmedwords, lancasterstemmedwords, lemmatizedwords


0 commentaires

2
votes

L'approche ci-dessous a effacé tous les cas de test pour moi

import re
from nltk.corpus import stopwords 
def performStemAndLemma(textcontent):
    # Write your code here
    lancaster = nltk.LancasterStemmer()
    porter = nltk.PorterStemmer()
    wnl = nltk.WordNetLemmatizer()
    tokens2_3 = nltk.regexp_tokenize(textcontent,  r'\w+')
    stop_words = set(stopwords.words('english'))
    tokenisedwords=[words for words in set(tokens2_3) if not words.lower() in  stop_words ]
    #print(tokenizedwords)
    return [porter.stem(word.lower()) for word in set(tokenisedwords)],[lancaster.stem(word.lower()) for word in set(tokenisedwords)],[wnl.lemmatize(word.lower()) for word in set(tokenisedwords)]


0 commentaires