Как сортировать разные телефонные номера?

Здравствуйте!
Возник вопрос: есть файл с >10000 строк.
.txt
В файле данные в виде:
Имя Фамилия : 899999999
- телефонный номер
то есть файл состоит из имени, фамилии и телефонного номера.
но дело в том, что не всегда этот номер выглядит в формате 8999...
иногда он записан как +7...
иногда - 7....
иногда 99999999 (то есть без 8/7/+7)
порой телефонный номер записан даже так(!) 8-девять-123-ноль-123
а иногда вместо телефона записано "Иванов Иван : нет телефона (есть телефон)" или любой другой текст.

так возникает вопрос: как научить питон(?) выбирать, что из этого телефон, а что - нет.

понимаю, как это можно было бы реализовать, имея всего 1 формат номера - 8999... или 7999..
но когда а) - они разные б) - не всегда чисто в цифровом виде (9-ноль-12) с) не всегда вообще телефоны - тут я запутываюсь.
была мысль обучить питон с помощью нейросетей(?), но в этом я совсем не понимаю.
а библиотек, которые работают с телефонными номерами, как я понял, тоже нет..

Заранее спасибо за ответ!
  • Вопрос задан
  • 1033 просмотра
Пригласить эксперта
Ответы на вопрос 3
Не могу подсказать никакой библиотеки для работы с числительными на русском (да и на любом другом языке), но вы не думали сделать парсер попроще?
Что-нибудь вроде:
import re


REPLACEMENT = {
	'ноль': '0',
	'один': '1',
	'два': '2',
	'три': '3',
	'четыре': '4',
	'пять': '5',
	'шесть': '6',
	'семь': '7',
	'восемь': '8',
	'девять': '9'
}


PHONE_REGEX = re.compile('(\+)?\d{10,11}')


def parse_phones(file_path):
	parsed = []
	unparsed = []
	with open(file_path, 'r') as file:
		for line in file:
			name, phone, *_ = line.split(':')
			name = name.strip()
			phone = phone.strip()
			for key, value in REPLACEMENT.items():
				phone = phone.replace(key, value)
			if PHONE_REGEX.match(phone):
				phone_len = len(phone)
				if phone_len == 10:
					phone = '+7' + phone
				elif phone_len == 11:
					phone = '+7' + phone[1:]
				parsed.append((name, phone))
			else:
				unparsed.append(line)
	return parsed, unparsed

Вместо засовывания в списки можно сразу писать в файлы. Как минимум, это уменьшит количество "неизвестных" номеров.
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
num = ''.join([x for x in num if x.isdigit()])
Ответ написан
Комментировать
@ivodopyanov
NLP, python, numpy, tensorflow
1. Отфильтровать все, что точно не телефон (тексты "нет телефона" и т.д.)
2. Превратить цифры, записанные словами, в числа.
3. Оставить в тексте только цифры и "+".

Если в датасете гарантированно, что с цифрами могут быть только телефоны (нет ip-адресов, почтовых индексов, паспортных данных и прочего) - то должно работать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы