Chrizt
Сен. 8, 2009 07:58:49
Здравствуйте.
Я тут пишу парсер, который предварительно чистит текст от всего лишнего мусора.
Сначала просматривал весь текст (~2 Мб), и делал правила по каждому из случаев (мусора там навалом, и очеь ужасно выглядящего), но в итоге понял, что проще сделать исключение, чем правило )
Итак, суть. Нужно удалять ВСЕ символы, кроме пробела, точки, запятой, (тире), и русских букв.
Правда, даже после этой очистки, в тексте могут оставаться такие неприятности, как, например:
“задается . -. -. -..- .-, - ,= . При правильном”
или
“П.р,р.ва.кКН3ОН – -”, причём это всё - русские буковки.
Но, если с этих ещё нужно тщательно разбираться, то в первом случае - я не знаю, как быть :(
как одним махом полностью очистить от ВСЕХ символов, кроме русских букв, пробела, точки, запятой и тире.
Помогите, пожалуйста..
igor.kaist
Сен. 8, 2009 09:41:05
А если пройтись по тексту посимвольно, выискивая с помощью функции ord, подходит ли символ заданному диапазону?
Возможно есть и более красивое решение.
sypper-pit
Сен. 8, 2009 11:11:39
а я думал что это можно через
регулярки решить
Ferroman
Сен. 8, 2009 11:16:23
Регулярным выражением, однозначно.
pasaranax
Сен. 8, 2009 11:44:43
Думаю, вот такие “П.р,р.ва.кКН3ОН” последовательности будет сложно вычистить, поскольку программа не может знать слово ли это, сокращение или аббревиатура.
А в остальном что-то вроде этого:
import re
text = u"текст, нормальный-принормальный. русский, s, musorom - английским."
clearText = re.sub(u"[^а-яА-Я0-9.,\-\s]", "", text)
clearText = re.sub(u"[.,\-\s]{3,}", " ", clearText)
print clearText
первым проходом оставляем только нужные нам символы, вторым убираем последовательности знаков препинания.
Chrizt
Сен. 8, 2009 15:55:03
кажется, второй камент мне более подходит..
Потому как, всякие последовательности знаков препинания могут быть НАСТОЛЬКО разными, плюс всякие пробелы там между ними в разной форме.. В общем, не подходит. Более того, если Вы видели текст на пару метров - Вы понимаете, как сложно выловить из него все последовательности и мусор. Проще даже руками. А если текста на 200 метров?!
А регулярками я и так делал, но они не достаточно эффективны. Фишка в том, что нужно сделать так, чтобы удалялось ВСЁ, кроме русских букв, запятой, точки, тире.
Последовательности я вылавливать буду потом по условиям в регулярках: если слева и справа от знака препинания стоит другой знак препинания - чистим..
igor.kaist
Спасибо, покурю про ord() ;)
Chrizt
Сен. 8, 2009 16:00:19
pasaranax
clearText = re.sub(u"“, ”", text)
Хотя, вот это мне понравилось )
Chrizt
Сен. 8, 2009 20:34:22
Хмм.. и тут вознмкла проблемка..
Есть два зависимых друг от друга цикла, со сложными условиями, с разными выражениями:
цикл1 проверяет на наличие последовательностией, и, при их наличии, чистит текст
цикл2 проверяет на наличие двойных пробелов, и, при их наличии, чистит текст
фишка в том, чтобы оба цикла выполнялись постоянно, пока их условия истинны. То есть, если мы удалим все двойные пробелы, и почистим от последовательностей знаков препинания текст, двойные пробелы могут снова появиться.
Но циклов может быть и три и пять, поэтому, не могу найти решение :(
Помогите, плиз..
pasaranax
Сен. 8, 2009 22:33:47
а разве одними только регулярками не получается обойтись?
покажи какой-нибудь конкретный пример, и что надо сделать
sypper-pit
Сен. 9, 2009 02:14:30
выложи этот 2 метровый фаил и дай сюда