Обнаружение контакта и просмотр информации в тексте - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь найти контактную информацию в огромном списке предложений, которые я получаю. Предложения содержат текст без какой-либо определенной структуры, некоторые примеры могут быть следующими:

  • , если вы заинтересованы, отправьте электронное письмо по адресу test@test.com
  • Хотите узнать больше? звоните 000 000 000
  • приходите в пабли c просмотр 25 января
  • пабли c просмотр в грядущую среду
  • это то, что вы ищу? Мы с нетерпением ждем от вас ответа

Как видите, существует несколько возможностей:

  • дата просмотра отсутствует, но есть номер телефона
  • дата просмотра отсутствует, но есть электронная почта
  • дата просмотра
  • подробная информация отсутствует

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

Как лучше всего решить что-то подобное? Я уже пробовал это с регулярным выражением. Я думаю, я мог бы заставить это работать, но есть огромное количество случаев, которые делают это очень трудным.

Я также изучал такие вещи, как NLP с библиотеками, такими как https://spacy.io/ или prodi.gy , но мне кажется, что я не на правильном пути.

Оригинальные тексты написаны на немецком языке.

В 2020 году, как мне go после этого?

1 Ответ

1 голос
/ 20 января 2020

Вы можете использовать NLP-совместимые средства сопоставления на основе правил. С spacy Вы изучили правильный инструмент, просто не углубившись в него. И это доступно на немецком языке. Вот несколько примеров:

Некоторые шаблоны:

#call number
call_pattern = [{'LOWER':'call'},{"ORTH": "(", 'OP':"?"}, {"SHAPE": "ddd"}, {"ORTH": ")", 'OP':"?"}, {"SHAPE": "ddd"},
 {"ORTH": "-", "OP": "?"}, {"SHAPE": "ddd"}]

#e-mail pattern
email_pattern = [{'LIKE_EMAIL': True}]

#pattern for public viewing
public_viewing_pattern = [{'LOWER': 'public'},
           {'LOWER': 'viewing'},
           {'POS': 'AUX', 'OP': '?'},
           {'POS': 'ADP', 'OP': '?'},
           {'label': 'DATE', 'OP':'+'}]

Затем вы перебираете шаблоны и применяете их:

import spacy
from spacy.matcher import Matcher
nlp = spacy.load('en')
#or:
#import de_core_news_sm
#nlp = de_core_news_sm.load()

matcher = Matcher(nlp.vocab)
matcher.add("call_pattern", None, call_pattern)
matcher.add("email_pattern", None, email_pattern)
matcher.add("public_viewing_pattern", None, public_viewing_pattern)
found = {'numbers':[], 'emails':[], 'public_viewings':[]}
for sent in sentences:
  doc = nlp(sent)
  matches = matcher(doc)
  for match_id, start, end in matches:
    if doc.vocab.strings[match_id] == 'call_pattern':
      found['numbers'].append(doc[start:end])
    if doc.vocab.strings[match_id] == 'email_pattern':
      found['emails'].append(doc[start:end])
    if doc.vocab.strings[match_id] == 'public_viewing_pattern':
      found['public_viewings'].append(doc[start:end])
print(found)

результат:

{'numbers': [call 000 000 000], 'emails': [test@test.com], 'public_viewings': [publi c просмотр включен, publi c просмотр 25-й, publi c просмотр 25-го числа, публикация c просмотр 25-го января, публикация c просмотр, публикация c просмотр включен, публикация c просмотр в ожидании, публикация c просмотр в ближайшее время, публика c просмотр в ближайшую среду]}

Ps .: Это повторение вызвано ошибкой в ​​просторных версиях до 2.1. Просто добавьте ручную проверку правильности повторяющихся совпадений (получите наиболее длинную), и все будет хорошо.

Сложной задачей будет достаточно обобщить и правильно получить ваши шаблоны, но они очень мощные, и вы может сделать все виды настроек для них. Проверьте spacy online demo для тестирования. Также, обратитесь к руководству для более сложных вещей.

...