2015-03-26 6 views
6

Определяет ли TfidfVectorizer n-граммы с использованием python regular expressions?Тонковый шаблон для n-грамма в TfidfVectorizer в python

Эта проблема возникает при чтении документации для scikit-learn TfidfVectorizer. Я вижу, что шаблон для распознавания n-граммов на уровне слова - token_pattern=u'(?u)\b\w\w+\b'. У меня возникли проблемы с тем, как это работает. Рассмотрим случай с двумя графами. Если я это сделаю:

In [1]: import re 
    In [2]: re.findall(u'(?u)\b\w\w+\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 предполагается:

\ б соответствует пустой строке, но только в начале или в конце слова. Слово определяется как последовательность буквенно-цифровых символов или символов подчеркивания, поэтому конец слова обозначается пробелом или буквенным или несимвольным символом.

Я вижу вопросы решения проблемы идентификации п-граммы в питоне (см 1, 2), поэтому вопрос второстепенный: Я должен сделать это и добавить присоединился н-г перед кормлением моего текста 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'] 

Это является known bug in the documentation, но если вы посмотрите на source code они используют сырые литералы.