Что такое правильный алгоритм токенизации?& Error: TypeError: приведение к Unicode: нужна строка или буфер, список найден - PullRequest
0 голосов
/ 31 октября 2010

Я выполняю задачу поиска информации.В рамках предварительной обработки я хочу сделать.

  1. Удаление стоп-слов
  2. Токенизация
  3. Stemming (Porter Stemmer)

Изначально я пропустил токенизацию.В результате я получил такие термины:

broker
broker'
broker,
broker.
broker/deal
broker/dealer'
broker/dealer,
broker/dealer.
broker/dealer;
broker/dealers),
broker/dealers,
broker/dealers.
brokerag
brokerage,
broker-deal
broker-dealer,
broker-dealers,
broker-dealers.
brokered.
brokers,
brokers.

Итак, теперь я осознал важность токенизации.Есть ли какой-нибудь стандартный алгоритм токенизации для английского языка?Основано на string.whitespace и широко используемых знаках препинания.Я написал

def Tokenize(text):
    words = text.split(['.',',', '?', '!', ':', ';', '-','_', '(', ')', '[', ']', '\'', '`', '"', '/',' ','\t','\n','\x0b','\x0c','\r'])    
    return [word.strip() for word in words if word.strip() != '']
  1. Я получаю TypeError: coercing to Unicode: need string or buffer, list found ошибку!
  2. Как можно улучшить эту процедуру токенизации?

Ответы [ 2 ]

1 голос
/ 31 октября 2010

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

def Tokenize(text):
    words = re.split(r'[-\.,?!:;_()\[\]\'`"/\t\n\r \x0b\x0c]+', text)
    return [word.strip() for word in words if word.strip() != '']

Это может быть улучшено различными способами, такими как правильная обработка сокращений:

>>> Tokenize('U.S.')
['U', 'S']

И следите за тем, что вы делаете с чертой (-). Рассмотрим:

>>> Tokenize('A-level')
['A', 'level']

Если в вашем стоп-листе присутствует 'A' или 'a', это значение будет уменьшено до level.

Я предлагаю вам проверить Обработка естественного языка с Python , глава 3 и набор инструментов NLTK .

0 голосов
/ 31 октября 2010

Как упоминает Ларсман, в ntlk есть множество различных токенизаторов, которые принимают различные опции.Используя значение по умолчанию:

>>> import nltk
>>> words = nltk.wordpunct_tokenize('''
... broker
... broker'
... broker,
... broker.
... broker/deal
... broker/dealer'
... broker/dealer,
... broker/dealer.
... broker/dealer;
... broker/dealers),
... broker/dealers,
... broker/dealers.
... brokerag
... brokerage,
... broker-deal
... broker-dealer,
... broker-dealers,
... broker-dealers.
... brokered.
... brokers,
... brokers.
... ''')
['broker', 'broker', "'", 'broker', ',', 'broker', '.', 'broker', '/', 'deal',       'broker', '/', 'dealer', "'", 'broker', '/', 'dealer', ',', 'broker', '/', 'dealer', '.', 'broker', '/', 'dealer', ';', 'broker', '/', 'dealers', '),', 'broker', '/', 'dealers', ',', 'broker', '/', 'dealers', '.', 'brokerag', 'brokerage', ',', 'broker', '-', 'deal', 'broker', '-', 'dealer', ',', 'broker', '-', 'dealers', ',', 'broker', '-', 'dealers', '.', 'brokered', '.', 'brokers', ',', 'brokers', '.']

Если вы хотите отфильтровать элементы списка только с пунктуацией, вы можете сделать что-то вроде этого:

>>> filter_chars = "',.;()-/"
>>> def is_only_punctuation(s):
        '''
        returns bool(set(s) is not a subset of set(filter_chars))
        '''
        return not set(list(i)) < set(list(filter_chars))
>>> filter(is_only_punctuation, words)

возвращает

>>> ['broker', 'broker', 'broker', 'broker', 'broker', 'deal', 'broker', 'dealer', 'broker', 'dealer', 'broker', 'dealer', 'broker', 'dealer', 'broker', 'dealers', 'broker', 'dealers', 'broker', 'dealers', 'brokerag', 'brokerage', 'broker', 'deal', 'broker', 'dealer', 'broker', 'dealers', 'broker', 'dealers', 'brokered', 'brokers', 'brokers']
...