2010-09-13 15 views
8

¿Cuál sería la mejor expresión regular para tokenizar un texto en inglés?Regexp para Tokenizing English Text

Con un token en inglés, me refiero a un átomo que consiste en la cantidad máxima de caracteres que pueden usarse de manera significativa para fines de PNL. Una analogía es un "token" en cualquier lenguaje de programación (por ejemplo, en C, '{', '[', 'hello', '&', etc. pueden ser tokens). Hay una restricción: aunque los caracteres de puntuación en inglés pueden ser "significativos", ignóremoslos por simplicidad cuando no aparecen en el medio de \ w +. Entonces, "Hola, mundo". produce 'hola' y 'mundo'; de manera similar, "Eres guapo". puede ceder ya sea [usted, es guapo] o [usted, es, bueno, buscando].

+0

Consulte [esta pregunta] (http://stackoverflow.com/questions/992176/c-tokenize-a-string-using-a-regular-expression) sobre tokening en C++ utilizando Roost.Regex. – Lazer

+1

posible duplicado de [¿Definición verdadera de una palabra en inglés?] (Http://stackoverflow.com/questions/3690195/true-definition-of-an-spanish-word) –

+0

@OTZ en inglés ¿Qué es un token si no es un ¿palabra? –

Respuesta

2

Probablemente no deba tratar de usar una expresión regular para el texto en inglés. En inglés, algunos tokens tienen diferentes significados y solo se puede saber cuál es el correcto al comprender el contexto en el que se encuentran, y eso requiere comprender el significado del texto hasta cierto punto. Ejemplos:

  • El carácter ' podría ser un apóstrofo o podría utilizarse como comilla simple para citar texto.
  • El período podría ser el final de una oración o podría significar una abreviación. O en algunos casos podría cumplir ambos roles simultáneamente.

Pruebe un analizador de lenguaje natural en su lugar. Por ejemplo, podría usar el Stanford Parser. Es de uso gratuito y hará un trabajo mucho mejor que cualquier expresión regular al tokenizar texto en inglés. Sin embargo, ese es solo un ejemplo: también hay muchas otras bibliotecas de PNL que podrías usar.

+0

tokenizing! = Análisis. Está hablando de lexing (a menos que me pierda mi suposición). –

+0

@ Nathan, tienes ese derecho. Byers se refiere a un etiquetador, que no es mi foco. – OTZ

+1

@Paul Nathan: No puede * con precisión * tokenizar texto en inglés con una expresión regular. Si solo quiere que funcione algunas veces y no le importan los errores, probablemente pueda salirse con la suya con una expresión regular simple. Si quieres que funcione la mayor parte del tiempo, entonces necesitas algo más poderoso. Podría seguir ampliando la expresión regular para cubrir cada vez más casos especiales, pero dado que las soluciones más potentes ya existen y son gratuitas, ¿por qué no utilizarlas desde el principio? –

1

Puede dividir en [^\p{L}]+. Se dividirá en cada grupo de caracteres que no contenga letras.


Recursos:

+0

¿Qué está haciendo? ¿Qué biblioteca de expresiones regulares del idioma está usando? – OTZ

0

Hay cierto grado de complejidad.

Una palabra tendrá [A-Za-z0-9\-]. ¡Pero puede tener otros delimitadores además de la palabra! Puede comenzar con [(\s] y terminar con [),.-\s?:;!]

+0

Noooo. No hagas esto Use \ b en su lugar. Coincide con un límite de palabras. Por lo tanto, esto coincidiría con una palabra: \ b. +? \ B –

+0

'\ b' no funcionará correctamente si la palabra contiene caracteres que no sean ASCII. –

+0

@Rohan: Eso no funcionará para palabras con guiones o palabras apostrofadas. Además, esto es * no * una Perl regex completa. Esta es una * muestra regex * destinada a demostrar en una sintaxis distinta de Perl un subconjunto de posibilidad. –

5

Treebank Tokenization

Penn Treebank (PTB) tokenization es un esquema tokenización razonablemente común que se utiliza para el procesamiento del lenguaje natural de trabajo (PNL).

Puede encontrar un script sed con las expresiones regulares apropiadas para obtener esta tokenización here.

paquetes de software

Sin embargo, la mayoría de los paquetes de PNL proporcionan listos para usar tokenizers, por lo que realmente no necesitan escribir su propio. Por ejemplo, si usa Python, puede usar el TreebankWordTokenizer provisto con NLTK. Si está utilizando el Java basado en Stanford Parser, de forma predeterminada convertirá en tokenize cualquier oración que le dé usando su edu.stanford.nlp.processor.PTBTokenizer.

+0

Gracias por darnos un puntero al método de tokenización de PTB. Si bien no enumeran cuáles son esas "sutilezas" en guiones y guiones, y no estoy seguro de si "no" - "no" o "va -> gon na" es apropiado, puede ser un principiante +1 – OTZ