如何在文件上迭代,查找列表中定义的关键字



我有一个定义的关键字列表和一个文本文件。我想搜索文本文件,并计算列表中每个关键字出现的次数。示例:

kw = ['max speed', 'time', 'distance', 'travel', 'down', 'up']
with open("file.txt", "r") as f:
data_file = f.read()
d = dict()
for line in data_file:
line = line.strip()
line = line.lower()
words = line.split(" ")
for word in words:
if word in d:
d[word] = d[word] + 1
else:
d[word] = 1
for key in list(d.keys()):
print(key, ":", d[key])

现在假设我们运行代码,它应该搜索file.txt并在列表中循环。如果它在列表中找到一个关键字,则打印该单词以及找到的次数。如果找不到单词,那么它就不会报告。

示例输出:

找到的关键字:

最大速度:3行程:7距离:3

不能像我想的那样让它发挥作用。任何反馈都会很棒!提前感谢!

有几种算法可以使用。有一些特殊的算法可以在文本中找到特定的单词。最简单的是天真算法,这是我写的代码:

def naive_string_matching(text, pattern):
txt_len, pat_len = len(text), len(pattern)
result = []
for s in range(txt_len - pat_len + 1):
if pattern == text[s:s+pat_len]:
result.append(s)
return result

这种天真的算法将一个文本和一个单词作为搜索模式作为输入。该算法的复杂度为O((n − m + 1)m),其中m是模式的长度,n是文本的长度。

您可以使用的下一个算法是有限自动化算法,它的复杂度比天真算法更好。如果你对它感兴趣,你可以在这里阅读更多关于它的信息。这里也是我对这个算法的实现:

def transition_table(pattern):
alphabet = set(pattern)
ptt_len = len(pattern)
result = []
for q in range(ptt_len+1):
result.append({})
for l in alphabet:
k = min(len(pattern), q+1)
while True:
if k == 0 or pattern[:k] == (pattern[:q] + l)[-k:]:
break
k -= 1
result[q][l] = k
return result
def fa_string_matching(text, pattern):
q = 0
delta = transition_table(pattern)
txt_len = len(text)
result = []
for s in range(txt_len):
if text[s] in delta[q]:
q = delta[q][text[s]]
if q == len(delta) - 1:
result.append(s+1-q)
else:
q = 0
return result

该算法的复杂度为O(n),但预处理时间(transition_table函数(取O(m),其中n是文本的长度,m是模式的长度。

我能向你提出的最后一个算法是KMP(Knuth–Morris–Pratt(算法,它是所有三种算法中速度最快的。再次我的实现:

def prefix_function(pattern):
pat_len = len(pattern)
pi = [0]
k = 0
for q in range(1, pat_len):
while k > 0 and pattern[k] != pattern[q]:
k = pi[k-1]
if pattern[k] == pattern[q]:
k += 1
pi.append(k)
return pi
def kmp_string_matching(text, pattern):
txt_len, pat_len = len(text), len(pattern)
pi = prefix_function(pattern)
q = 0
result = []
for i in range(txt_len):
while q > 0 and pattern[q] != text[i]:
q = pi[q-1]
if pattern[q] == text[i]:
q += 1
if q == pat_len:
result.append(i - q + 1)
q = pi[q-1]
return result

作为一种输入,它需要全文和您正在寻找的模式。KMP算法的复杂性类似于Finite自动化算法,它是O(n),但预处理时间更快(prefix_function(。

如果你对模式匹配或在文本中查找模式等主题感兴趣,我强烈建议你熟悉所有这些主题。

要打开文件,只需运行:

with open(file_name) as file:
text = file.read()
result = naive_string_matching(text, pattern)

其中file_name是文件名,模式是要在文本中搜索的短语。要在数组中搜索模式,您可以尝试:

example_patterns = ['max speed', 'time', 'distance', 'travel', 'down', 'up']
with open(file_name) as file:
text = file.read()
for pattern in example_patterns:
result = kmp_string_matching(text, pattern)
import re
keywords = ['max speed', 'time', 'distance', 'travel', 'down', 'up']
keywords = [x.replace(' ', r's') for x in keywords]  # replaces spaces with whitespace indicator
with open('file.txt', 'r') as file:
data = file.read()
keywords_found = {}
for key in keywords:
found = re.findall(key, data, re.I) # re.I means it'll ignore case. 
if found:
keywords_found[key] = len(found)
print(keywords_found)

最新更新