2015-05-30 2 views
1

Есть ли способ сказать #textblob не разделить схватки как let's в let & 's при создании ngrams? Я знаю, что они являются технически двумя отдельными словами, но я хотел бы сохранить их как один.Консервантов схваток с textblob ngrams

ответ

1

Похоже, у вас есть два варианта здесь:

Последний легче, но медленнее.

Изменение паттерна

TextBlob принимает NLTK tokenizers, и я больше знаком с теми, поэтому мы будем использовать. WordPunctTokenizer NLTK является RepexpTokenizer с рисунком "\\w+|[^\\w\\s]+":

>>> nltk.tokenize.RegexpTokenizer("\\w+|[^\\w\\s]+").tokenize("Let's check this out.") 
['Let', "'", 's', 'check', 'this', 'out', '.'] 

Перед дизъюнкции является \w+, что указывает на буквы. После дизъюнкции [^\w\s], который соответствует любому, что не является символом или пробелом, то есть пунктуацией.

Если вы хотите включить ' в словах, чтобы получить "let's", то вы можете просто добавить этот символ в слово символьной части дизъюнкции:

>>> nltk.tokenize.RegexpTokenizer("[\\w']+|[^\\w\\s]+").tokenize("Let's check this out.") 
["Let's", 'check', 'this', 'out', '.'] 

Постобработка

The Однако подход regex не идеален. Я подозреваю, что встроенный токенизатор TextBlob может быть немного лучше, чем мы могли бы взломать вместе с регулярным выражением. Если вы строго хотите взять сокращения в качестве одного токена, я рекомендую только пост-обработку TextBlob.

>>> tokens = ["Let", "'s", "check", "this", "out", "."] 
>>> def postproc(toks): 
...  toks_out = [] 
...  while len(toks) > 1: 
...    bigram = toks[:2] 
...    if bigram[1][0] == "'": 
...      toks_out.append("".join(bigram)) 
...      toks = toks[2:] 
...    else: 
...      toks_out.append(bigram[0]) 
...      toks = toks[1:] 
...  toks_out.extend(toks) 
...  return toks_out 
... 
>>> postproc(tokens) 
["Let's", 'check', 'this', 'out', '.'] 

Таким образом, вы получите исправление точно, что хотите фиксировать, но вся последующая обработка добавляет время выполнения к вашему коду.

+0

только что осуществил это - используя nltk tokenizers & ngrams. работал отлично - и теперь я могу отказаться от текстового блока из моего проекта! – nealrs

+0

Приятно слышать, и удачи! – Dan

+0

К сожалению, это не работает, где '' 'не является первым символом, например' doesn't' будет токенироваться в '[" does "," not "], но' postproc() 'doesn ' t обрабатывать этот случай. –

Смежные вопросы