Использование ключевого слова для печати предложения в Python - PullRequest
3 голосов
/ 06 апреля 2019

Здравствуйте, я пишу программу на Python, которая читает данный файл .txt и ищет ключевые слова. В этой программе, когда я нашел свое ключевое слово (например, 'data'), я хотел бы распечатать все предложение, с которым связано слово.

Я прочитал в своем входном файле и использовал метод split(), чтобы убрать пробелы, табуляции и символы новой строки и поместить все слова в массив.

Вот код, который у меня есть.

text_file = open("file.txt", "r")
lines = []
lines = text_file.read().split()
keyword = 'data'

for token in lines:
    if token == keyword:
         //I have found my keyword, what methods can I use to
        //print out the words before and after the keyword 
       //I have a feeling I want to use '.' as a marker for sentences
           print(sentence) //prints the entire sentence

file.txt Читается следующим образом

Welcome to SOF! This website securely stores data for the user.

желаемый вывод:

This website securely stores data for the user.

Ответы [ 4 ]

2 голосов
/ 07 апреля 2019

Мой подход похож на Альберто Поляк , но немного более явный.

Мотивация состоит в том, чтобы понять, что разделение на слова не нужно - оператор Python in с радостью найдет словов предложении.Что необходимо, так это расщепление предложений.К сожалению, предложения могут заканчиваться ., ? или !, а функция Python split не допускает использование нескольких разделителей.Таким образом, мы должны немного усложниться и использовать re.

re требует от нас поставить | между каждым разделителем и escape некоторых из них, потому что оба . и ? имеют специальные значения по умолчанию.Решение Альберто использовало саму re, чтобы сделать все это, и это определенно верный путь.Но если вы новичок в re, моя жестко запрограммированная версия может быть более ясной.

Другое добавление, которое я сделал, заключалось в том, чтобы поставить конечный разделитель каждого предложения обратно на предложение, которому он принадлежит.Для этого я обернул разделители в (), что фиксирует их в выводе.Затем я использовал zip, чтобы вернуть их в предложение, из которого они пришли.Срезы 0::2 и 1::2 будут брать каждый четный индекс (предложения) и объединять их с каждым нечетным индексом (разделителями).Раскомментируйте оператор print, чтобы увидеть, что происходит.

import re

lines = "Welcome to SOF! This website securely stores data for the user. Another sentence."
keyword = "data"

sentences = re.split('(\.|!|\?)', lines)

sentences_terminated = [a + b for a,b in zip(sentences[0::2], sentences[1::2])]

# print(sentences_terminated)

for sentence in sentences_terminated:
    if keyword in sentence:
        print(sentence)
        break

Вывод:

 This website securely stores data for the user.
2 голосов
/ 07 апреля 2019

Мы можем просто разделить текст на символы, представляющие окончания строк, а затем выполнить цикл по этим строкам и напечатать те, которые содержат наше ключевое слово.

Чтобы разделить текст на несколько символов, например, конец строки можно пометить ! ? . мы можем использовать регулярное выражение:

import re

keyword = "data"
line_end_chars = "!", "?", "."
example = "Welcome to SOF! This website securely stores data for the user?"
regexPattern = '|'.join(map(re.escape, line_end_chars))
line_list = re.split(regexPattern, example)

# line_list looks like this:
# ['Welcome to SOF', ' This website securely stores data for the user', '']

# Now we just need to see which lines have our keyword
for line in line_list:
    if keyword in line:
        print(line)

Но имейте в виду, что: if keyword in line: соответствует последовательности символов, не обязательно целому слову - например, «data» в «datamine»правда.Если вы хотите сопоставлять только целые слова, вам следует использовать регулярные выражения: исходное объяснение с примером

Источник для разделителей регулярных выражений

1 голос
/ 07 апреля 2019

Это решение использует довольно простое регулярное выражение, чтобы найти ваше ключевое слово в предложении, со словами, которые могут или не могут быть до и после него, и символом конечного периода.Он хорошо работает с пробелами и это только одно выполнение re.search().

import re

text_file = open("file.txt", "r")
text = text_file.read()

keyword = 'data'

match = re.search("\s?(\w+\s)*" + keyword + "\s?(\w+\s?)*.", text)
print(match.group().strip())
0 голосов
/ 07 апреля 2019

Другое решение:

def check_for_stop_punctuation(token):
    stop_punctuation = ['.', '?', '!']
    for i in range(len(stop_punctuation)):
        if token.find(stop_punctuation[i]) > -1:
            return True
    return False

text_file = open("file.txt", "r")
lines = []
lines = text_file.read().split()
keyword = 'data'

sentence = []
stop_punctuation = ['.', '?', '!']

i = 0
while i < len(lines):
    token = lines[i]
    sentence.append(token)
    if token == keyword:
        found_stop_punctuation = check_for_stop_punctuation(token)
        while not found_stop_punctuation:
            i += 1
            token = lines[i]
            sentence.append(token)
            found_stop_punctuation = check_for_stop_punctuation(token)
        print(sentence)
        sentence = []
    elif check_for_stop_punctuation(token):
        sentence = []
    i += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...