使用NLTK在Python文件的特定区域中使用sent_标记化?

使用NLTK在Python文件的特定区域中使用sent_标记化?,python,nlp,tokenize,nltk,Python,Nlp,Tokenize,Nltk,我有一个包含数千个句子的文件,我想找到包含特定字符/单词的句子 最初,我是对整个文件进行标记化(使用sent\u tokenize),然后迭代句子以查找单词。但是,这太慢了。既然我能很快找到单词的索引,我能利用这个优势吗?有没有一种方法可以仅仅标记一个单词周围的区域(例如,找出哪个句子包含一个单词) 谢谢 编辑:我使用Python并使用NLTK库。您使用的是什么平台?在unix/linux/macOS/cygwin上,可以执行以下操作: sed 's/[\.\?\!]/\n/' < myf

我有一个包含数千个句子的文件,我想找到包含特定字符/单词的句子

最初,我是对整个文件进行标记化(使用
sent\u tokenize
),然后迭代句子以查找单词。但是,这太慢了。既然我能很快找到单词的索引,我能利用这个优势吗?有没有一种方法可以仅仅标记一个单词周围的区域(例如,找出哪个句子包含一个单词)

谢谢


编辑:我使用Python并使用NLTK库。

您使用的是什么平台?在unix/linux/macOS/cygwin上,可以执行以下操作:

sed 's/[\.\?\!]/\n/' < myfile | grep 'myword'

这里有一个可能加快搜索速度的想法。您可以创建一个附加列表,在其中存储大文本中每个句子的单词计数的运行总数。使用我从Alex Martelli那里学到的生成器函数,尝试如下操作:

def running_sum(a):
  tot = 0
  for item in a:
    tot += item
    yield tot

from nltk.tokenize import sent_tokenize

sen_list = sent_tokenize(bigtext)
wc = [len(s.split()) for s in sen_list]
runningwc = list(running_sum(wc)) #list of the word count for each sentence (running total for the whole text)

word_index = #some number that you get from word index

for index,w in enumerate(runningwc):
    if w > word_index:
        sentnumber = index-1 #found the index of the sentence that contains the word
        break

print sen_list[sentnumber]
希望这个想法有帮助

更新:如果sent\u tokenize很慢,那么您可以尝试完全避免它。使用已知索引查找大文本中的单词


现在,一个字符一个字符地向前和向后移动,以检测句子结束和句子开始。类似“[.!?]”(句号、感叹号或问号,后跟空格)的符号表示句子的开始和结束。您将只在目标单词附近搜索,因此它应该比sent\u tokenize快得多。

Oops,我正在使用python和nltk库。我将添加一个python版本,然后感谢更新。但是我没有句子之间的断行。我的问题是,我有一大团文本,我不知道边界在哪里(因此我需要标记单词的距离)。也没有段落?如果你真的有一大堆句子,你可以通过做一个re.sub(r'[\.\?!]',r'\n',str)来进行粗略的切分。这将在句号、问号或感叹号上拆分。为了防止这一切出错,您可以将完整的标记应用于关键匹配周围的“句子”窗口谢谢您的想法!明天我必须仔细看看,但我认为对我来说最慢的部分实际上是
sen\u list=sent\u tokenize(bigtext)
。(即标记器)令人惊讶的是,尽管我喜欢你的想法,但重复句子并不是太糟糕。是的,我希望sent_tokenize可以在单词附近搜索(从那里向外工作)。我真的需要sent_tokenize,因为它足够聪明,可以用NLP和all忽略缩写中的句点。
def running_sum(a):
  tot = 0
  for item in a:
    tot += item
    yield tot

from nltk.tokenize import sent_tokenize

sen_list = sent_tokenize(bigtext)
wc = [len(s.split()) for s in sen_list]
runningwc = list(running_sum(wc)) #list of the word count for each sentence (running total for the whole text)

word_index = #some number that you get from word index

for index,w in enumerate(runningwc):
    if w > word_index:
        sentnumber = index-1 #found the index of the sentence that contains the word
        break

print sen_list[sentnumber]