Получить строку в файле, в которой упоминаются c ключевых слов. - PullRequest
0 голосов
/ 06 августа 2020

У меня есть два файла, файл_ключевых слов (5 МБ) содержат по одному слову в строке. Вот пример:

prénom
pseudonyme
surnom
accès aux origines
puissance paternelle
droit de l’enfant
devoir de protection
droit à la survie
travail des enfants
obligation scolaire
assistance éducative
mauvais traitements
filiation adultérine

r_isa (205 МБ), которые содержат слова которые разделяют отношения "isa". Вот пример, где \t представляет буквальный символ табуляции:

égalité de Parseval\tformule_0.9333\tégalité_1.0
filiation illégitime\tfiliation_1.0
Loi reconnaissant l'égalité\tloi_1.0
égalité entre les sexes\tégalité_1.0
liberté égalité fraternité\tliberté_1.0

Это означает, что «égalité de Parseval» - это «формула» с оценкой 0,9333 и isa «égalité» с оценкой 1. . Итак, go на ..

Я хочу получить из файла r_isa слова, которые имеют гипернимальную связь с ключевыми словами, упомянутыми в файле keywords_file. Вот что я сделал:

keywords = pd.read_csv("keywords_file.txt", sep="\t",encoding = 'utf8', header=None)
with open("r_isa.txt",encoding="utf-8") as openfile:
    for line in openfile:
        for k in keywords[0]:
            if k in line:
                file = open('isa.txt','a', encoding='utf-8')
                file.write(("".join(line) + "\n"))
                file.close()

Это работает без остановки всю ночь. Полагаю, что-то не так. Любая помощь?

PS: я хотел добавить такое регулярное выражение:

...
    for k in keywords[0]:
        if re.search(r'\b' + k + r'\b', line):
...

, чтобы искать точное слово в каждой строке, но это вызвало у меня следующую ошибку, поэтому я ушел как сейчас:

error: missing ), unterminated subpattern at position 69

1 Ответ

1 голос
/ 06 августа 2020

Вероятно, основным узким местом является повторяющееся открытие для добавления внутрь плотного l oop. Операционная система должна будет открывать файл и искать его до конца каждый раз, когда вы в него пишете. Если вам нужно, чтобы несколько писателей имели доступ к концу файла, возможно, запустите каждого из них с выводом в отдельный файл, а затем объедините файлы результатов, когда все писатели будут готовы.

Я также немного подозрительно относится к порядку, в котором вы читаете файлы. Очевидно, необработанный файл r_isa.txt больше, но если он содержит меньше строк, чем файл keywords.txt, возможно, переключите их. Как правило, попробуйте прочитать меньший набор данных в память, затем l oop поверх большего файла, по одной строке за раз.

Вот попытка полностью без Pandas. Вероятно, в его использовании нет ничего плохого, но здесь он также не представляет особой ценности.

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

import re

keywords = []
with open("keywords_file.txt") as kwfile:
    keywords = [line.rstrip('\n') for line in kwfile]

regex = re.compile(r'\b(?:' + '|'.join(keywords) + r')\b')

with open("r_isa.txt") as readfile, open('isa.txt', 'w') as writefile:
    for line in readfile:
        firstfield = line.split('\t')[0]
        m = regex.match(firstfield)
        if m:
            writefile.write(line)

Регулярные выражения хороши для поиска подстроки совпадения и вариации; если вам просто нужна каждая строка, где ровно первое поле существует дословно как строка в файле ключевых слов, это почти наверняка будет быстрее:

    for line in readfile:
        firstfield = line.split('\t')[0]
        if firstfield in keywords:
            writefile.write(line)

, а затем, конечно, взять out import re и присваивание regex. Возможно также преобразовать keywords в set().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...