Python读取文本行追加情感标签后文件为空问题求助
嘿,别担心,新手遇到这种问题太正常啦!我帮你排查下代码里的几个关键问题,看完你就能解决啦~
问题分析
文件打开模式错误
你用open("test.txt", "r")打开文件,这是只读模式,根本没法往里面写入内容!就算强行调用write(),程序会直接报错,更别说修改文件了。而且就算改成读写模式r+,同时读写同一个文件也容易因为指针位置混乱导致内容丢失或错乱。情感判断逻辑不符合需求
你现在是遍历句子里的每个单词,每个单词判断后都往文件里写,但这样会把每个单词的结果堆在一起,完全不是你想要的“每行末尾追加整体情感”的效果。我们应该统计整句话里的正负情感词数量,最终判断整句的倾向。未保留原句内容
你的代码里没有把原句子写入文件,就算能写入情感结果,原句也丢了,最后文件自然是空的(或者只有一堆混乱的情感标签)。
修正后的代码
import nltk.classify.util from nltk.classify import NaiveBayesClassifier from nltk.corpus import names def word_feats(words): return dict([(word, True) for word in words]) positive_vocab = ['awesome', 'outstanding', 'fantastic', 'terrific', 'good', 'nice', 'great', ':)'] negative_vocab = ['bad', 'terrible', 'useless', 'hate', ':('] # 修正特征生成:把单个单词包装成列表,避免字符拆分 positive_features = [(word_feats([pos]), 'pos') for pos in positive_vocab] negative_features = [(word_feats([neg]), 'neg') for neg in negative_vocab] train_set = negative_features + positive_features classifier = NaiveBayesClassifier.train(train_set) # 先读取所有内容并处理,避免同时读写冲突 processed_lines = [] with open("test.txt", "r") as f: for sentence in f.readlines(): sentence = sentence.strip() # 去掉换行符和首尾空格 if not sentence: # 跳过空行 continue neg_count = 0 pos_count = 0 words = sentence.lower().split(' ') for word in words: classResult = classifier.classify(word_feats([word])) if classResult == 'neg': neg_count += 1 elif classResult == 'pos': pos_count += 1 # 判断整句的情感倾向 if pos_count > neg_count: result = "Positive" elif neg_count > pos_count: result = "Negative" else: result = "Neutral" # 新增中性情况,处理正负词数量相等的场景 # 拼接成目标格式 processed_lines.append(f"{sentence} - {result}") # 一次性写入处理后的内容 with open("test.txt", "w") as f: f.write('\n'.join(processed_lines) + '\n')
关键改进点
- 使用
with语句自动管理文件,避免忘记关闭文件的问题。 - 先读取所有内容到内存处理,再一次性写入文件,彻底避免同时读写的冲突。
- 统计整句的正负情感词数量,判断整体倾向,完全匹配你想要的输出格式。
- 修复了
word_feats的调用逻辑:原来直接传word会把单个字符拆成“单词”(比如"awesome"会被拆成['a','w','e',...]),现在改成传[word]确保整个单词作为判断特征。 - 增加了空行处理和中性情感的判断,让代码更健壮。
这样运行后,你的test.txt就会变成你期望的格式啦~
内容的提问来源于stack exchange,提问作者ViVi
相关产品推荐
相关产品推荐

