用Python查找包含关键词数组中的句子
我正在使用Python 2.7
我想要处理一个.txt文件,只保留那些包含一个或多个关键词的句子。
之后,我还想用另一个关键词列表再处理一次剩下的文本,重复这个过程。
我想把结果保存到那个.txt文件里,其余的可以删除。
我对Python还很陌生(但我很喜欢它!),所以请不要担心会伤到我的感情,可以假设我对这方面的知识很少,简单点说就好 :)
这是我目前的进展:
import re
f = open('C:\\Python27\\test\\A.txt')
text = f.read()
define_words = 'contractual'
print re.findall(r"([^.]*?%s[^.]*\.)" % define_words,text)
这个代码能过滤掉任何包含'contractual'的句子。如果我把'contractual obligation'放进去,它会过滤掉那些两个词连在一起的句子。
我现在遇到的问题是,怎么把这些词变成一个数组,让它们彼此独立考虑?比如'contractual'、'obligation'、'law'、'employer'等等。
关于applepi的回答的编辑:
我用一个小测试做了一些实验:
"快速的棕色狐狸跳过懒狗。
新的一行。
又一行新的内容。"
只有当我在句子中放入两个词时,才会得到一个句子。比如['quick', 'brown']
输出结果:['T', 'h', 'e', ' ', 'q', 'u', 'i', 'c', 'k', ' ', 'b', 'r', 'o', 'w', 'n', ' ', 'f', 'o', 'x', 'y', ' ', 'j', 'u', 'm', 'p', 's', ' ', 'o', 'v', 'e', 'r', ' ', 't', 'h', 'e', ' ', 'l', 'a', 'z', 'y', ' ', 'd', 'o', 'g', '.']
所以['quick', 'another']没有结果。
['Yet', 'another']的结果是:
输出结果:[' ', '\n', '\n', 'Y', 'e', 't', ' ', 'a', 'n', 'o', 't', 'h', 'e', 'r', ' ', 'n', 'i', 'c', 'e', ' ', 'n', 'e', 'w', ' ', 'l', 'i', 'n', 'e', '.']
3 个回答
我无法评论(因为我的声望不够),所以这个回答技术上来说不算是一个真正的回答。
我对正则表达式不是很熟悉,但假设你的 re.findall()
能成功运行,你可以试试下面的代码:
import re, itertools
from collections import Counter
f = open('C:\\Python27\\test\\A.txt')
text = f.read()
everything = []
define_words = ['contractual', 'obligation', 'law', 'employer']
for k in define_words:
everything.append(re.findall(r"([^.]*?%s[^.]*\.)" % k,text))
everything = list(itertools.chain(*everything))
counts = Counter(everything)
everything = [value for value, count in counts.items() if count > 1]
everything = list(itertools.chain(*everything))
print everything
这段代码会遍历数组列表,把值添加到一个新的列表中,最终形成一个列表的列表。然后我只保留重复的值(也就是我们需要的好值),并把这个列表的列表转换成一个普通的列表。
错误:真正的问题是所有的东西都是列表的列表,而 Counter(everything)
不支持这样。所以我在使用 Counter()
之前把它处理掉了。
def init_contains_useful_word(words_to_search_for):
def contains_useful_word(sentence):
return any(map(lambda x: x in sentence, words_to_search_for))
with open(filename, 'r') as f:
text = f.read()
sentences = text.split(".")
for words in list_of_lists:
contains_useful_word = init_contains_useful_word(words)
sentences = filter(contains_useful_word, sentences)
with open(filename, 'w') as f:
f.write(sentences.join(" "))
其实,如果你愿意的话,可以用你的正则表达式来替换“包含有用的词”这个部分。
为什么不使用列表推导式呢?
print [sent for sent in text.split('.')
if any(word in sent for word in define_words.split()) ]
或者如果你把 define_words 改成字符串列表的话:
# define_words = ['contractual', 'obligations']
define_words = 'contractual obligations'.split()
print [sent for sent in text.split('.')
if any(word in sent for word in define_words) ]