Вы можете изменить поведение токенизатора nltk, изменив регулярное выражение для знаков препинания:
from nltk.tokenize import TreebankWordTokenizer
import re
tokenizer = TreebankWordTokenizer()
tokenizer.PUNCTUATION = [
(re.compile(r"([:,])([^\d])"), r" \1 \2"),
(re.compile(r"([:,])$"), r" \1 "),
(re.compile(r"\.\.\."), r" ... "),
(re.compile(r"[;@$%&]"), r" \g<0> "),
(
re.compile(r'([^\.])(\.)([\]\)}>"\']*)\s*$'),
r"\1 \2\3 ",
), # Handles the final period.
(re.compile(r"[?!]"), r" \g<0> "),
(re.compile(r"([^'])' "), r"\1 ' "),
]
text = 'My favorite programming languages are c# and c++'
tokens = tokenizer.tokenize(text)
print(tokens)
Вывод:
['My', 'favorite', 'programming', 'languages', 'are', 'c#', 'and', 'c++']