Boa técnica para tokenização de texto de pesquisa

8

Estamos procurando uma maneira de tokenizar algum texto da mesma maneira ou semelhante à que um mecanismo de pesquisa faria.

A razão pela qual estamos fazendo isso é para que possamos executar algumas análises estatísticas nos tokens. A linguagem que estamos usando é python, portanto, preferiria uma técnica que funcione nessa linguagem, mas provavelmente poderia configurar algo para usar outra linguagem, se necessário.

Exemplo

Token original:

Temos ótimos burritos!

Mais simplificado: (remova plurais e pontuação)

Temos um ótimo burrito

Ainda mais simplificado: (remova palavras supérfluas)

grande burrito

Melhor: (reconhecer significado positivo e negativo):

burrito -positivo-
Chris Dutrow
fonte
Olhe para os combinadores de analisadores, aqui está uma biblioteca de combinadores de analisadores para python valuedlessons.com/2008/02/… e outra aqui combinadores de analisadores pyparsing.wikispaces.com permitem uma abordagem quase DSL à análise com base em tentativas de correspondência semelhantes à regexp, mas muito mais flexível / poderoso
Jimmy Hoffa
A outra abordagem que vem à mente (mas parece um pouco ... engraçada ...) é simplesmente escrever um banco de dados de tokens no qual você tenha os tokens exclusivos que deseja em uma tabela e uma tabela de lista negra para os tokens e uma lista branca tabela para tokens duplicados em que você possui um ID que mapeia muitos tokens para um dos registros de token nos tokens que deseja na tabela. Basicamente, um banco de dados de dicionário que traduz entre os dois idiomas que você deseja, onde um dos idiomas é apenas o vocabulário minimizado que "ótimo" "impressionante" "fantástico" traduzem todos para a mesma coisa em "-positivo-"
Jimmy Hoffa

Respostas:

7

O Python possui um ótimo kit de ferramentas de linguagem natural, o NLTK . Ele suporta a tokenização de palavras pronta para uso:

>>> import nltk
>>> input = 'We have some great burritos!'
>>> tokens = nltk.word_tokenize(input)
>>> tokens
['We', 'have', 'some', 'great', 'burritos', '!']
>>> nltk.pos_tag(tokens)
[('We', 'PRP'), ('have', 'VBP'), ('some', 'DT'), ('great', 'JJ'), ('burritos', 'NNS'), ('!', '.')]

A última estrutura inclui tags de idioma natural, que permitem excluir palavras de consideração com base em sua classificação. Você provavelmente deseja focar nas tags JJ(adjetivo) e NN-prefixed (noun).

A partir daí, você pode aplicar o stemming e detectar adjetivos positivos e negativos.

Acredito que, para a classificação adjetiva, no entanto, você precisará criar seu próprio corpus a partir de recursos online como este ; a biblioteca fornece as ferramentas para isso.

Aqui está um exemplo derivado usando o algoritmo de derivação Porter:

>>> from nltk.stem.porter import PorterStemmer
>>> PorterStemmer().stem('burritos')
'burrito'

O'Reilly publicou um livro na biblioteca, agora disponível online .

Martijn Pieters
fonte