使用NLTK在Python的文件的特定区域中使用sent_tokenize?

时间:2012-12-06 02:03:18

标签: python nlp tokenize nltk

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

最初,我正在对整个文件进行标记(使用sent_tokenize),然后遍历句子以找到该单词。但是,这太慢了。既然我可以快速找到单词的索引,我可以使用这个对我有利吗?有没有办法简单地标记一个单词周围的区域(即找出哪个句子包含一个单词)?

感谢。

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

2 个答案:

答案 0 :(得分:2)

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

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

这将只显示包含您单词的行(并且sed会在句子中得到非常粗略的标记化)。如果您想要使用特定语言的解决方案,您应该说出您正在使用的内容!

Python的编辑:

以下内容将起作用 - 如果你的单词上有正则表达式匹配,它只会调用标记化(这是一个非常快速的操作)。这意味着您只对包含所需单词的行进行标记:

import re
import os.path

myword = 'using'
fname = os.path.abspath('path/to/my/file')

try:
    f = open(fname)

    matching_lines = list(l for l in f if re.search(r'\b'+myword+r'\b', l))
    for match in matching_lines:
        #do something with matching lines
        sents = sent_tokenize(match)
except IOError:
    print "Can't open file "+fname
finally:
    f.close()

答案 1 :(得分:0)

这是一个可能加速搜索的想法。您可以创建一个附加列表,在其中存储大文本中每个句子的单词计数的运行总计。使用我从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_tokenize的速度很慢,那么您可以尝试完全避免它。使用已知索引在大文本中查找单词。

现在,逐个字符地向前和向后移动,以检测句子结束和句子开始。像“[。!?]”(句号,感叹号或问号,后跟空格)之类的东西将表示句子的开始和结束。您只会在目标字附近搜索,因此它应该比sent_tokenize快得多。