Вы можете использовать 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 для тестирования. Также, обратитесь к руководству для более сложных вещей.