用NLTK创build一个新的语料库
我认为,我的题目的答案往往是去阅读文件,但我跑过NLTK书,但它没有给出答案。 我对python很陌生。
我有一堆.txt
文件,我希望能够使用NLTK为语料库nltk_data
提供的语料库nltk_data
。
我试过PlaintextCorpusReader
但我不能得到比:
>>>import nltk >>>from nltk.corpus import PlaintextCorpusReader >>>corpus_root = './' >>>newcorpus = PlaintextCorpusReader(corpus_root, '.*') >>>newcorpus.words()
如何使用punkt分割新的句子句子? 我尝试使用punkt函数,但punkt函数无法读取PlaintextCorpusReader
类?
你还可以引导我如何将分段数据写入文本文件?
编辑:这个问题有一次赏金,它现在有第二个赏金。 请参阅赏金箱中的文字。
我认为PlaintextCorpusReader
已经用punkt分词器分割input,至less如果你的input语言是英语的话。
PlainTextCorpusReader的构造函数
def __init__(self, root, fileids, word_tokenizer=WordPunctTokenizer(), sent_tokenizer=nltk.data.LazyLoader( 'tokenizers/punkt/english.pickle'), para_block_reader=read_blankline_block, encoding='utf8'):
你可以通过阅读器一个单词和句子标记,但对于后者,默认已经是nltk.data.LazyLoader('tokenizers/punkt/english.pickle')
。
对于单个string,将使用一个标记器,如下所述( 在这里解释,punkt标记器的第5节)。
>>> import nltk.data >>> text = """ ... Punkt knows that the periods in Mr. Smith and Johann S. Bach ... do not mark sentence boundaries. And sometimes sentences ... can start with non-capitalized words. i is a good variable ... name. ... """ >>> tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') >>> tokenizer.tokenize(text.strip())
经过了几年的工作,这里是最新的教程
如何创build一个文本文件目录的NLTK语料库?
主要想法是使用nltk.corpus.reader包。 如果你有一个英文文本文件的目录,最好使用PlaintextCorpusReader 。
如果你有一个如下所示的目录:
newcorpus/ file1.txt file2.txt ...
简单地使用这些代码行,你可以得到一个语料库:
import os from nltk.corpus.reader.plaintext import PlaintextCorpusReader corpusdir = 'newcorpus/' # Directory of corpus. newcorpus = PlaintextCorpusReader(corpusdir, '.*')
注意: PlaintextCorpusReader
将使用默认的nltk.tokenize.sent_tokenize()
和nltk.tokenize.word_tokenize()
将文本分割成句子和单词,这些function是为英语而build立的,它可能nltk.tokenize.word_tokenize()
用于所有的语言。
以下是创buildtesting文本文件的完整代码,以及如何使用NLTK创build语料库以及如何访问不同级别的语料库:
import os from nltk.corpus.reader.plaintext import PlaintextCorpusReader # Let's create a corpus with 2 texts in different textfile. txt1 = """This is a foo bar sentence.\nAnd this is the first txtfile in the corpus.""" txt2 = """Are you a foo bar? Yes I am. Possibly, everyone is.\n""" corpus = [txt1,txt2] # Make new dir for the corpus. corpusdir = 'newcorpus/' if not os.path.isdir(corpusdir): os.mkdir(corpusdir) # Output the files into the directory. filename = 0 for text in corpus: filename+=1 with open(corpusdir+str(filename)+'.txt','w') as fout: print>>fout, text # Check that our corpus do exist and the files are correct. assert os.path.isdir(corpusdir) for infile, text in zip(sorted(os.listdir(corpusdir)),corpus): assert open(corpusdir+infile,'r').read().strip() == text.strip() # Create a new corpus by specifying the parameters # (1) directory of the new corpus # (2) the fileids of the corpus # NOTE: in this case the fileids are simply the filenames. newcorpus = PlaintextCorpusReader('newcorpus/', '.*') # Access each file in the corpus. for infile in sorted(newcorpus.fileids()): print infile # The fileids of each file. with newcorpus.open(infile) as fin: # Opens the file. print fin.read().strip() # Prints the content of the file print # Access the plaintext; outputs pure string/basestring. print newcorpus.raw().strip() print # Access paragraphs in the corpus. (list of list of list of strings) # NOTE: NLTK automatically calls nltk.tokenize.sent_tokenize and # nltk.tokenize.word_tokenize. # # Each element in the outermost list is a paragraph, and # Each paragraph contains sentence(s), and # Each sentence contains token(s) print newcorpus.paras() print # To access pargraphs of a specific fileid. print newcorpus.paras(newcorpus.fileids()[0]) # Access sentences in the corpus. (list of list of strings) # NOTE: That the texts are flattened into sentences that contains tokens. print newcorpus.sents() print # To access sentences of a specific fileid. print newcorpus.sents(newcorpus.fileids()[0]) # Access just tokens/words in the corpus. (list of strings) print newcorpus.words() # To access tokens of a specific fileid. print newcorpus.words(newcorpus.fileids()[0])
最后,要读取文本目录并用其他语言创build一个NLTK语料库,首先必须确保您有一个Python可调用的单词标记化和句子标记化模块,它们接受string/碱基stringinput并生成如下输出:
>>> from nltk.tokenize import sent_tokenize, word_tokenize >>> txt1 = """This is a foo bar sentence.\nAnd this is the first txtfile in the corpus.""" >>> sent_tokenize(txt1) ['This is a foo bar sentence.', 'And this is the first txtfile in the corpus.'] >>> word_tokenize(sent_tokenize(txt1)[0]) ['This', 'is', 'a', 'foo', 'bar', 'sentence', '.']
>>> import nltk >>> from nltk.corpus import PlaintextCorpusReader >>> corpus_root = './' >>> newcorpus = PlaintextCorpusReader(corpus_root, '.*') """ if the ./ dir contains the file my_corpus.txt, then you can view say all the words it by doing this """ >>> newcorpus.words('my_corpus.txt')