Для совпадения целых слов храните ключи в set и читайте texts.txt построчно. Для поиска подстрок по тысяче шаблонов подходит автомат Ахо—Корасик.
Отбор строк, содержащих заданные ключевые слова
Для совпадения целых слов храните ключи в set и читайте texts.txt построчно. Для поиска подстрок по тысяче шаблонов подходит автомат Ахо—Корасик.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дано:
- Текстовый файл
keywords.txt, в котором каждое слово‑ключ находится на отдельной строке (примерно 1000 строк). - Текстовый файл
texts.txt, содержащий около миллиона строк, каждая из которых представляет отдельную фразу.
Необходимо написать программу, которая формирует новый файл, включающий только те строки из texts.txt, в которых встречается хотя бы одно слово из keywords.txt.
Пример входных данных: keywords.txt:
foo
bar
baz
(далее следует пример того, как выглядит texts.txt и ожидаемый результат, но кодовые блоки оставлены без изменений).
Ответ
Для совпадения целых слов храните ключи в set и читайте texts.txt построчно. Для поиска подстрок по тысяче шаблонов подходит автомат Ахо—Корасик.
Ниже выбрана регистронезависимая проверка целых буквенных слов:
import re
with open('keywords.txt', encoding='utf-8') as source:
keywords = {line.strip().casefold() for line in source if line.strip()}
with open('texts.txt', encoding='utf-8') as source, \
open('matched.txt', 'x', encoding='utf-8') as target:
for line in source:
words = re.findall(r'[^\W\d_]+', line.casefold())
if any(word in keywords for word in words):
target.write(line)
Память не зависит от общего числа строк текста. Исходная строка записывается не более одного раза. Если ключ должен находиться внутри другого слова, правила другие: наивная тысяча in на каждую строку дорогая; предварительный многопаттерновый автомат уменьшит повторные проходы.