ngram, возникающие вместе в тексте, необходимо сопоставить с остальными строками словаря другим (O)
dict_ngram = {'Log':'c1','LOG entrie':'c2','log entrie block':'c3'}
sent = 'the user @ enter log = to validate log entrie in ,a log entrie block'
ожидаемый результат:
[the-O,user-O,@ -O,enter-O,log-c1,=-O,to-O,validate-O,log entrie-c2, in-O, a-O, ,-O,log entrie block-c3]
Вы можете поместить ключи dict_ngram
в обратном порядке количества слов в шаблоне регулярного выражения с чередованием, а затем использовать re.findall
для токенизации sent
строки и использовать dict.get
для сопоставления маркеров с их значениями в соответствии с dict_ngram
с помощью O
as значение по умолчанию:
import re
dict_ngram = {k.lower(): v for k, v in dict_ngram.items()}
print('[%s]' % ','.join('-'.join((s.strip(), dict_ngram.get(s, 'O'))) for s in re.findall(r'%s|\S+' % '|'.join(map(re.escape, sorted(dict_ngram, key=len, reverse=True))), sent)))
Эти результаты:
[the-O,user-O,@-O,enter-O,log-c1,=-O,to-O,validate-O,log entrie-c2,in-O,,a-O,log entrie block-c3]