2010-09-13 7 views
8

Quale sarebbe la migliore espressione regolare per la tokenizzazione di un testo inglese?Regexp for Tokenizing English Text

Con un token inglese, si intende un atomo costituito dal numero massimo di caratteri che può essere utilizzato in modo significativo per scopi di pianificazione della rete. Un'analogia è un "token" in qualsiasi linguaggio di programmazione (ad esempio in C, '{', '[', 'hello', '&', ecc. Possono essere token). C'è una restrizione: sebbene i caratteri di punteggiatura inglesi possano essere "significativi", ignoriamoli per semplicità quando non appaiono nel mezzo di \ w +. Quindi, "Ciao, mondo." produce "buongiorno" e "mondo"; allo stesso modo, "Sei di bell'aspetto". può produrre o [tu, sei, di bell'aspetto] o [tu sei buono, bello].

+0

Vedere [questa domanda] (http://stackoverflow.com/questions/992176/c-tokenize-a-string-using-a-regular-expression) sul tokening in C++ utilizzando Roost.Regex. – Lazer

+1

possibile duplicato di [Vera definizione di una parola inglese?] (Http://stackoverflow.com/questions/3690195/true-definition-of-an-english-word) –

+0

@OTZ in inglese cosa è un token se non a parola? –

risposta

2

Probabilmente non si dovrebbe provare a utilizzare un'espressione regolare per la tokenizzazione del testo inglese. In inglese alcuni token hanno diversi significati e tu puoi solo sapere che è giusto comprendendo il contesto in cui sono stati trovati, e ciò richiede in una certa misura la comprensione del significato del testo. Esempi:

  • Il carattere ' potrebbe essere un apostrofo o potrebbe essere utilizzato come virgolette per citare del testo.
  • Il periodo potrebbe essere la fine di una frase o potrebbe indicare un'abbreviazione. O in alcuni casi potrebbe soddisfare entrambi i ruoli contemporaneamente.

Provare invece un parser di linguaggio naturale. Ad esempio, è possibile utilizzare lo Stanford Parser. È gratuito da usare e svolgerà un lavoro molto migliore di qualsiasi espressione regolare al tokenizing del testo inglese. Questo è solo un esempio: ci sono anche molte altre librerie NLP che potresti usare.

+0

tokenizing! = Parsing. Sta parlando di lexing (a meno che non mi sfugga la mia ipotesi). –

+0

@Nathan hai ragione. Byers si riferisce a un tagger, che non è il mio obiettivo. – OTZ

+1

@Paul Nathan: non puoi * accuratamente * tokenizzare il testo inglese usando un'espressione regolare. Se vuoi che funzioni solo un po 'di tempo e non ti preoccupi degli errori, puoi probabilmente farla franca usando una semplice espressione regolare. Se vuoi che funzioni la maggior parte del tempo allora hai bisogno di qualcosa di più potente. Potresti continuare ad estendere la regex per coprire sempre più casi speciali, ma visto che le soluzioni più potenti esistono già e sono libere, perché non utilizzarle fin dall'inizio? –

1

È possibile suddividere su [^\p{L}]+. Si dividerà su ciascun gruppo di caratteri che non contiene lettere.


Risorse:

+0

Cosa sta facendo? Quale libreria delle espressioni regolari di quella lingua stai usando? – OTZ

0

Ci sono alcune complessità.

Una parola avrà [A-Za-z0-9\-]. Ma potresti avere altri delimitatori oltre alla sola parola! Si può iniziare con [(\s] e terminare con [),.-\s?:;!]

+0

Noooo. Non farlo. Utilizzare invece \ b. Corrisponde a un limite di parole. Quindi questo corrisponderebbe a una parola: \ b. +? \ B –

+0

'\ b' non funzionerà correttamente se la parola contiene caratteri non ASCII! –

+0

@Rohan: Questo non funzionerà con le parole con trattino o con l'apostrofo delle parole. Inoltre, questo * non * è un regex completo di Perl. Questa è un'espressione regolare * del campione destinata a dimostrare in una sintassi non Perl un sottoinsieme di possibilità. –

5

Treebank Tokenizzazione

Penn Treebank (PTB) tokenization è uno schema tokenizzazione ragionevolmente comune utilizzato per l'elaborazione del linguaggio naturale di lavoro (NLP).

È possibile trovare uno script sed con le espressioni regolari appropriate per ottenere questa tokenizzazione here.

pacchetti software

Tuttavia, la maggior parte dei pacchetti di PNL forniscono pronto per l'uso tokenizers, in modo da non ha realmente bisogno di scrivere il proprio. Ad esempio, se stai usando Python puoi semplicemente usare lo TreebankWordTokenizer fornito con NLTK. Se si utilizza Java Stanford Parser, per impostazione predefinita tokenize qualsiasi frase viene fornita utilizzando il suo edu.stanford.nlp.processor.PTBTokenizer.

+0

Grazie per averci dato un puntatore al metodo di tokenizzazione PTB. Mentre non enumerano quelle "sottigliezze" su trattini o trattini e non sono sicuro che "non -> non" o "gonna -> gon na" sia appropriato, può essere un antipasto. +1 – OTZ