我已经构建了一个抓取数据的网络抓取工具。数据通常是结构化的。但是后来又有一些异常现象。现在要在数据之上进行分析,我正在搜索几个单词,searched_words=['word1','word2','word3'......]
我想要这些单词存在的句子。所以我编码如下:
searched_words=['word1','word2','word3'......]
fsa = re.compile('|'.join(re.escape(w.lower()) for w in searched_words))
str_df['context'] = str_df['text'].apply(lambda text: [sent for sent in sent_tokenize(text)
if any(True for w in word_tokenize(sent) if w.lower() in words)])
它正在发挥作用,但我面临的问题是,如果在文本中有一个完整的停止后有/缺少空格我会得到所有这样的句子。
示例:
searched_words = ['snakes','venomous']
text = "I am afraid of snakes.I hate them."
output : ['I am afraid of snakes.I hate them.']
Desired output : ['I am afraid of snakes.']
答案 0 :(得分:1)
如果所有令牌系统(包括nltk)都失败了你可以自己动手并尝试
import re
s='I am afraid of snakes.I hate venomous them. Theyre venomous.'
def findall(s,p):
return [m.start() for m in re.finditer(p, s)]
def find(sent, word):
res=[]
indexes = findall(sent,word)
for index in indexes:
i = index
while i>0:
if sent[i]!='.':
i-=1
else:
break
end = index+len(word)
nextFullStop = end + sent[end:].find('.')
res.append(sent[i:nextFullStop])
i=0
return res
使用它here。那里留下了一些点,因为我不知道你想要用它们做什么。
它的作用是找到所述单词的所有出现,并在你回到前一个点的过程中获得句子。这仅适用于边缘情况,但您可以根据需要轻松调整它。