如何在 nltk 中将自定义语料库添加到本地机器
How to add a custom corpora to local machine in nltk
我有一个自定义语料库,它使用我需要进行一些分类的数据创建。我的数据集与 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)]
首先将新语料库中的实际数据放入 nltk_data/corpora/
目录。然后您必须为 nltk.corpus
编辑 __init__.py
文件。您可以通过以下方式找到此文件的路径:
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 的其他参数 here。
然后您只需保存此文件,然后您就可以执行以下操作:
from nltk.corpus import movie_reviews
虽然您可以破解 nltk 使您的语料库看起来像 built-in nltk 语料库,但这是错误的做法。 nltk
提供了丰富的 "corpus readers" 集合,您可以使用它们从保存它们的任何地方读取语料库,而无需将它们移动到 nltk_data
目录或破解 nltk
源. nltk 自己的语料库在幕后使用相同的语料库 reader,因此您的 reader 将具有等效 built-in 语料库的所有方法和行为。
让我们看看 movie_reviews
语料库在 nltk/corpora/__init__.py
中是如何定义的:
movie_reviews = LazyCorpusLoader(
'movie_reviews', CategorizedPlaintextCorpusReader,
r'(?!\.).*\.txt', cat_pattern=r'(neg|pos)/.*',
encoding='ascii')
LazyCorpusLoader
部分可以忽略;它用于提供您的程序很可能永远不会使用的语料库。其余部分显示电影评论语料库是用 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 提供的语料库一样。
好的,所以我对提供的解决方案有点问题,我发现对我有用的简单方法是首先在 'corpora' 目录中创建我的文件夹和子文件夹,然后编辑 init.py doc.
所以在我的例子中,我创建的语料库是 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")
我有一个自定义语料库,它使用我需要进行一些分类的数据创建。我的数据集与 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)]
首先将新语料库中的实际数据放入 nltk_data/corpora/
目录。然后您必须为 nltk.corpus
编辑 __init__.py
文件。您可以通过以下方式找到此文件的路径:
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 的其他参数 here。
然后您只需保存此文件,然后您就可以执行以下操作:
from nltk.corpus import movie_reviews
虽然您可以破解 nltk 使您的语料库看起来像 built-in nltk 语料库,但这是错误的做法。 nltk
提供了丰富的 "corpus readers" 集合,您可以使用它们从保存它们的任何地方读取语料库,而无需将它们移动到 nltk_data
目录或破解 nltk
源. nltk 自己的语料库在幕后使用相同的语料库 reader,因此您的 reader 将具有等效 built-in 语料库的所有方法和行为。
让我们看看 movie_reviews
语料库在 nltk/corpora/__init__.py
中是如何定义的:
movie_reviews = LazyCorpusLoader(
'movie_reviews', CategorizedPlaintextCorpusReader,
r'(?!\.).*\.txt', cat_pattern=r'(neg|pos)/.*',
encoding='ascii')
LazyCorpusLoader
部分可以忽略;它用于提供您的程序很可能永远不会使用的语料库。其余部分显示电影评论语料库是用 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 提供的语料库一样。
好的,所以我对提供的解决方案有点问题,我发现对我有用的简单方法是首先在 'corpora' 目录中创建我的文件夹和子文件夹,然后编辑 init.py doc.
所以在我的例子中,我创建的语料库是 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")