Après une longue période de recherche et demandant des amis, je suis toujours stupide et je ne sais pas comment résoudre ce problème.
Donc, pour les devoirs, nous sommes censés définir une fonction qui accède à deux fichiers, le Tout d'abord est un fichier texte avec la phrase suivante, à partir duquel nous devons calculer les fréquences de mots: P>
Dans un Berlin divisé par le mur de Berlin, deux anges, Damiel et Cassiel, regardez la ville, invisible et inouïe par ses habitants humains. P> BlockQuote>
Nous devons également inclure des virgules et des périodes: chaque élément a déjà été jeton (articles individuels sont entourés de blousins - y compris les virgules et les périodes). Ensuite, les fréquences de mots doivent être entrées dans un nouveau fichier TXT comme "mot: compter" et dans l'ordre dans lequel les mots apparaissent, c'est-à-dire: p>
in: 1
A: 1
Berlin: 2
Divisé: 1 P> blockQuote>etc. p>
J'ai essayé ce qui suit: p>
xxx pré> Je ne suis pas sûr de devoir réellement utiliser
. Split () code> du tout, mais je ne sais pas quoi faire d'autre à faire, et cela ne fonctionne de toute façon pas, car cela me dit que je ne peux pas diviser cet objet. P>
On me dit: < / p>
xxx pré> lorsque je supprimai le fichier .split (), l'erreur affichée est: p>
xxx pré> p>
3 Réponses :
Je suis incapable de commenter car je n'ai pas la réputation requise, mais la raison à la place. De plus, quand j'ai couru cela localement, j'ai eu une erreur disant que Je pense que cela devrait être suffisant pour vous amener. P> P> Split () code> ne fonctionne pas est que vous l'appelez sur l'objet de fichier lui-même, pas un string. Essayez d'appeler:
TypeError: "coding" est un argument de mots clés non valide pour cette fonction code>. Vous voudrez peut-être supprimer l'argument de codage de vos appels de fonction. P>
Divisons votre problème en des problèmes plus faibles afin que nous puissions résoudre plus facilement cela.
Nous devons d'abord lire un fichier, alors faites-le donc et enregistrez-le dans une variable: OK, nous avons donc votre fichier comme une chaîne stockée dans des phrases. Mettons-la dans une liste et comptent la survenue de chaque mot: p> La fréquence est un dictionnaire où chaque mot dans les phrases est une clé avec la valeur du nombre de fois ils apparaissent sur la phrase. Notez l'utilisation de ici, nous utilisons des chaînes F pour formater chaque ligne dans la sortie souhaitée. Notez que les F-Strings sont disponibles pour Python3.6 +. P> P> défini (mots) code>. Un ensemble n'a pas d'éléments répétés, c'est pourquoi nous sommes itérients sur l'ensemble des mots et non la liste de mots.
Enfin, nous pouvons enregistrer les fréquences de mot dans un fichier p>
Votre solution m'a donné un nombre de mots, mais le nombre de fichiers TXT n'a pas été produit dans l'ordre des mots trouvés dans le fichier TXT d'origine. J'ai réussi à modifier votre code suggéré: Fréquence = {Word: mots.count (Word) pour Word en mots} code> Cependant, alors que cela trie le problème de la commande dans laquelle les mots et Leurs fréquences apparaissent, les données que je reçois ressemblent à ceci (sans pauses de ligne): Classique: {'classique': 1, 'Short': 1, 'Histoires': 1, "logo \ nwas ': 1, au lieu de (penser Avec les pauses de ligne): Classic: 1 Short: 1 Histoires: 1 Logo: 1 était: 3
Ce que vous avez travaillé bien ici sur Python 3.7. Quelle version Python utilisez-vous?
Ceci est le code que j'ai dirigé: fréquence = {Word: mots.count (mot) pour mot en mots} code>,
avec open ("résultats.txt", 'w') comme FOBJ_2: Pour mot en fréquence: fobj_2.write (f "{Word}: {Fréquence [Word]} \ n") code>
Le script suivant doit faire ce que vous voulez.
#!/usr/local/bin/python3 def find_token_frequency(inputFileName, outputFileName): # wordOrderList to maintain order # dict to keep track of count wordOrderList = [] wordCountDict = dict() # read the file inputFile = open(inputFileName, encoding='utf-8') lines = inputFile.readlines() inputFile.close() # iterate over all lines in the file for line in lines: # and split them into words words = line.split() # now, iterate over all words for word in words: # and add them to the list and dict if word not in wordOrderList: wordOrderList.append(word) wordCountDict[word] = 1 else: # or increment their count wordCountDict[word] = wordCountDict[word] +1 # store result in outputFile outputFile = open(outputFileName, 'w', encoding='utf-8') for index in range(0, len(wordOrderList)): word = wordOrderList[index] outputFile.write(f'{word}:{wordCountDict[word]}\n') outputFile.close() find_token_frequency("input.txt", "output.txt")
Divisez ce problème en deux morceaux distincts: d'abord, oubliez d'écrire des mots mots sur FOBJ_2, obtenez simplement les mots qui fonctionnent en interne. Modifiez votre question à Montrez-nous la sortie exacte que vous obtenez actuellement et précisément pourquoi c'est faux, au lieu de simplement dire «cela ne fonctionne de toute façon» b>.
au lieu de dire "Il me dit que je ne peux pas diviser cet objet" i>, postez-nous la trace exacte, montrant quelle ligne de code et quel "objet" dont vous parlez b> . Ensuite, essayez de déterminer pourquoi la méthode
s.split () code> n'existe pas sur cet objet (indice: regardez son
type () code> est-ce une liste? Tuple ? Corde? Quelque chose d'autre?)
En outre, il sera beaucoup plus facile de déboguer temporairement si vous supprimez la fonction
def code> ligne et le
avec les objets contextuels code>, nous n'avons même pas besoin
f_obj2 < / Code>, et vous pouvez impérativement déclarer
fobj_1 = ouvert (x, codage = 'utf-8') code>
Êtes-vous des gars autorisés à utiliser
collections.Counter code> < / a> encore? Ou bien, une liste simple ou dict va bien.
Vous devez faire FOBJ_1.Read (). De plus, je suggérerais d'utiliser des collections.Conter.
Et lorsque vous déclarez une liste appelée
unique_string code>, c'est une indication forte que vous devriez réellement utiliser un
dict code> plutôt que une liste
code>. Ensuite, vous n'avez pas besoin de la vérification du "code" look-avant-you-saut "si je pas dans unique_string: ... code>. Oh et n'appelez pas votre variable
i code> si elle est censée être un mot ou un jeton, appelez-le quelque chose d'évident comme
mot code>. Usuaully Nous utilisons
i, j, k code> pour les entiers.
Faites ce que Samuel a écrit ci-dessous, sauf Ajouter dans le tableau Ordinateur unique et la traverse pour récupérer du dictionnaire de fréquence, pour le rapport final. Donc, 'pour le mot dans unique_list' plutôt que "pour mot en fréquence".