Попытка поиска нечувствительных к регистру ключевых слов из файла журнала (.txt) - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть файл журнала разговора. Я хочу найти в файле определенные ключевые слова, которые я назначил, но файл журнала может содержать прописные, строчные и заглавные буквы слова, которое я ищу.

Я могу выделить контуры, в которых ключевое слово записано в нижнем регистре, но не может получить версии слова в верхнем или верхнем регистре. Как я могу решить это?

Я пытался использовать

if (words.title() and words.lower()) in line:
     print (searchInLines[i])

но это, похоже, не работает.

keywords=['bimbo', 'qualified', 'tornadoes', 'alteryx', 'excel', 'manchester']


with open("recognition_log.txt", "r", encoding="utf8") as f:
    searchInLines = f.readlines()
    f.close()

for words in keywords:
    for i, line in enumerate(searchInLines):
        if (words.title() and words.lower()) in line:
            print (searchInLines[i])

Например, файл журнала содержит следующее предложение:

«Манчестер Юнайтед вчера играл в« Барселоне », однако манчестерский клуб проиграл»

У меня есть "Манчестер" в моих ключевых словах, поэтому он подберет второй, но не первый.

Как я могу распознать оба?

Заранее спасибо!

Ответы [ 5 ]

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

Использование Regex

Пример:

import re

keywords=['bimbo', 'qualified', 'tornadoes', 'alteryx', 'excel', 'manchester']


with open("recognition_log.txt", "r", encoding="utf8") as f:
    searchInLines = f.readlines()

#pattern = re.compile("(" + "|".join(keywords) + ")", flags=re.IGNORECASE)
pattern = re.compile("(" + "|".join(r"\b{}\b".format(i) for i in keywords) + ")", flags=re.IGNORECASE)
for line in searchInLines:
    if pattern.search(line):
        print(line)
1 голос
/ 11 апреля 2019

Прежде всего, вам не нужен f.close () при работе с менеджером контекста.

Что касается решения, я рекомендую вам использовать regexp в этом случае

import re
keywords=['bimbo', 'qualified', 'tornadoes', 'alteryx', 'excel', 'manchester']
# Compiling regext pattern from keyword list
pattern = re.compile('|'.join(keywords))

with open("recognition_log.txt", "r", encoding="utf8") as f:
    searchInLines = f.readlines()

for line in searchInLines:
    # if we get a match
    if re.search(pattern, line.lower()):
        print(line)
1 голос
/ 11 апреля 2019

Я не был полностью уверен, что вы пытались сделать, но я предполагаю, что это отфильтровывает сообщения (строки), которые содержат одно из слов в keywords. Вот простой способ сделать это:

keywords=['bimbo', 'qualified', 'tornadoes', 'alteryx', 'excel', 'manchester']

with open("recognition_log.txt", "r", encoding="utf8") as f:
    searchInLines = f.readlines()
    f.close()

for line in searchInLines:
    for keyword in keywords:
        if keyword in line.lower():
            print(line)
0 голосов
/ 11 апреля 2019

(1) Ваши слова в нижнем регистре, поэтому "words.lower ()" не имеет никакого эффекта.(2) Ваше примерное предложение не было бы найдено, если бы в нем не было «Манчестер» И «Манчестер», так как вы используете «и» логику.(3) Я полагаю, что вы хотите: "если слова в line.lower ():"

0 голосов
/ 11 апреля 2019

Вы можете преобразовать строку и ключевые слова в верхний или нижний регистр и сравнить их.

keywords = ['bimbo', 'qualified', 'tornadoes', 'alteryx', 'excel', 'manchester']

with open("test.txt", "r", encoding="utf8") as f:
    searchInLines = f.readlines()
    f.close()

for words in keywords:
    for i, line in enumerate(searchInLines):
        if words.upper() in line.upper():
            print(searchInLines[i])
...