2012-04-04 48 views
0

我有数百个文件包含我想要与NLTK一起使用的文本。这里有一个这样的文件:从自定义格式的数据创建语料库

 
বে,বচা ইয়াণ্ঠা,র্চা ঢার্বিত তোখাটহ নতুন, অ প্রবঃাশিত। 
তবে ' এ বং মুশায়েরা ' পত্রিব্যায় প্রকাশিত তিনটি লেখাই বইযে 
সংব্যজান ব্যরার জনা বিশেষভাবে পরিবর্ধিত। পাচ দাপনিকেব 
ড:বন নিয়ে এই বই তৈরি বাবার পরিব্যল্পনাও ম্ভ্রাসুনতন 
সামন্তেরই। তার আর তার সহকারীদেব নিষ্ঠা ছাডা অল্প সময়ে 
এই বই প্রব্যাশিত হতে পারত না।,তাঁদের সকলকে আমাধ 
নমস্কার জানাই। 
বতাব্যাতা শ্রাবন্তা জ্জাণ্ণিক 
জানুয়ারি ২ ণ্ট ণ্ট ৮ 
Total characters: 378 

注意,每一行都不会包含一个新的句子。相反,句子终结者 - 相当于英语的时期 - 就是'。'符号。

有人可以帮我创建我的语料库吗?如果导入到变量MyData中,我需要访问MyData.words()和MyData.sents()。另外,最后一行不应出现在语料库中(它只包含一个字符数)。

请注意,我将需要立即对所有文件运行数据操作。

在此先感谢!

+0

也许,如果你解释什么_corpus_是... – C2H5OH 2012-04-04 07:19:46

+0

一个语料库是一个大文本体。我打算使用NLTK语料库阅读器(如果需要,也可以自己写一个)。使用NLTK的人会知道语料库是什么。 – 2012-04-04 07:31:24

+0

@ C2H5OH http://en.wikipedia.org/wiki/Text_corpus – javanna 2012-04-04 08:55:03

回答

1

您不需要自己输入文件或提供wordssents方法。 在您的语料库中阅读PlaintextCorpusReader,它会为您提供这些内容。 语料库读取器构造函数接受文件的路径和文件名模式的参数,以及输入编码(确保指定它)。

该构造函数还具有用于句子和单词标记化函数的可选参数,因此您可以将它传递给自己的方法以将文本分解为句子。如果单词和句子检测非常简单,即,如果|字符还有其他用途,您可以从nltk的RegexpTokenizer系列配置一个标记化函数,也可以从头开始编写自己的标记函数。 (在你自己写之前,学习文档和代码,或者写一个存根来找出它被称为什么样的输入。)

如果识别句子的边界不是微不足道的,你可以稍后弄清楚如何训练nltk的PunktSentenceTokenizer,它使用一个不受欢迎的统计算法来了解句子结束符的哪些用法实际上结束了一个句子。

如果您的语料库阅读器的配置相当复杂,您可能会发现创建专门用于PlaintextCorpusReader的类很有用。但大部分时间没有必要。看一看NLTK代码,看看gutenberg语料库是如何实现的:它只是一个PlainTextCorpusReader实例,它具有适当的构造函数参数。

+0

非常感谢!这应该是非常有帮助的。我会尝试一下并回复你。句子规则很简单 - 它总是| |字符,没有其他用途。所以我认为我不需要培训PunktSentenceTokenizer。 – 2012-04-09 06:27:41

0

1)摆脱最后一行非常简单。

f = open('corpus.txt', 'r') 
for l in f.readlines()[:-1]: 
    .... 

for循环中的[:-1]会跳过最后一行。

2)文件对象的内置readlines()函数使用换行符作为分隔符,将文件中的内容分解成行。所以你需要编写一些代码来缓存行,直到'|'被看到。当一个'|'将缓存的行作为一个单独的句子处理,并将其放入您的MyData类中

+0

除非你知道你需要在线上随机访问,否则在itertools.islice(f,-1)中执行'l会更清晰:' – aaronasterling 2012-04-07 22:34:03