【问题标题】:Creating a table which has sentences from a paragraph each on a row with Python使用Python创建一个表格,其中包含段落中的每个句子
【发布时间】:2014-03-30 10:42:54
【问题描述】:

我有一个摘要,我已将其拆分为 Python 中的句子。我想写2张桌子。一个包含以下列:abstract id(这是我从文档中提取的文件编号)、sentence id(自动生成)以及该摘要的每个句子在一行中。 我想要一个看起来像这样的表

abstractID  SentenceID   Sentence

a9001755    0000001      Myxococcus xanthus development is regulated by(1st sentence)

a9001755    0000002      The C signal appears to be the polypeptide product (2nd sentence)

另一个表NSFClasses 具有abstractIDnsfOrg。 如上所示,如何将句子(每行)写入表格并分配sentenceId

这是我的代码:

import glob;
import re;
import json
org = "NSF Org";
fileNo = "File";
AbstractString = "Abstract";
abstractFlag = False;
abstractContent = []
path = 'awardsFile/awd_1990_00/*.txt';
files = glob.glob(path);
for name in files:
    fileA = open(name,'r');
    for line in fileA:
         if line.find(fileNo)!= -1:
             file = line[14:]
         if line.find(org) != -1:
             nsfOrg = line[14:].split()
    print file
    print nsfOrg
    fileA = open(name,'r')
    content = fileA.read().split(':')
    abstract = content[len(content)-1]
    abstract = abstract.replace('\n','')
    abstract = abstract.split();
    abstract = ' '.join(abstract)
    sentences = abstract.split('.')
    print sentences
    key = str(len(sentences))
    print "Sentences--- "

【问题讨论】:

  • 问题的确切性质是什么?你上面的代码不行吗?
  • 我上面的代码有效。 1 个摘要的输出是:a9001755 ['IBN'] ['Myxococcus xanthus development is regulation by the Csg intercellular communication system', 'The C signal appears to be the polypity product of the csgA gene', '初步结果表明四个未来工作的方向','首先,csgA的随机诱变,然后是发育突变体的DNA测序,有望确定蛋白质的重要​​功能域']问题是我不知道如何导入上面的表格。
  • 那么,您面临的问题是什么?
  • 我想将每个句子放在一个单独的行中,其文件号和句子 ID 如我最初的问题中所述。我只是不知道该怎么做。我不是程序员,我是 python 新手。
  • 您的代码很难在没有看到示例文件的情况下遵循,但我建议您做的是,由于文件中的所有句子都在您的“句子”数据结构中,您可以启动一个 for 循环在“print Sentences”之后的这个数据结构上,还要在此之前将一个 lineNumber 变量初始化为零,然后循环这个结构并打印出其中的每个元素:print name, lineNumber, sentence。

标签: python oracle-sqldeveloper rows tabular


【解决方案1】:

正如其他人指出的那样,遵循您的代码非常困难。我认为此代码将根据您的预期输出和我们可以看到的内容执行您想要的操作。不过,我可能会走得很远,因为我们看不到您正在使用的文件。我对你的代码的一部分感到特别困扰,我看不到足以重构,但感觉显然是错误的。如下所示。

import glob

for filename in glob.glob('awardsFile/awd_1990_00/*.txt'):
    fh = open(filename, 'r')
    abstract = fh.read().split(':')[-1]
    fh.seek(0)  # reset file pointer
    # See comments below
    for line in fh:
        if line.find('File') != -1:
            absID = line[14:]
            print absID
        if line.find('NSF Org') != -1:
            print line[14:].split()
    # End see comments
    fh.close()
    concat_abstract = ''.join(abstract.replace('\n', '').split())
    for s_id, sentence in enumerate(concat_abstract.split('.')):
        # Adjust numeric width arguments to prettify table
        print absID.ljust(15),
        print '{:06d}'.format(s_id).ljust(15),
        print sentence

在标记的部分中,您正在搜索文件中字符串“File”和“NSF Org”的最后一次出现(无论您是否有意,因为循环将继续覆盖您的变量(只要它们出现),然后对该行之后的第 15 个字符执行某些操作。没有看到文件,不可能说怎么做,但我可以告诉你有更好的方法。它可能涉及将整个文件作为一个字符串搜索(或者至少是它的第一部分,如果它在其标题中),而不是循环遍历它。

另外,请注意我是如何压缩您的代码的。您将很多东西存储在根本不使用的变量中,并收集了很多散布状态的杂物。要了解第 N 行的作用,我必须继续向前看第 N+5 行并返回第 N-34 到 N-17 行以检查变量。这会产生很多远距离动作,出于所引用的原因,最好避免这种情况。在较小的版本中,您可以看到我如何在仅使用一次的地方替换字符串文字并立即调用 print 语句,而不是将结果存储起来以备后用。结果通常更简洁易懂。

【讨论】:

  • 我的数据集:kdd.ics.uci.edu/databases/nsfabs/nsfawards.html(第 1、2 和 3 部分)。我想通读包含子文件夹的 3 个部分。我试过这个: Path ='C:\myDataset' for(path,dirs,files)in os.walk('C:\mydataset'):#if i replace by对于 os.walk(Path) 中的文件,路径我收到错误---------- ----------------------------------------当我将它添加到我的代码中时不工作
猜你喜欢
  • 2016-07-15
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2021-03-06
  • 1970-01-01
  • 2015-06-02
相关资源
最近更新 更多