我有一个包含数千个句子的文件,我想找到包含特定字符/单词的句子。
最初,我正在对整个文件进行标记(使用sent_tokenize
),然后遍历句子以找到该单词。但是,这太慢了。既然我可以快速找到单词的索引,我可以使用这个对我有利吗?有没有办法简单地标记一个单词周围的区域(即找出哪个句子包含一个单词)?
感谢。
编辑:我使用的是Python并使用NLTK库。
答案 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快得多。