Как найти название места в большом файле с помощью регулярного выражения python - PullRequest
0 голосов
/ 08 мая 2020

Итак, я пытаюсь найти точные слова из файла country.txt, который определяет названия мест с файлом описания ниже:

вот пример country.txt

Pic de Font Blanca
Roc Mélé
Pic des Langounelles
Pic de les Abelletes
Estany de les Abelletes
Port Vieux de la Coume d’Ose
Port de la Cabanette
Port Dret
Costa de Xurius
Font de la Xona

а вот описание .csv файл описания

Файл описаний - это список данных, который содержит заголовки и описания статьи . Я пытаюсь найти точные слова названия места из файла описания с файлом country.txt

code.py

import csv
import time
import re

allCities = open('country.txt', encoding="utf8").readlines()
timestr = time.strftime("%Y-%m-%d-(%H-%M-%S)")

with open('description.csv') as descriptions,open('desc_place7---' + str(timestr) + '.csv', 'w', newline='', encoding='utf-8') as output:
    descriptions_reader = csv.DictReader(descriptions)
    fieldnames = ['title', 'description', 'place']
    output_writer = csv.DictWriter(output, delimiter='|', fieldnames=fieldnames)
    output_writer.writeheader()
    line=0
    pattern = r'|'.join(r'\b{}\b'.format(re.escape(city.strip())) for city in sorted(allCities, key=len, reverse=True))

    for eachRow in descriptions_reader:
        title = eachRow['row']
        description = eachRow['desc']
        citiesFound = set()
        found = re.findall(pattern, description, re.IGNORECASE | re.MULTILINE)
        citiesFound.update(found)
        if len(citiesFound)==0:
            output_writer.writerow({'title': title, 'description': description, 'place': " - "})

        else:
            output_writer.writerow({'title': title, 'description': description, 'place': " , ".join(citiesFound)})
        line += 1
        print(line)

ожидается output : output

Но поскольку country.txt (185,94 МБ) является большим файлом, мой код не может работать полностью. Это заставляет мой ноутбук зависать. Есть ли хороший способ справиться с этим? Я думаю, что это также из-за линии шаблона, которая у меня низкая, но мне также нужно регулярное выражение для поиска точных слов

1 Ответ

0 голосов
/ 08 мая 2020

Вот первая реализация вашей проблемы, вам нужно взять и улучшить ее в соответствии с вашими c потребностями.

Сначала сохраните все свои descriptions в pandas DataFrame вот так :

import pandas as pd
descriptions = pd.read_csv('description.csv')

Тогда Не считывать все строки файла в память . Вы можете читать файл country построчно и искать совпадения в данных descriptions. Используйте следующее:

 with open('country.txt', encoding="utf8") as cities_file, open('desc_place7---' + str(timestr) + '.csv', 'w', newline='', encoding='utf-8') as output:
    fieldnames = ['title', 'description', 'place']
    output_writer = csv.DictWriter(output, delimiter='|', fieldnames=fieldnames)
    output_writer.writeheader()
    line = 0        
    for city in cities_file:
        pattern = r'\b{}\b'.format(re.escape(city.strip())
        for index, row in descriptions.iterrows():
            title = row['row']
            description = row['desc']
            citiesFound = set()            
            found = re.findall(pattern, description, re.IGNORECASE | re.MULTILINE)
            citiesFound.update(found)
            if len(citiesFound)==0:
                output_writer.writerow({'title': title, 'description': description, 'place': " - "})
            else:
                output_writer.writerow({'title': title, 'description': description, 'place': " , ".join(citiesFound)})
            line += 1
            print(line)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...