2017-09-08 5 views
2

Je fais du balisage en utilisant 'nltk' en Python et le code ci-dessous fonctionne parfaitement bien quand je l'imprime. Donc quand j'imprime le code ci-dessus, la sortie ressemble à ceci, ce qui correspond exactement à ce que je veux.La fonction d'écriture en Python enregistre uniquement la dernière chaîne (Python)

[('This', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('simple', 'JJ'), ('sentence', 'NN')] 
[('I', 'PRP'), ('love', 'VBP'), ('this', 'DT'), ('company', 'NN'), ('.', '.'), ('This', 'DT'), ('company', 'NN'), ('is', 'VBZ'), ('so', 'RB'), ('good', 'JJ'), ('.', '.')] 
[('I', 'PRP'), ('am', 'VBP'), ('not', 'RB'), ('inovlved', 'VBN'), ('with', 'IN'), ('this', 'DT'), ('work', 'NN'), ('.', '.'), ('So', 'RB'), ('hard', 'JJ'), ('!', '.')] 
[('What', 'WP'), ('are', 'VBP'), ('you', 'PRP'), ('doing', 'VBG'), ('?', '.'), ('Are', 'NNP'), ('you', 'PRP'), ('nut', 'RB'), ('?', '.')] 
[('Can', 'MD'), ('I', 'PRP'), ('borrow', 'VB'), ('your', 'PRP$'), ('jar', 'NN'), ('?', '.'), ('Just', 'NNP'), ('for', 'IN'), ('today', 'NN'), ('.', '.')] 

Mais quand je l'écris en utilisant les trois dernières lignes dans le code, il enregistre uniquement la dernière chaîne dans le fichier texte (c.-à-[(« Can », « MD »), (« I », 'PRP'), ('emprunter', 'VB'), ('votre', 'PRP $'), ('jar', 'NN'), ('?', '.'), ('Juste' , 'NNP'), ('pour', 'IN'), ('aujourd'hui', 'NN'), ('.', '.')]).

je voudrais enregistrer l'ensemble des résultats dans un fichier txt ou csv, et une chaîne dans chaque [] doit être enregistré dans une ligne dans le fichier txt ou csv.

Je suis vraiment vraiment nouveau à Python, donc l'aide sera appréciée.

+2

'tagged = nltk.pos_tag (jetons)' redéfinit balise pour chaque ligne de données. À la fin, vous économisez seulement la dernière ligne. –

Répondre

2

Vous devez enregistrer chaque ligne dans une liste, puis écrire toute la liste:

tagged_list = [] 
#Parse the text file for NER with POS Tagging 
for line in data: 
    tokens = nltk.word_tokenize(line) 
    tagged_list.append(str(nltk.pos_tag(tokens))) 

output = open(r"C:\Users\output3.csv", "w") 
output.write('\n'.join(tagged_list)) 
output.close() 

En tagged_list vous ajoutez toutes les lignes à écrire. Avec '\n'.join(tagged) vous les écrivez, séparés par « \ n » (par exemple chacun dans une autre ligne)

+0

merci beaucoup! Cela fonctionne parfaitement. Juste une erreur mineure est d'écrire tagged_list au lieu de tagged à l'intérieur de la parenthèse juste après la jointure. Merci beaucoup! – Emily

+0

Droit! Je l'ai réparé, merci! –

0

Vous avez une erreur d'indentation.

import nltk 
import pos_tag 
import nltk.tokenize 
import numpy 

f = open(r'C:\Users\sample_data.txt') 
data = f.readlines() 

#Parse the text file for NER with POS Tagging 
for line in data: 
    tokens = nltk.word_tokenize(line) 
    tagged = nltk.pos_tag(tokens) 
    #print (tagged) 

    output = open(r"C:\Users\output3.csv", "a") 
    output.write(str(tagged)+'\n') 
f.close() 
output.close() 
0

EDIT: Pour vous répondre à la question d'origine, dans votre code d'origine, vous devez appeler output.write(str(tagged)) dans la boucle.

Même si d'autres réponses font répondre à la question, je voudrais suggérer quelques modifications à votre implémentation

  • essayer d'utiliser with lors de la manipulation des ressources chaque fois que vous pouvez car il ferme les ressources automatiquement à la fin
  • vous pouvez simplement itérer la variable f une fois que le fichier est ouvert

le résultat final ressemblera à ceci:

import nltk 

# file will be closed once out of the scope 
with open(r'C:\Users\sample_data.txt') as f: 
    with open(r'C:\Users\output3.csv', 'w') as output: 
     for line in f: 
      tokens = nltk.word_tokenize(line) 
      tagged = nltk.pos_tag(tokens) 
      output.write(str(tagged)+'\n')