Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PunktSentenceTokenizer在NLTK中的使用_Python_Nlp_Nltk - Fatal编程技术网

Python PunktSentenceTokenizer在NLTK中的使用

Python PunktSentenceTokenizer在NLTK中的使用,python,nlp,nltk,Python,Nlp,Nltk,我正在使用NLTK学习自然语言处理。 我使用了PunktSentenceTokenizer发现了这段代码,在给定的代码中,我无法理解它的实际用法。代码如下所示: import nltk from nltk.corpus import state_union from nltk.tokenize import PunktSentenceTokenizer train_text = state_union.raw("2005-GWBush.txt") sample_text = state_uni

我正在使用NLTK学习自然语言处理。 我使用了
PunktSentenceTokenizer
发现了这段代码,在给定的代码中,我无法理解它的实际用法。代码如下所示:

import nltk
from nltk.corpus import state_union
from nltk.tokenize import PunktSentenceTokenizer

train_text = state_union.raw("2005-GWBush.txt")
sample_text = state_union.raw("2006-GWBush.txt")

custom_sent_tokenizer = PunktSentenceTokenizer(train_text) #A

tokenized = custom_sent_tokenizer.tokenize(sample_text)   #B

def process_content():
try:
    for i in tokenized[:5]:
        words = nltk.word_tokenize(i)
        tagged = nltk.pos_tag(words)
        print(tagged)

except Exception as e:
    print(str(e))


process_content()
那么,我们为什么要使用PunkSentenceTokenizer呢。在标记A和B的行中发生了什么。我的意思是有一个训练文本和另一个示例文本,但是需要两个数据集才能得到词性标记

标记为
A
B
的行是我无法理解的


PS:我确实试图查看NLTK书籍,但无法理解PunkSentenceTokenizer的真正用途是什么

PunkSentenceTokenizer
是一种必须经过训练才能使用的句子边界检测算法[1]。NLTK已经包括一个预先训练过的PunktSentenceTokenizer版本

因此,如果在没有任何参数的情况下使用初始化标记器,它将默认为预先训练的版本:

In [1]: import nltk
In [2]: tokenizer = nltk.tokenize.punkt.PunktSentenceTokenizer()
In [3]: txt = """ This is one sentence. This is another sentence."""
In [4]: tokenizer.tokenize(txt)
Out[4]: [' This is one sentence.', 'This is another sentence.']
您还可以提供自己的培训数据,以便在使用标记器之前对其进行培训。Punkt标记器使用无监督算法,这意味着您只需使用常规文本对其进行训练

custom\u sent\u tokenizer=punktencetokenizer(训练文本)

对于大多数情况,使用预先培训过的版本是完全可以的。因此,您可以简单地初始化标记器,而不提供任何参数

那么“这一切与词性标注有什么关系”?NLTK POS标记器可用于标记化句子,因此,在进行POS标记之前,您需要将文本分解为句子和单词标记

[1] 吻和斯特伦克,”

PunktSentenceTokenizer
是默认句子标记器的抽象类,即NLTK中提供的
sent\u tokenize()
。这是一个实践。看

给出一个有多个句子的段落,例如:

>>> from nltk.corpus import state_union
>>> train_text = state_union.raw("2005-GWBush.txt").split('\n')
>>> train_text[11]
u'Two weeks ago, I stood on the steps of this Capitol and renewed the commitment of our nation to the guiding ideal of liberty for all. This evening I will set forth policies to advance that ideal at home and around the world. '
您可以使用
sent\u tokenize()

sent_tokenize()
使用了
nltk_data/tokenizers/punkt/english.pickle
中预先训练好的模型。您还可以指定其他语言,NLTK中具有预训练模型的可用语言列表如下:

alvas@ubi:~/nltk_data/tokenizers/punkt$ ls
czech.pickle     finnish.pickle  norwegian.pickle   slovene.pickle
danish.pickle    french.pickle   polish.pickle      spanish.pickle
dutch.pickle     german.pickle   portuguese.pickle  swedish.pickle
english.pickle   greek.pickle    PY3                turkish.pickle
estonian.pickle  italian.pickle  README
给定另一种语言的文本,请执行以下操作:

>>> german_text = u"Die Orgellandschaft Südniedersachsen umfasst das Gebiet der Landkreise Goslar, Göttingen, Hameln-Pyrmont, Hildesheim, Holzminden, Northeim und Osterode am Harz sowie die Stadt Salzgitter. Über 70 historische Orgeln vom 17. bis 19. Jahrhundert sind in der südniedersächsischen Orgellandschaft vollständig oder in Teilen erhalten. "

>>> for sent in sent_tokenize(german_text, language='german'):
...     print sent
...     print '---------'
... 
Die Orgellandschaft Südniedersachsen umfasst das Gebiet der Landkreise Goslar, Göttingen, Hameln-Pyrmont, Hildesheim, Holzminden, Northeim und Osterode am Harz sowie die Stadt Salzgitter.
---------
Über 70 historische Orgeln vom 17. bis 19. Jahrhundert sind in der südniedersächsischen Orgellandschaft vollständig oder in Teilen erhalten. 
---------

要训练您自己的punkt模型,请参见和

您可以参考下面的链接,以获得有关PunktSentenceTokenizer用法的更多信息。 它生动地解释了为什么在您的案例中使用PunktSentenceTokenizer而不是sent-tokenize()


甚至不在其他文本数据上对其进行训练,其工作原理与预训练时相同。

注意,
PunktSentenceTokenizer
不训练标记器,而是加载预训练模型。要训练一个新的标记器,请使用
PunktTrainer
@alvas。它确实训练了标记器。如果train\u text参数不是None,它将调用标记器的train模块
如果train\u text:self.train(train\u text,verbose,finalize=True)
是的,我正要打字,打字太慢了。或者使用
PunktSentenceTokenizer.train()
BTW,不是我否决了你的答案。它可能是一些巨魔。是的,这是相关的,切中要害的。应该添加两件事:(a)Punkt标记器使用无监督的算法,这意味着您只需使用常规文本对其进行训练。(b) 所有这些都与词性标记有什么关系,正如OP所问的:NLTK词性标记器与标记化句子一起工作,因此在进行词性标记之前,您需要将文本分解为句子和单词标记。谢谢您的回答。我不知道为什么有人对此投了反对票。无论如何,这些都是预先训练好的模型。但是你能告诉我如果我使用自己的训练集,
PunktSentenceTokenizer
的工作将如何改变吗。我指的是在
训练中实际发生的情况
@Arquam在训练中,模型参数是根据训练数据中观察到的情况设置的。代码源
>>> german_text = u"Die Orgellandschaft Südniedersachsen umfasst das Gebiet der Landkreise Goslar, Göttingen, Hameln-Pyrmont, Hildesheim, Holzminden, Northeim und Osterode am Harz sowie die Stadt Salzgitter. Über 70 historische Orgeln vom 17. bis 19. Jahrhundert sind in der südniedersächsischen Orgellandschaft vollständig oder in Teilen erhalten. "

>>> for sent in sent_tokenize(german_text, language='german'):
...     print sent
...     print '---------'
... 
Die Orgellandschaft Südniedersachsen umfasst das Gebiet der Landkreise Goslar, Göttingen, Hameln-Pyrmont, Hildesheim, Holzminden, Northeim und Osterode am Harz sowie die Stadt Salzgitter.
---------
Über 70 historische Orgeln vom 17. bis 19. Jahrhundert sind in der südniedersächsischen Orgellandschaft vollständig oder in Teilen erhalten. 
---------
def process_content(corpus):

    tokenized = PunktSentenceTokenizer().tokenize(corpus)

    try:
        for sent in tokenized:
            words = nltk.word_tokenize(sent)
            tagged = nltk.pos_tag(words)
            print(tagged)
    except Exception as e:
        print(str(e))

process_content(train_text)