Слово токенизация с использованием регулярных выражений Python - PullRequest
14 голосов
/ 01 июня 2011

Я пытаюсь разбить строки на списки "тегов" в Python.Разделение должно обрабатывать такие строки, как «HappyBirthday» и удалять большинство знаков препинания, но сохранять дефисы и апострофы.Моя отправная точка:

tags = re.findall("([A-Z]{2,}(?=[A-Z]|$)|[A-Z][a-z]*)|\w+-\w+|[\w']+"

Я хотел бы включить этот пример данных:

Jeff's dog is un-American SomeTimes! BUT NOTAlways

В:

['Jeff's', 'dog', 'is', 'un-American', 'Some', 'Times', 'BUT', 'NOT', 'Always']

PS Мне жаль, что мое описание нене очень хорошоЯ не уверен, как это объяснить, и в основном не удалось Google.Я надеюсь, что пример иллюстрирует это должным образом.

Редактировать: я думаю, что мне нужно было быть более точным, а также,

  1. , если слово заштриховано и заглавно, как 'UN-American'будет ли оно сохранено как одно слово, так что вывод будет' UN-American '
  2. , если дефис имеет пробел с одной или с обеих сторон, a' THIS- is 'или' This - is 'он долженигнорируйте гипс и производите ["THIS", "is"] и ["This", "is"] с уважением,
  3. и одинаково для апострофа, если он находится в середине слова, такого как "whatItCalled""это должно произвести [" Что "," Это "," Называется "]

Ответы [ 2 ]

22 голосов
/ 01 июня 2011

Я предлагаю следующее:

re.findall("[A-Z]{2,}(?![a-z])|[A-Z][a-z]+(?=[A-Z])|[\'\w\-]+",s)

Это дает для вашего примера:

["Jeff's", 'dog', 'is', 'un-American', 'Some', 'Times', 'BUT', 'NOT', 'Always']

Объяснение: RegExp состоит из 3 альтернатив:

  1. [A-Z]{2,}(?![a-z]) соответствует словам со всеми буквами заглавными
  2. [A-Z][a-z]+(?=[A-Z]) сопоставляет слова с первой буквой. Смотритель (?=[A-Z]) останавливает матч до следующей заглавной буквы
  3. [\'\w\-]+ соответствует всем остальным, то есть словам, которые могут содержать ' и -.
1 голос
/ 01 июня 2011

Чтобы обработать ваши отредактированные случаи, я бы изменил phynfo (+1) отличный ответ на

>>> s = """Jeff's UN-American Un-American un-American 
           SomeTimes! BUT NOTAlways This- THIS- 
           What'sItCalled someTimes"""
>>> re.findall("[A-Z\-\']{2,}(?![a-z])|[A-Z\-\'][a-z\-\']+(?=[A-Z])|[\'\w\-]+",s)
["Jeff's", 'UN-', 'American', 'Un-', 'American', 'un-American', 
 'Some', 'Times', 'BUT', 'NOT', 'Always', 'This-', 'THIS-', 
 "What's", 'It', 'Called' 'someTimes']

Вы должны четко определить правила для желаемого поведения. Токенизация не является определением, вы должны иметь что-то похожее на правила phynfo. Например, у вас есть правило, что 'NOTAlways' должно переходить к 'NOT' и 'Always', и что дефисы должны быть сохранены. Таким образом, 'UN-American' разделен, как UNAmerican будет разделен. Вы можете попытаться определить дополнительные правила, но у вас должно быть четкое представление о том, какое правило применяется, когда правила перекрываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...