Как маркировать составные слова?

#python #python-3.x #regex #tokenize

#python #python-3.x #регулярное выражение #маркировать

Вопрос:

Имея исходный элемент списка, такой как ["southnorth"] , я хотел бы добавить пробел на основе списка ["south", "north", "island"] . Затем список будет изменен с ['southnorth'] на ['south','north'] столько, сколько содержит список, на котором мы основываем токенизацию ['south', 'north'] .

Однако, если есть список ["south", "island"] , то список ["southnorth"] должен храниться вместе, как есть.

Я подумал о чем-то, как следует:

 list1= ['southnorth']
#list2= ['south','north','island']
list2=['south','island']

str1= " ".join(list1)
str2= " ".join(list2)

Get the alternators to apply regex:
list_compound = sorted(list1   list2, key=len)
alternators = '|'.join(map(re.escape, list_compound)
regex = re.compile(r''.format(alternators)

str1_split = re.sub(r'({})'.format(alternators),r'1 ',str1,0, re.IGNORECASE)

str2_split = re.sub(r'({})'.format(alternators),r'1 ',str2,0, re.IGNORECASE)
 

Однако вышеприведенное не выполняется, потому что мне нужно обеспечить порядок последовательностей. Например, для декомпозиции ["southnorth"] мне нужно убедиться, что другой список имеет ["south", "north"] . В противном случае сохраните его в исходном виде.

Комментарии:

1. Может ли у вас быть более двух частей в объединенной строке?

2. Что, если ваша строка southwestnorth ? Вы ожидаете, что результат будет southwest north или south westnorth ?

3. Я бы сохранил исходную форму southwestnorth , потому что единственный способ токенизации — это то, что south и north были смежными.

Ответ №1:

Не самое красивое решение и, вероятно, не самое эффективное, но вот тривиальная попытка грубой силы:

 def tokenize(word, tokens):
    tokenized_word = word
    for t in tokens:
        tokenized_word = tokenized_word.replace(t, f"{t} ").strip()

    for w in tokenized_word.split(" "):
        if w.strip() not in tokens:
            return word

    return tokenized_word


tokens = ["south", "north", "island"]

assert tokenize("south", tokens) == "south"
assert tokenize("southnorth", tokens) == "south north"
assert tokenize("islandsouthnorth", tokens) == "island south north"
assert tokenize("southwestnorth", tokens) == "southwestnorth"