Python создает регулярное выражение из списка и его вариаций

1

У меня есть список месяцев на латыни:

latinMonths = ['januarii', 'februarii','martii', 'aprilis', 'maii', 'junii', 'julii', 'augusti', 'septembris', 'octobris', 'novembris', 'decembris']

которые, к сожалению, в моем тексте я нахожу, что их варианты различаются по-разному: "januarij" или "septembrjs" и т.д....

Я пытаюсь отсканировать текст, чтобы найти точное слово в виде списка или его вариантов.

Я знаю, что могу использовать difflib и обнаружил, что могу проверить предложение со списком слов в этом сообщении: Python: как определить, существует ли список слов в строке. Есть ли способ, которым я могу объединить оба, таким образом находя экземпляр в строке, где существуют месяцы в списке или ее вариациях?

ex: Если у меня есть текст "primo januarij 1487", я хотел бы вернуть true, поскольку januarij - это близкое совпадение с январем, а если у меня есть "я люблю помидоры", ни одно из слов не является близким совпадением или точным соответствием словам в список

  • 1
    Я не совсем понимаю, что вы пытаетесь сделать. Можете привести пример?
  • 2
    Я думаю, что вы, возможно, захотите сопоставить все слова на расстоянии 1 слева от слов в вашем списке. Наивный, но рабочий способ сделать это состоит в том, чтобы разбить ваш текст на список слов и вычислить для каждого слова расстояние до всех месяцев.
Показать ещё 4 комментария
Теги:
list
difflib

1 ответ

1

Возможное решение может быть достигнуто с помощью fuzzywuzzy следующим образом:

from fuzzywuzzy import fuzz

def fuzzy_months(text:str, months:list, treshold:float = 0.9)->bool:
    """Return if a word within the given text is close enough to any given month."""
    return max([fuzz.ratio(month,word) for month in latinMonths for word in test_string.split()])/100>= treshold

Например, принимая во внимание следующие фразы test_string = 'lorem ipsum siptum abet septembrjs' и fail_string = 'do you want to eat at McDonald?' :

fuzzy_months(test_string, latinMonths)
>>> True

fuzzy_months(fail_string, latinMonths)
>>> False

Ещё вопросы

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