【问题标题】:how to extract specific data from a csv file with given parameters?如何从具有给定参数的csv文件中提取特定数据?
【发布时间】:2018-09-11 21:04:38
【问题描述】:

我想从给定的 csv 文件中提取中性词(到一个单独的 .txt 文件),但我对 python 还很陌生,对文件处理知之甚少。我找不到中性词数据集,但是在到处搜索之后,我找到了。

这是我想从中提取数据的 Gtihub 项目(以防万一有人需要知道):hoffman-prezioso-projects/Amazon_Review_Sentiment_Analysis

Neutral Words
Word     Sentiment Score
a        0.0125160264947
the      0.00423728459134
it      -0.0294755274737
and      0.0810574365028
an       0.0318918766949
or      -0.274298468178
normal  -0.0270787859177

所以基本上我只想从 csv 中提取数值为 0.something 的单词(文本)。

【问题讨论】:

  • 我们可以使用 Pandas 之类的库,还是应该将答案限制在标准的 vanilla 库中?
  • 你确定这是csv 看起来格式不同
  • @eagle 提供的链接显示了他正在使用的实际文件
  • 最好不要提供链接,而是发布sn-ps

标签: python csv sentiment-analysis


【解决方案1】:

像这样使用熊猫:

import pandas
df = pandas.read_csv("yourfile.csv")
df.columns = ['word', 'sentiment']

根据情绪选择单词:

positive = df[df['sentiment'] > 0]['word']
negative = df[df['sentiment'] < 0]['word']
neutral = df[df['sentiment'] == 0]['word']

【讨论】:

    【解决方案2】:

    即使不使用任何库,使用您使用的 csv 也相当容易。

    首先打开文件(我假设你的路径保存在变量filename中),然后用readlines()函数读取文件,然后根据你给的条件过滤掉。

    with open(filename, 'r') as csv:                         # Open the file for reading
        rows = [line.split(',') for line in csv.readlines()] # Read each the file in lines, and split on commas
        filter = [line[0] for line in rows if abs(float(line[1])) < 1]   
                                                             # Filter out all lines where the second value is not equal to 1
    

    现在这是公认的答案,所以我要添加免责声明。这段代码不应该被应用到其他 CSV 的原因有很多。

    • 它读取内存中的整个 CSV
    • 它不考虑例如引用

    对于非常简单的 CSV 是可以接受的,但如果您不能确定 CSV 不会破坏此代码,则此处的其他答案会更好。

    【讨论】:

    • 这是个坏主意,将整个文件加载到内存中,如果它很大怎么办?这也只选择那些具有中性情绪的人
    • @eagle OP 仅请求值为 0 的行,该文件具有已知的大小和格式,并且他没有指定他是否可以访问 pandas。这意味着说明如何在没有库的情况下完成此操作,而不是一般解决方案。已经提供了其他答案,给出了一个通用的解决方案。
    • 读取CSV文件不是那么容易,引用例如呢?
    • 很抱歉,我无法正确传达我想要的内容。我只想要那些对应数值介于 1 和 -1 之间的文本值。任何 0.xx 或 -0.xx
    • @ANiK3T 我已更改答案以反映这一点。话虽如此,如果您尝试将此代码应用于任何随机 csv,则此处的其他 cmets 应该足够警告。希望这可以帮助您了解 csv 解析的内容:)
    【解决方案3】:

    如果您不想使用任何其他库,可以尝试使用csv 模块。请注意,delimiter='\t' 在您的情况下可能会有所不同。

    import csv
    
    f = open('name.txt', 'r')
    reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
    for row in reader:
       if(float(row[1]) > 0.0):
          print(row[0] + ' ' row[1])
    

    【讨论】:

      【解决方案4】:

      这是一种仅使用普通库而不将整个文件保存在内存中的方法

      import csv
      
      def get_vals(filename):
          with open(filename, 'rb') as fin:
              reader = csv.reader(fin)
              for line in reader:
                  if line[-1] <= 0:
                      yield line[0]
      
      words = get_vals(filename)
      
      for word in words:
          do stuff...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-04
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 2013-01-06
        相关资源
        最近更新 更多