我正在使用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()
Run Code Online (Sandbox Code Playgroud)
那么,为什么我们使用PunktSentenceTokenizer.标记为A和B的行中发生了什么.我的意思是有一个训练文本,另一个是示例文本,但是需要两个数据集才能获得词性标记.
线标记为A和B是我无法理解.
PS:我确实试过看NLTK书,但无法理解PunktSentenceTokenizer的实际用途是什么
在我的优化任务中,我发现内置的split()方法比re.split()等效快了大约40%.
虚拟基准(易于复制 - 粘贴):
import re, time, random
def random_string(_len):
letters = "ABC"
return "".join([letters[random.randint(0,len(letters)-1)] for i in range(_len) ])
r = random_string(2000000)
pattern = re.compile(r"A")
start = time.time()
pattern.split(r)
print "with re.split : ", time.time() - start
start = time.time()
r.split("A")
print "with built-in split : ", time.time() - start
Run Code Online (Sandbox Code Playgroud)
为何如此区别?
我想运行nltk punkt来分割句子.没有训练模型所以我单独训练模型,但我不确定我使用的训练数据格式是否正确.
我的训练数据是每行一个句子.我无法找到任何关于此的文档,只有这个帖子(https://groups.google.com/forum/#!topic/nltk-users/bxIEnmgeCSM)提供了有关培训数据格式的一些信息.
nltk punkt句子标记化器的正确训练数据格式是什么?