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)
3 Réponses :
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 - 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)
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é.
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])
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
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
avez-vous exécuté mon code? J'ai modifié votre code et j'obtiens le bon résultat
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 () code>
@JammyDodger qui compterait "bonjour là-bas" même si le texte est "bonjour là-bas"