文本分析 - 无法将 Python 程序的输出写入 csv 或 xls 文件

Posted

技术标签:

【中文标题】文本分析 - 无法将 Python 程序的输出写入 csv 或 xls 文件【英文标题】:Text analysis-Unable to write output of Python program in csv or xls file 【发布时间】:2017-10-02 10:43:15 【问题描述】:

您好,我正在尝试在 python 2.x 中使用朴素贝叶斯分类器进行情绪分析。它使用 txt 文件读取情绪,然后根据样本 txt 文件情绪将输出作为正面或负面给出。 我希望输出与输入的形式相同,例如我有一个文本文件,包含 1000 个原始情绪,我希望输出对每种情绪显示正面或负面。 请帮忙。 以下是我正在使用的代码

import math
import string

def Naive_Bayes_Classifier(positive, negative, total_negative, total_positive, test_string):
    y_values = [0,1]
    prob_values = [None, None]

    for y_value in y_values:
        posterior_prob = 1.0

        for word in test_string.split():
            word = word.lower().translate(None,string.punctuation).strip()
            if y_value == 0:
                if word not in negative:
                    posterior_prob *= 0.0
                else:
                    posterior_prob *= negative[word]
            else:
                if word not in positive:
                    posterior_prob *= 0.0
                else:
                    posterior_prob *= positive[word]

        if y_value == 0:
            prob_values[y_value] = posterior_prob * float(total_negative) / (total_negative + total_positive)
        else:
            prob_values[y_value] = posterior_prob * float(total_positive) / (total_negative + total_positive)

    total_prob_values = 0
    for i in prob_values:
        total_prob_values += i

    for i in range(0,len(prob_values)):
        prob_values[i] = float(prob_values[i]) / total_prob_values

    print prob_values

    if prob_values[0] > prob_values[1]:
        return 0
    else:
        return 1


if __name__ == '__main__':
    sentiment = open(r'C:/Users/documents/sample.txt')

    #Preprocessing of training set
    vocabulary = 
    positive = 
    negative = 
    training_set = []
    TOTAL_WORDS = 0
    total_negative = 0
    total_positive = 0

    for line in sentiment:
        words = line.split()
        y = words[-1].strip()
        y = int(y)

        if y == 0:
            total_negative += 1
        else:
            total_positive += 1

        for word in words:
            word = word.lower().translate(None,string.punctuation).strip()
            if word not in vocabulary and word.isdigit() is False:
                vocabulary[word] = 1
                TOTAL_WORDS += 1
            elif word in vocabulary:
                vocabulary[word] += 1
                TOTAL_WORDS += 1

            #Training
            if y == 0:
                if word not in negative:
                    negative[word] = 1
                else:
                    negative[word] += 1
            else:
                if word not in positive:
                    positive[word] = 1
                else:
                    positive[word] += 1

    for word in vocabulary.keys():
        vocabulary[word] = float(vocabulary[word])/TOTAL_WORDS

    for word in positive.keys():
        positive[word] = float(positive[word])/total_positive

    for word in negative.keys():
        negative[word] = float(negative[word])/total_negative

    test_string = raw_input("Enter the review: \n")

    classifier = Naive_Bayes_Classifier(positive, negative, total_negative, total_positive, test_string)
    if classifier == 0:
        print "Negative review"
    else:
        print "Positive review"

【问题讨论】:

嗨,hitesh,根据我的理解,您希望输出一个 csv/xls 文件,其中包含用户插入的句子的单词作为输入。对于您想要分类器计算的相对情绪(正面或负面)的每个单词。这是正确的吗?你能提供一个想要的 csv/xls 文件的例子吗?谢谢 我将下面的csv文件内容粘贴: 一款好产品——您的工作简直就是乐趣!多年来的出色经验。好产品 好结果 我不再使用它 我一直是一个稳定的产品 总体而言,与其他产品相比,这是一个非常好的产品 产品运行良好,但其他人告诉我其他一些产品更出色。健壮 速度慢 安装最麻烦 用户友好 非常糟糕 很难理解日志,并且正确设置和部署很麻烦。 下面是我正在运行的代码。注释部分是代码要求一种情绪然后将其分配为正面或负面的现有区域: .......contd for words.keys(): 词汇[word] = float(vocabulary[word])/TOTAL_WORDS for word in positive.keys(): positive[ word] = float(positive[word])/total_positive for word innegative.keys():negative[word] = float(negative[word])/total_negative # test_string = raw_input("输入评论:\n") # # classifier = Naive_Bayes_Classifier(positive, negative, total_negative, total_positive, test_string) # if classifier == 0: # print "Negative review" # else: # print "Positive review" 【参考方案1】:
> with open("test11.txt") as f:
>     for line in f:
>         classifier = Naive_Bayes_Classifier(positive, negative, total_negative, total_positive, line) if classifier == 0:
>       f.write(line + 'Negative') else:
>        f.write(line + 'Positive')
>     
> #        result = 'Positive' if classifier == 0 else 'Negative'
> #        data_to_be_written += ([line, result],)
> 
> # Create a workbook and add a worksheet. workbook = xlsxwriter.Workbook('test.xls') worksheet = workbook.add_worksheet()
> 
> # Start from the first cell. Rows and columns are zero indexed. row = 0 col = 0
> 
> # Iterate over the data and write it out row by row. for item, cost in f:    worksheet.write(row, col,     item) worksheet.write(row, col +
> 1, cost) row += 1
> 
> workbook.close()

【讨论】:

【参考方案2】:

我已经检查了你在 cmets 中发布的 github repo。我尝试运行该项目,但出现了一些错误。

无论如何,我已经检查了项目结构和用于训练朴素贝叶斯算法的文件,我认为以下代码可以用于将结果数据写入 Excel 文件(即 .xls)

with open("test11.txt") as f:
    for line in f:
        classifier = naive_bayes_classifier(positive, negative, total_negative, total_positive, line)
        result = 'Positive' if classifier == 0 else 'Negative'
        data_to_be_written += ([line, result],)

# Create a workbook and add a worksheet.
workbook = xlsxwriter.Workbook('test.xls')
worksheet = workbook.add_worksheet()

# Start from the first cell. Rows and columns are zero indexed.
row = 0
col = 0

# Iterate over the data and write it out row by row.
for item, cost in data_to_be_written:
   worksheet.write(row, col,     item)
worksheet.write(row, col + 1, cost)
row += 1

workbook.close()

因此,对于包含要测试的句子的文件的每一行,我调用分类器并准备一个将写入 csv 文件的结构。 然后循环结构并写入xls文件。 为此,我使用了一个名为 xlsxwriter 的 python 站点包。

正如我之前告诉你的,我在运行项目时遇到了一些问题,所以这段代码也没有经过测试。应该很好用,不过,如果你遇到麻烦,请告诉我。

问候

【讨论】:

@Giordano- 谢谢。我尝试运行,但出现了一些错误。 除以零错误。我尝试更改代码还是一样。 很遗憾没有,对不起

以上是关于文本分析 - 无法将 Python 程序的输出写入 csv 或 xls 文件的主要内容,如果未能解决你的问题,请参考以下文章

将大型文本文件读入数据框中以在 Python 中进行数据分析

python:TypeError:无法将str写入文本流

python 在文件上运行clean函数 - 将输出文本写入新的csv

发生错误发送事件:Azure 函数输出适配器无法将事件写入 Azure 函数作为流分析作业输出

无法将输出写入 csv bs4 python

如何将 websocket 推送 api 输出写入文本文件?