2

我有一个自定义语料库,它使用我需要进行一些分类的数据创建。我有与 movie_reviews 语料库包含的格式相同的数据集。根据 nltk 文档,我使用以下代码访问 movie_reviews 语料库。无论如何,是否可以将任何自定义语料库添加到 nltk_data/corpora 目录并访问该语料库,就像我们访问现有语料库一样。

    import nltk
    from nltk.corpus import movie_reviews

    documents = [(list(movie_reviews.words(fileid)), category)
         for category in movie_reviews.categories()
         for fileid in movie_reviews.fileids(category)]
4

3 回答 3

4

虽然您可以破解 nltk 以使您的语料库看起来像一个内置的 nltk 语料库,但这是错误的做法。nltk提供了丰富的“语料库阅读器”集合,您可以使用它们从您保存它们的任何地方读取您的语料库,而无需将它们移动到目录nltk_data或破解nltk源代码。nltk 自己的语料库在幕后使用相同的语料库阅读器,因此您的阅读器将拥有等效内置语料库的所有方法和行为。

让我们看看movie_reviews语料库是如何定义的nltk/corpora/__init__.py

movie_reviews = LazyCorpusLoader(
    'movie_reviews', CategorizedPlaintextCorpusReader,
    r'(?!\.).*\.txt', cat_pattern=r'(neg|pos)/.*',
    encoding='ascii')

您可以忽略该LazyCorpusLoader部分;它用于提供您的程序很可能永远不会使用的语料库。其余显示电影评论语料库是用 a 读取的CategorizedPlaintextCorpusReader,它的文件都以 结尾.txt,并且评论通过在子目录pos和中进行分类neg。最后,语料库编码是ascii。因此,像这样定义您自己的语料库(根据需要更改值):

mycorpus = nltk.corpus.reader.CategorizedPlaintextCorpusReader(
    r"/home/user/path/to/my_corpus",
    r'(?!\.).*\.txt', 
    cat_pattern=r'(neg|pos)/.*',
    encoding="ascii")

就是这样; 您现在可以调用mycorpus.words(),mycorpus.sents(categories="neg")等,就好像这是 nltk 提供的语料库一样。

于 2017-02-11T17:41:30.770 回答
1

首先将新语料库中的实际数据放入您的nltk_data/corpora/目录中。然后你必须编辑__init__.py文件nltk.corpus。您可以通过执行以下操作找到此文件的路径:

import nltk
print(nltk.corpus.__file__)

在文本编辑器中打开此文件,您会看到大部分文件都在创建LazyCorpusLoader对象并将它们分配给全局变量。

例如,一个部分可能如下所示:

....
verbnet = LazyCorpusLoader(
    'verbnet', VerbnetCorpusReader, r'(?!\.).*\.xml')
webtext = LazyCorpusLoader(
    'webtext', PlaintextCorpusReader, r'(?!README|\.).*\.txt', encoding='ISO-8859-2')
wordnet = LazyCorpusLoader(
    'wordnet', WordNetCorpusReader,
    LazyCorpusLoader('omw', CorpusReader, r'.*/wn-data-.*\.tab', encoding='utf8'))  
....

为了添加一个新的语料库,您只需以与上述示例相同的格式向该文件添加一个新行。因此,如果您有一个命名的语料库movie_reviews并且保存了数据,nltk_data/corpora/movie_reviews那么您需要添加如下一行:

movie_reviews = LazyCorpusLoader('movie_reviews', .... )

可以在此处的文档中找到 LazyCorpusLoader 的其他参数。

然后您只需保存此文件,然后您应该可以执行以下操作:

from nltk.corpus import movie_reviews
于 2017-02-11T16:13:57.500 回答
1

好的,所以我对提供的解决方案有点问题,我发现对我有用的简单方法是首先在“语料库”目录中创建我的文件夹和子文件夹,然后编辑init .py 文档。

所以在我的例子中,我创建的语料库是 vc,子文件夹是 audio_them、audio_us、video_them、video_us

vc = LazyCorpusLoader(
    'vc', CategorizedPlaintextCorpusReader,
    r'(?!\.).*\.txt', 
cat_pattern = r'(audio_them|audio_us|video_them|video_us)/.$
    encoding="ascii")
于 2017-11-18T16:21:21.110 回答