【问题标题】:NLTK custom categorized corpus not reading filesNLTK 自定义分类语料库不读取文件
【发布时间】:2026-01-23 17:15:01
【问题描述】:

我已经创建了自己的语料库,类似于 nltk 中的 movie_reviews 语料库(按 neg|pos 分类。)

在 neg 和 pos 文件夹中是 txt 文件。

代码:

from nltk.corpus import CategorizedPlaintextCorpusReader

    mr = CategorizedPlaintextCorpusReader('C:\mycorpus', r'(?!\.).*\.txt',
            cat_pattern=r'(neg|pos)/.*')

当我尝试读取其中一个文件或与之交互时,我无法做到。

例如len(mr.categories()) 运行,但不返回任何内容:

>>>

我已阅读此处有关自定义分类语料库的多个文档和问题,但我仍然无法使用它们。

完整代码:

import nltk
from nltk.corpus import CategorizedPlaintextCorpusReader

mr = CategorizedPlaintextCorpusReader('C:\mycorpus', r'(?!\.).*\.txt',
        cat_pattern=r'(neg|pos)/.*')

len(mr.categories())

我最终希望能够针对我的数据执行朴素贝叶斯算法,但我无法读取内容。

路径: C:\mycorpus\pos

C:\mycorpus\neg

pos 文件中有一个“cv.txt”,而 neg 包含一个“example.txt”

【问题讨论】:

    标签: python nltk corpus nltk-trainer


    【解决方案1】:

    我使用的是 Linux,对您的代码(带有玩具语料库文件)的以下修改对我来说可以正常工作:

    import nltk
    from nltk.corpus import CategorizedPlaintextCorpusReader
    
    import os
    
    
    mr = CategorizedPlaintextCorpusReader(
        '/home/ely/programming/nltk-test/mycorpus',
        r'(?!\.).*\.txt',
        cat_pattern=os.path.join(r'(neg|pos)', '.*')
    )
    
    print(len(mr.categories()))
    

    这表明当您在 Windows 系统上使用 / 作为文件系统分隔符时,cat_pattern 字符串存在问题。

    在我的示例中使用 os.path.join,或者在使用 Python 3 时使用 pathlib,这将是解决问题的好方法,因此它与操作系统无关,并且您不会因正则表达式转义斜线与文件系统分隔符。

    事实上,您可以在参数字符串中的所有文件系统分隔符情况下使用这种方法,并且通常是一个好习惯,以使代码可移植并避免奇怪的字符串处理技术债务。

    【讨论】:

    • 我以后肯定会用这个来避免这种情况。我正在使用 Python 3,因此您可以提供 pathlib 而不是 os.path.join 的语法吗?谢谢你的回答
    • @Yunter 该语法最好描述in the docs。本质上,您将创建一个pathlib.Path 对象,然后二进制运算符/ 将具有文件系统路径解析的语义,因此您可以执行Path(r'(neg|pos)') / '.*',即使它使用/ 运算符,它也可以解析它会自动为您添加到适当的文件系统分隔符。真的不比os.path好,只是类似操作的语法不同而已。请注意,您可以在 Python 2 或 Python 3 中使用os.path
    • 道歉 - 我误解了“或 pathlib,如果使用 Python 3”。使用代码中提供的“os.path.join”让我遇到了同样的问题,即不返回任何内容。我会把上面目录的内容贴出来。
    【解决方案2】:

    在我看来你的有些奇怪

    cat_pattern=r'(neg|pos)/.*'
    

    因为您使用的是基于 MsDOS 的系统(我猜是 Windows),并且文件夹包含用 \ 表示,而不是 / (或者我不明白)

    【讨论】:

    • 是的,我使用的是 Windows 操作系统。所以我应该把 '/.*' 改成 '\.*' ?
    • 或者只是 cat_pattern=os.path.join(r'(neg|pos)', '.*') 正如 Ely 上面所建议的那样。这样,您就有了一个不依赖于操作系统的解决方案
    • 感谢您的回答,我使用的是 Python 3,因此必须根据 Ely 使用 pathlib。