Очистка текста с использованием библиотеки регулярных выражений не работает должным образом - PullRequest
0 голосов
/ 21 июня 2019

У меня есть текст, который мне нужно очистить для дальнейшей обработки.

Вот пример текста:

Найджел Рувим Рук Уильямс (15 июля 1944 - 21 апреля 1992) был английским консерватором и экспертом по реставрации керамики и стекла.С 1961 года до своей смерти он работал в Британском музее, где стал главным консерватором керамики и стекла в 1983 году. Там его работы включали успешные реставрации шлема Саттона Ху и портлендской вазы.

Вступление вБудучи помощником в 16 лет, Уильямс всю свою карьеру и большую часть своей жизни провел в Британском музее.Он был одним из первых людей, изучавших сохранение, еще не признанных в качестве профессии, и с раннего возраста получил ответственность за высококлассные объекты.В 1960-х годах он помог с повторными раскопками корабля-захоронения Саттон-Ху, и в его начале-середине двадцатых годов он сохранил многие найденные в нем предметы: прежде всего шлем Саттон-Ху, который занимал год его времени,Он также реконструировал другие предметы из находки, в том числе щит, рога и бутылки из кленового дерева.

«Постоянной страстью его жизни» была керамика [4], а 1970-е и 1980-е годы предоставили Уильямсу широкие возможности вэто поле.После того, как в 1974 году среди обломков HMS Colossus было обнаружено почти 31 000 фрагментов разбитых греческих ваз, Уильямс принялся за их сборку.Процесс был передан по телевидению, и превратил его в телевизионную личность.Десять лет спустя, в 1988 и 1989 годах, коронным достижением Уильямса стало то, что он разобрал на части Портлендскую вазу, один из самых известных стеклянных предметов в мире, и собрал ее вместе.Реконструкция была снова передана по телевидению для программы BBC, и, как и в случае со шлемом Саттон Ху, на ее завершение ушёл почти год.

Мне нужно:

  • разбить текст на предложения (по символу полной остановки '.'), исключив символ полной остановки

  • разбить предложения на слова (только буквы латинского алфавита), другие символы следует заменитьсимволом пробела и для разделения этих слов следует использовать только один пробел

  • Показать весь текст в нижнем регистре

Я использую Macи я получаю этот код:

#!/usr/bin/env python
# -*- coding: utf-8 -*- 
import re

fread = open('source.txt')
fwrite = open('result.txt','w+')

for line in fread:
    new_line = line    
    # split the text into sentences
    new_line = re.sub(r"\."  , "\r", new_line)

    # change all uppercase letters to lowercase
    new_line = new_line.lower()

    # only latin letters 
    new_line = re.sub("[^a-z\s]", " ", new_line)

    # The words should be separated by single spaces.
    new_line = re.sub(r" +"," ", new_line)

    # Getting rid of space in the beginning of the sentence 
    new_line = re.sub(r"ˆ\s+", "", new_line)
    fwrite.write(new_line)

fread.close()
fwrite.close()

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

Вот пример результата.Поскольку пробелы, которые не отображаются в stackoverflow, мне пришлось отображать текст в виде кода:

nigel reuben rook williams july april was an english conservator and expert on the restoration of ceramics and glass
 from until his death he worked at the british museum where he became the chief conservator of ceramics and glass in 
 there his work included the successful restorations of the sutton hoo helmet and the portland vase

joining as an assistant at age williams spent his entire career and most of his life at the british museum
 he was one of the first people to study conservation not yet recognised as a profession and from an early age was given responsibility over high profile objects
 in the s he assisted with the re excavation of the sutton hoo ship burial and in his early to mid twenties he conserved many of the objects found therein most notably the sutton hoo helmet which occupied a year of his time
 he likewise reconstructed other objects from the find including the shield drinking horns and maplewood bottles

the abiding passion of his life was ceramics and the s and s gave williams ample opportunities in that field
 after nearly fragments of shattered greek vases were found in amidst the wreck of hms colossus williams set to work piecing them together
 the process was televised and turned him into a television personality
 a decade later in and williams s crowning achievement came when he took to pieces the portland vase one of the most famous glass objects in the world and put it back together
 the reconstruction was again televised for a bbc programme and as with the sutton hoo helmet took nearly a year to complete

Различные символы могут не отображаться, как я вижу, например, перед объединением я вижу два ?? с использованием TextWrangler.

Использование функции lstrip(), кстати, позволяет удалить пробелы в начале каждого предложения.

Почему <new_line = re.sub(r"ˆ\s+", "", new_line)> не работает?

Я подозреваю, что '\ n', используемый для обозначения конца строки, вызывает некоторые проблемы.

Ответы [ 2 ]

1 голос
/ 21 июня 2019
# split the sentences into words 
new_line = re.sub("[^a-z\s]", " ", new_line)

Это не делает то, что говорит комментарий.На самом деле он заменяет все непробельные, непробельные символы пробелом, поэтому в ваших выходных данных отсутствуют цифры и знаки препинания.

# Getting rid of space in the beginning of the sentence 
new_line = re.sub(r"ˆ\s+", "", new_line)

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

0 голосов
/ 22 июня 2019

Несколько упоминаний здесь:

  1. Используйте менеджер контекста для файлов ввода / вывода, потому что он обрабатывает закрытие после использования по умолчанию.

  2. У вас неправильный характер, как сказал Джон Гордон.

  3. Я рекомендую использовать какой-либо инструмент визуализации регулярных выражений (т.е. https://jex.im/regulex/)

  4. Основной подход для замены чего-либо только пробелом - использовать оператор плюс [^a-z]+: (не алфавитные символы) + (один и более).

Итак, последний фрагмент кода, который я сделал

# !/usr/bin/env python
# -*- coding: utf-8 -*-
import re

# It's better to use context manager to read files.
# You don't have to explicitly close those files after reading.
with open('./source.txt', 'r') as source:
    text = ''
    for line in source:
        text += line.lower()  # Lower case on reading, why not.

# only latin letters & single spaces at the same time
text = re.sub("[^a-z.]+", " ", text)

# # replace dots with newlines
text = re.sub(r'\.', r'\n', text)

with open('./result.txt', 'w+') as output:
    output.write(text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...