解析语料提取词形时 嵌套循环内报list index out of range错误
索引越界问题根因
list index out of range 报错的核心原因是:当遍历到完全空白的行(无任何有效字符,或整行只有空格/换行)时,line.split() 方法会返回长度为0的空列表,此时访问列表第0个元素就会触发越界。
这类空白行的来源通常是VRT文件的结构本身:<s>标签前后、块内容首尾的换行符会被BeautifulSoup的get_text()方法一并提取,拆分行时就会生成无实际词条的空行。在循环外部手动测试时因为选取的都是有实际内容的样本行,不会碰到空列表的情况,所以不会触发报错。
解决方案
- 遍历每行时增加空列表判断,直接跳过无有效内容的行
- 优化文件读取逻辑,使用
with上下文管理器避免文件句柄泄漏,指定编码兼容不同系统的文件格式 - 匹配VRT的制表符分隔规则拆分字段,避免按任意空白拆分导致的词形被误切的问题
修正后可直接运行的代码
from bs4 import BeautifulSoup # 读取VRT源文件 with open('MeinWikiKorpus.vrt', 'r', encoding='utf-8') as source_f: soup = BeautifulSoup(source_f.read(), 'html.parser') # 提取所有句子块的纯文本 sentence_blocks = [block.get_text() for block in soup.find_all('s')] # 输出提取到的所有词形 with open('extracted_wordforms.txt', 'w', encoding='utf-8') as output_f: for block in sentence_blocks: for line in block.splitlines(): # 先去除行首尾的空白,再按制表符拆分列 columns = line.strip().split('\t') # 跳过空行 if not columns or not columns[0].strip(): continue output_f.write(f"{columns[0].strip()}\n")
补充说明:如果你的VRT语料存在换行缩进、标签属性换行的情况,上述拆分逻辑会自动过滤掉无有效内容的行,不会再触发索引越界报错;如果后续需要保留词性标注信息,只需要从拆分后的
columns列表中取对应索引的字段即可。
内容的提问来源于stack exchange,提问作者Emanuel K.
相关产品推荐
相关产品推荐

