Python - IndexError:列表索引超出范围(主题建模)

时间:2017-07-12 08:45:19

标签: python lda topic-modeling

我遇到过很多类似的问题。但是,提供的答案似乎对我没有帮助。

我试图对8000篇媒体文章进行主题建模分析。但是我收到了这个错误:

Traceback (most recent call last):
  File "extract.py", line 23, in <module>
    if re.compile('^(.*?) - \d{2} [a-zA-Z]{3}. \d{4}$').match(lines[1]):
IndexError: list index out of range

第23行所指的是:

if re.compile('^(.*?) - \d{2} [a-zA-Z]{3}. \d{4}$').match(lines[1]):
    media = lines[1].split(' - ')[0].replace('*', '')
    article = article.replace('\n' + lines[1], '')
    if article.find(media) > -1:
        containsMediaName.write(filename + '\n')

有人能帮助我以某种方式忽略这个错误吗?

完整代码

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import re
import string
import textract
import unicodedata
from unidecode import unidecode

if not os.path.isdir('./raw'):
    os.mkdir('./raw')

names = open('./deleted-names.txt', 'w')
containsMediaName = open('./contains-media-name.txt', 'w')

for filename in os.listdir('./data'):
    article = unidecode(textract.process('./data/' + filename).decode('utf-8'))

    article = re.sub('<<', '', article)
    article = re.sub('>>', '', article)
    lines = article.split('\n')
    if re.compile('^(.*?) - \d{2} [a-zA-Z]{3}. \d{4}$').match(lines[1]):
        media = lines[1].split(' - ')[0].replace('*', '')
        article = article.replace('\n' + lines[1], '')
        if article.find(media) > -1:
            containsMediaName.write(filename + '\n')

    if re.match('^Pagina \d{1,5}$', lines[2]):
        article = article.replace('\n' + lines[2], '')

    article = re.sub('\nCopyright(.*?)Alle rechten voorbehouden\n', '\n', article)
    article = re.sub('\n\(Foto:(.*?)\)\n', '\n', article)
    article = re.sub('\n\(Fotograaf:(.*?)\)\n', '\n', article)
    article = article.strip().rstrip(' \t\r\n\0')

    lines = article.split('\n')
    name = lines.pop()
    if len(name.split(' ')) <= 3:
        article = re.sub('\n' + name, '', article)
        names.write(name + ',' + filename + '\n')

        initials = '('
        for namePart in name.split(' '):
            initials += namePart[0]
        initials += ')'

        article = article.strip()
        if(article.endswith(initials)):
            article = re.sub(re.escape(initials), '', article)

    article = article.strip().rstrip(' \t\r\n\0')
    f = open('./raw/' + filename + '.txt', 'w')
    f.write(article)
    f.close()

names.close()
containsMediaName.close()

1 个答案:

答案 0 :(得分:0)

失败的行正在尝试对其中的某些文本执行匹配。

那里的正则表达式代码寻找匹配(可能)符合以下测试模式的文本:

something - 10 marc 1974
something else - 11 apri 2001
another match - 99 xxxx 2004

这些看起来有点像文章标题的格式?其余代码似乎试图从日期中删除文章名称。

有趣的是,(我猜)是一个日期匹配的正则表达式代码似乎与3个字符的月份标识符匹配,加上一个加法字符[a-zA-Z]{3}.这似乎是一个非常类型的日期格式 - 您的数据适合这种模式?

如果是这样,那么很好,但如果没有,你可能想要在卷曲括号{3}后删除全站,然后编辑正则表达式:

'^(.*?) - \d{2} [a-zA-Z]{3} \d{4}$'

假设您的日期采用更传统的dd Mon yyyy格式。

正如其他人所说,您可能还想探索更优雅的异常处理,以涵盖代码未找到日期匹配的情况,或者行对象包含少于2个元素的情况。

这可能是谷歌搜索"exception handling in python"

但是,为了让你起步和运行,像

这样简单
try:
    if re.compile('^(.*?) - \d{2} [a-zA-Z]{3}. \d{4}$').match(lines[1]):
        media = lines[1].split(' - ')[0].replace('*', '')
        article = article.replace('\n' + lines[1], '')
        if article.find(media) > -1:
            containsMediaName.write(filename + '\n')
except:
    print ( "The length of the lines object is {ln}".format(ln=len(lines)) )

如果您在索引1(即第二个元素)处拉取元素的尝试不存在,那将报告行对象的长度 - 这是错误消息建议的问题。

[edit]看到你的代码,看起来split函数找不到你要提供的任何数据的任何换行符,这在尝试从行中获取第1个元素时产生错误。我还注意到你正在阅读德语(?)所以我对正则表达式重新格式化的评论可能不相关。