LINUX.ORG.RU

Распарсить строку на адрес и имя

 , , ,


0

1

Всем привет, есть большой массив строк, которые состоят из first_name ++ last_name ++ addr_str (увы теоретически, last_name может быть пустой, last и first могут быть поменяны местами и т.д.). addr_str я парсю с помощью libpostal, вроде бы результат неплохой, но с отделение оного от имени, думаю, могут быть проблемы, если тут есть специалисты по такому, подскажите как повысить точность, ну или где почитать по этому поводу. Ткните, если туплю и там всё просто.

Данные на 90% из usa, но есть понемногу из разных стран.

Текущий вариант:

words = address |> String.split(" ")
lower = words |> Enum.map(&String.downcase/1)

{[fist_name | last_names], address} = words |> Enum.split(name_length(lower))

last_name = last_names |> Enum.join(" ")
где
defp name_length([a, b, c | _]) do
  cond do
    Regex.match?(~r/[0-9,]/, b) -> 1
    Regex.match?(~r/[0-9,]/, c) -> 2
    Enum.any?([b, c], & &1 in ["jr"]) -> 3
    true -> 2
  end
end

В частности может кто знает что добавить в [«jr»], т.е. популярные штуки, которые могут вкрасться в имяфамилию и отделяться пробелом?

Денег добавь поставщикам шлакоблокуня, чтобы вместо мусора нормальных данных дали? Отрежешь сегодня Dr., а завтра выяснится, что это часть legal name или ещё какая радость.

t184256 ★★★★★ ()
Ответ на: комментарий от t184256

Тут на самом деле не сильно критично, старая строка то останется, просто хочется выжать максимум точности.

Кстати всякие dr, mr добавлю, спасибо.

ddidwyll ★★★ ()
Ответ на: комментарий от t184256

Нормальных данных можно сказать что нет, т.е. стоимость их добычи превышает их ценность.

ddidwyll ★★★ ()

https://natasha.github.io/

И смотри аналоги для английского и других нужных тебе языков. Так есть ещё и pymorphy2, тоже под русский язык и он получше будет чем то что в наташе идёт (хотя я не знаю, раньше она его под капотом юзала вроде как), но он тебе не требуется (т.к. он немного ниже задачку решает). А вообще тебе надо мазаться машинным обучением для решения NLP задач.

https://nlpub.ru/Заглавная_страница

А вот тебе и вики в догонку.

Твоя задача называется NER, у англоязычных есть куча всякого, самое первое что пришло в голову NLTK + SpaCy

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 3)

libpostal

скормить всю строку этой махине, определить куда попадают имена, и разбирать то, куда попали имена.

anonymous ()

тс, добавь если можешь теги nlp и ner

peregrine ★★★★★ ()
Ответ на: комментарий от peregrine

Так ТС уже использует его, но по-своему.

anonymous ()
Ответ на: комментарий от anonymous

определить куда попадают имена и разбирать то, куда попали имена

Думаю так будет сложнее, имена попадают в unit, туда же попадают всякое вроде apt 1 и т.д., что я хотел скинуть кучей в address2

ddidwyll ★★★ ()
Последнее исправление: ddidwyll (всего исправлений: 1)
Ответ на: комментарий от ddidwyll

Советую конкретно на этой задаче глянуть на питон. Тут ему нету равных в плане готовых инструментов.

peregrine ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей