Шаблон токена для n-грамма в TfidfVectorizer в python
определяет ли TfidfVectorizer n-граммы с помощью python регулярные выражения?
эта проблема возникает при чтении документации для scikit-learn TfidfVectorizer, Я вижу, что шаблон для распознавания n-граммы на уровне слова token_pattern=u'(?u)bww+b'
. Мне трудно понять, как это работает. Рассмотрим случай с биграммой. Если я это сделаю:
In [1]: import re
In [2]: re.findall(u'(?u)bww+b',u'this is a sentence! this is another one.')
Out[2]: []
Я не нахожу никаких биграмм. Тогда как:
In [2]: re.findall(u'(?u)w+ w*',u'this is a sentence! this is another one.')
Out[2]: [u'this is', u'a sentence', u'this is', u'another one']
находит некоторые (но не все, например u'is a'
и все остальные даже количество биграмм отсутствуют). Что я делаю неправильно, интерпретируя b
функции персонажа?
Примечание.:
Согласно документации модуля регулярных выражений,b
персонаж re предполагается:
B соответствует пустой строке, но только в начале или конце слова. Слово определяется как последовательность буквенно-цифровых или подчеркивающих символов, поэтому конец слова обозначается пробелом или буквы, без подчеркивания.
Я вижу вопросы, касающиеся проблемы идентификации n-граммов в python (см. 1,2), поэтому вторичный вопрос: Должен ли я сделать это и добавить Соединенные n-граммы перед подачей моего текста в TfidfVectorizer?
1 ответов
вы должны добавлять регулярные выражения с r
. Следующие работы:
>>> re.findall(r'(?u)\b\w\w+\b',u'this is a sentence! this is another one.')
[u'this', u'is', u'sentence', u'this', u'is', u'another', u'one']
Это известная ошибка в документации, но если вы посмотрите на исходный код они используют необработанные литералы.