основанное на правилах отображение ngram

1

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]
  • 0
    Есть вопрос? Или вы просто хотите нанять разработчика для реализации этого?
  • 1
    @zvone, Ашок новый участник, возможно, он не очень хорошо воспринимает сарказм.
Теги:
python-2.7

1 ответ

1
Лучший ответ

Вы можете поместить ключи 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]
  • 0
    когда в предложении есть специальный символ, такой как (= @!), данная логика не может разбить и пометить его как 'O'
  • 0
    невозможно отобразить строки с учетом регистра
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню