NLTK自定义分类语料库不读取文件

时间:2018-02-15 15:20:54

标签: python nltk corpus nltk-trainer

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

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

代码:

from nltk.corpus import CategorizedPlaintextCorpusReader

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

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

e.g。 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'

2 个答案:

答案 0 :(得分:3)

我正在使用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,这将是解决它的好方法,因此它与操作系统无关并且您不会使用正则表达式转义斜杠与文件系统分隔符混合。

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

答案 1 :(得分:1)

在我看来,你的

有些奇怪
cat_pattern=r'(neg|pos)/.*'

因为你使用的是基于MsDOS的系统(Windows,我猜),并且文件夹包含的内容是 \,而不是/ (或者我没有得到它)​​