0
votes

Compter les mots (même multiples) dans un texte avec Python

Je dois écrire une fonction qui compte combien de fois un mot (ou une série de mots) apparaît dans un texte donné.

C'est ma fonction jusqu'à présent. Ce que j'ai remarqué, c'est qu'avec une série de 3 mots les fonctions fonctionnent bien, mais pas avec 4 mots et ainsi de suite.

from nltk import ngrams

def function(text, word):
    for char in ".?!-":
      text = text.replace(char, ' ')

    n = len(word.split())
    countN = 0
    bigram_lower = text.lower()
    word_lower = word.lower()

    n_grams = ngrams(bigram_lower.split(), n)

    for gram in n_grams:
        for i in range (0, n):
            if gram[i] == word_lower.split()[i]: 
                countN = countN + 1

    print (countN)


4 commentaires

qu'est-ce que vous meen ne fonctionne pas avec 4 mots et ainsi de suite? Recevez-vous un message d'erreur? le résultat n'est-il pas celui que vous attendiez?


@BendikKnapstad Disons que le mot / la phrase est "J'aime nager" et que dans le texte, cette phrase apparaît une fois. La fonction imprime 4


Je peux être mal compris, mais vous ne pouvez pas simplement utiliser str.count ()


@JammyDodger qui compterait "bonjour là-bas" même si le texte est "bonjour là-bas"


3 Réponses :


1
votes

première chose, veuillez réparer votre indentation et n'utilisez pas de bigrams comme une variable pour les ngams car il est un peu déroutant (puisque vous ne stockez pas de bigrams dans la variable de Bigrams). Deuxièmement, laisse examiner cette partie de votre code - xxx pré>

ici, vous augmentez Countn code> par un pour chaque fois qu'un mot dans votre ngam correspond au lieu de l'augmentation au lieu de l'augmenter lorsque tout le ngram correspond. Vous devriez plutôt ne plus augmenter Countn code> si tous les mots sont assortis - P>

for gram in bigrams:
    if list(gram) == word_lower.split(): 
        countN = countN + 1

print (countN)



4 commentaires

gram est un tuple tandis que word_lower.split () est une liste donc cela ne correspondra pas. Puis-je suggérer: if list (gram) == word_lower.split ()


@Mrlaf j'ai foiré je vais juste le modifier, j'ai oublié de changer de type et j'ai laissé la boucle for


@DarrylG Ne fonctionne pas. Avec une phrase de 4 mots, j'en reçois encore 4 grâce à la fonction


@Mrlaf avez-vous également supprimé la boucle for i ? J'ai oublié de le supprimer dans ma réponse d'origine. Il doit être supprimé.



0
votes

Peut-être que cela a déjà été fait dans ici

Est-ce que nltk est obligatoire?

# Open the file in read mode 
text = open("sample.txt", "r") 

# Create an empty dictionary 
d = dict() 

# Loop through each line of the file 
for line in text: 
    # Remove the leading spaces and newline character 
    line = line.strip() 

    # Convert the characters in line to  
    # lowercase to avoid case mismatch 
    line = line.lower() 

    # Split the line into words 
    words = line.split(" ") 

    # Iterate over each word in line 
    for word in words: 
        # Check if the word is already in dictionary 
        if word in d: 
            # Increment count of word by 1 
            d[word] = d[word] + 1
        else: 
            # Add the word to dictionary with count 1 
            d[word] = 1

# Print the contents of dictionary 
for key in list(d.keys()): 
    print(key, ":", d[key]) 


1 commentaires

Cela ne fonctionne que pour les unigrammes (ou des mots simples) qu'il n'aide pas à donner une distribution pour les bigrams ou les plus grands ngams



0
votes

Ce shuld travaille pour vous:

>>> tekst="this is the text i want to search, i want to search it for the words i want to search for, and it should count the occurances of the words i want to search for"
>>> function(tekst, "i want to search")
4

>>> function(tekst, "i want to search for")
2



1 commentaires

avez-vous exécuté mon code? J'ai modifié votre code et j'obtiens le bon résultat