0
votes

Prenez jetons d'un fichier texte, calculez leur fréquence et renvoyez-les dans un nouveau fichier texte en Python

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:

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.

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:

in: 1
A: 1
Berlin: 2
Divisé: 1

etc.

J'ai essayé ce qui suit: xxx

Je ne suis pas sûr de devoir réellement utiliser . Split () 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.

On me dit: < / p> xxx

lorsque je supprimai le fichier .split (), l'erreur affichée est: xxx


7 commentaires

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» .


au lieu de dire "Il me dit que je ne peux pas diviser cet objet" , postez-nous la trace exacte, montrant quelle ligne de code et quel "objet" dont vous parlez . Ensuite, essayez de déterminer pourquoi la méthode s.split () n'existe pas sur cet objet (indice: regardez son type () 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 ligne et le avec les objets contextuels , nous n'avons même pas besoin f_obj2 < / Code>, et vous pouvez impérativement déclarer fobj_1 = ouvert (x, codage = 'utf-8')


Êtes-vous des gars autorisés à utiliser collections.Counter < / 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 , c'est une indication forte que vous devriez réellement utiliser un dict plutôt que une liste . Ensuite, vous n'avez pas besoin de la vérification du "code" look-avant-you-saut "si je pas dans unique_string: ... . Oh et n'appelez pas votre variable i si elle est censée être un mot ou un jeton, appelez-le quelque chose d'évident comme mot . Usuaully Nous utilisons i, j, k 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".


3 Réponses :


1
votes

Je suis incapable de commenter car je n'ai pas la réputation requise, mais la raison Split () ne fonctionne pas est que vous l'appelez sur l'objet de fichier lui-même, pas un string. Essayez d'appeler: xxx

à la place. De plus, quand j'ai couru cela localement, j'ai eu une erreur disant que TypeError: "coding" est un argument de mots clés non valide pour cette fonction . Vous voudrez peut-être supprimer l'argument de codage de vos appels de fonction.

Je pense que cela devrait être suffisant pour vous amener.


0 commentaires

2
votes

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: xxx

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: xxx

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 défini (mots) . 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 xxx

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 +.


3 commentaires

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} 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} , avec open ("résultats.txt", 'w') comme FOBJ_2: Pour mot en fréquence: fobj_2.write (f "{Word}: {Fréquence [Word]} \ n")



0
votes

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")


0 commentaires