【问题标题】:List index out of range with stanford-nlp使用 stanford-nlp 列出超出范围的索引
【发布时间】:2022-07-07 22:31:28
【问题描述】:

我正在尝试从一个大的 .txt 文件中删除所有空白行,但无论我使用什么方法,它总是返回此回溯:

Traceback (most recent call last):
  File "C:\Users\svp12\PycharmProjects\practiques\main.py", line 53, in <module>
    doc = nlp(texts[line])
IndexError: list index out of range

如果我不删除这些空格,那么我会在随后的 2 个 for 循环中得到 IndexErrors(或者至少我认为这是原因),这就是我使用 try/except 的原因:

try:
    for word in doc.sentences[0].words:
        noun.append(word.text)
        lemma.append(word.lemma)
        pos.append(word.pos)
        xpos.append(word.xpos)
        deprel.append(word.deprel)
except IndexError:
    errors += 1
    pass

我希望能够删除所有空白行,而不必避免像这样的 IndexErrors,关于如何修复的任何想法?

这是整个代码:

import io
import stanza
import os


def linecount(filename):
    ffile = open(filename, 'rb')
    lines = 0
    buf_size = 1024 * 1024
    read_f = ffile.read

    buf = read_f(buf_size)
    while buf:
        lines += buf.count(b'\n')
        buf = read_f(buf_size)

    return lines


errors = 0

with io.open('@_Calvia_2018-01-01_2022-04-01.txt', 'r+', encoding='utf-8') as f:
    text = f.read()

# replacing eos with \n, numbers and symbols
texts = text.replace('eos', '.\n')
texts = texts.replace('0', ' ').replace('1', ' ').replace('2', ' ').replace('3', ' ').replace('4', ' ')\
    .replace('5', ' ').replace('6', ' ').replace('7', ' ').replace('8', ' ').replace('9', ' ').replace(',', ' ')\
    .replace('"', ' ').replace('·', ' ').replace('?', ' ').replace('¿', ' ').replace(':', ' ').replace(';', ' ')\
    .replace('-', ' ').replace('!', ' ').replace('¡', ' ').replace('.', ' ').splitlines()

os.system("sed -i \'/^$/d\' @_Calvia_2018-01-01_2022-04-01.txt")            # removing empty lines to avoid IndexError

nlp = stanza.Pipeline(lang='ca')

nouns = []
lemmas = []
poses = []
xposes = []
heads = []
deprels = []

total_lines = linecount('@_Calvia_2018-01-01_2022-04-01.txt') - 1

for line in range(50):                                                  # range should be total_lines which is 6682
    noun = []
    lemma = []
    pos = []
    xpos = []
    head = []
    deprel = []
    # print('analyzing: '+str(line+1)+' / '+str(len(texts)), end='\r')
    doc = nlp(texts[line])
    try:
        for word in doc.sentences[0].words:
            noun.append(word.text)
            lemma.append(word.lemma)
            pos.append(word.pos)
            xpos.append(word.xpos)
            deprel.append(word.deprel)
    except IndexError:
        errors += 1
        pass
    try:
        for word in doc.sentences[0].words:
            head.extend([lemma[word.head-1] if word.head > 0 else "root"])
    except IndexError:
        errors += 1
        pass
    nouns.append(noun)
    lemmas.append(lemma)
    poses.append(pos)
    xposes.append(xpos)
    heads.append(head)
    deprels.append(deprel)

print(nouns)
print(lemmas)
print(poses)
print(xposes)
print(heads)
print(deprels)

print("errors: " + str(errors))                                                         # wierd, seems to be range/2-1

作为一个附带问题,是否值得仅为此行导入 os? (这是删除空行的那个

os.system("sed -i \'/^$/d\' @_Calvia_2018-01-01_2022-04-01.txt")

【问题讨论】:

  • @nonDucor 那我该如何解决呢?

标签: python stanford-nlp stanza


【解决方案1】:

因为文本没有 50 行,你为什么要硬编码 50

如果你只需要删除空行,你只需要text = text.replace("\n\n","\n")

如果您需要删除只是空格的行,您可以这样做:

text = '\n'.join(line.rstrip() for line in text.split('\n') if line.strip())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    相关资源
    最近更新 更多