Разбиение / токенизация предложения на строковые слова с особыми условиями - PullRequest
1 голос
/ 27 марта 2020

Я пытаюсь реализовать токенизатор для разделения строки слов.

У меня есть особые условия: разделительная пунктуация. ! ? в отдельную строку и разбить все символы, в которых есть пробел, например I have a dog!'-4@ -> 'I', 'have', 'a' , 'dog', !, "'-4@"

Примерно так .....

Я не планирую пытаться пакет nltk, и я посмотрел на re.split и re.findall, но для обоих случаев: re.split = Я не знаю, как выделить слова с пунктуацией рядом с ними, такие как 'Dog,' re.findall = Конечно, он распечатывает все совпадающие строки, но как насчет непревзойденных?

Если у вас, ребята, есть какие-либо предложения, я был бы очень рад их попробовать.

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Вы пытаетесь разделить на разделитель (пунктуацию), сохраняя его в конечном результате? Один из способов сделать это будет следующим:

import re
import string

sent = "I have a dog!'-4@"
punc_Str = str(string.punctuation)

print(re.split(r"([.,;:!^ ])", sent))

Это результат, который я получаю.

['I', ' ', 'have', ' ', 'a', ' ', 'dog', '!', "'-4@"]
0 голосов
/ 27 марта 2020

Попробуйте:

re.findall(r'[a-z]+|[.!?]|(?:(?![.!?])\S)+', txt, re.I)

Альтернативы в регулярном выражении:

  • [a-z]+ - непустая последовательность букв (игнорировать регистр),
  • [.!?] - любой (один) символ из вашего списка (обратите внимание, что в скобках не нужно указывать ни точку , ни '?'),
  • (?:(?![.!?])\S)+ - не пустая последовательность небелых символов, за исключением вашего списка.

Например, для текста, содержащего I have a dog!'-4@?. результат:

['I', 'have', 'a', 'dog', '!', "'-4@", '?', '.']
...