用Python查找包含关键词数组中的句子

1 投票
3 回答
2339 浏览
提问于 2025-04-17 23:45

我正在使用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 个回答

0

我无法评论(因为我的声望不够),所以这个回答技术上来说不算是一个真正的回答。

我对正则表达式不是很熟悉,但假设你的 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() 之前把它处理掉了。

0
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(" "))

其实,如果你愿意的话,可以用你的正则表达式来替换“包含有用的词”这个部分。

2

为什么不使用列表推导式呢?

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) ]

撰写回答