Ngram на основе словаря

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

text = "the log user should able to identify log entries  and domain  log entries"
ngramList = ['log', 'log entries','domain log entries']


import re

counts = {}
for ngram in ngrams:
  words = ngram.rsplit()
  pattern = re.compile(r'%s' % "\s+".join(words),re.IGNORECASE)
  counts[ngram] = len(pattern.findall(text))

print(counts)

текущий программный выход = 'log':3 ,'log entries':2,'domain log entries':1

ожидаемый результат = 'log' : 1 , 'log entries':1, 'domain log entries':1

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
94
1

Ответы 1

Вы можете сначала отсортировать список ngram по размеру, а затем использовать re.subn для замены каждой ngram (от большого к маленькому) пустой строкой и одновременно подсчитать количество замен.

Поскольку вы сортируете ngram от большего к меньшему, вы гарантируете, что меньшие не будут считаться «частью больших», потому что вы удаляете их из строки в цикле.

import re

s = "the log user should able to identify log entries  and domain  log entries"
ngramList = ['log', 'log entries','domain log entries']
ngramList.sort(key=len, reverse=True)

counts = {}

for ngram in ngramList:
    words = ngram.rsplit()
    pattern = re.compile(r'%s' % "\s+".join(words), re.IGNORECASE)
    s, n = re.subn(pattern, '', s)
    counts[ngram] = n

print(counts)

Как указывает Виктор в комментариях, вы можете улучшить свой шаблон регулярного выражения. Теперь шаблон также будет соответствовать слову log в слове key logging. Конечно, вы хотите заключить токен в разрывы слов:

pattern = re.compile(r"\b(?:{})\b".format(r"\s+".join(ngram.split())), re.IGNORECASE) 

Это верно. Однако я считаю, что pattern = re.compile(r"\b(?:{})\b".format(r"\s+".join(ngram.split())),‌​re.IGNORECASE) будет лучше, поскольку он не учитывает log в logging.

Wiktor Stribiżew 20.11.2018 10:53

Совершенно верно. Я добавил это как комментарий.

Bram Vanroy 20.11.2018 11:44

Кстати, OP, похоже, убежден, что r'%s' % "\s+"... необходим для создания необработанного строкового литерала. Это избыточно, и r'%s' % можно не использовать.

Wiktor Stribiżew 20.11.2018 11:47

Другие вопросы по теме