2012-04-20 8 views
6

Sto provando a dividere una frase/frase in una parola usando Regex.Come si divide una frase in parole usando Regex in C#

var phrase = "This isn't a test."; 
var words = Regex.Split(phrase, @"\W+").ToList(); 

parole contiene "Questa", "isn", "t", "a", "test"

Ovviamente è raccogliendo l'apostrofo e frazionamento su questo. Posso cambiare questo comportamento? Deve anche essere multilingue che supporta una varietà di lingue (spagnolo, francese, russo, coreano, ecc ...).

Ho bisogno di passare le parole in un correttore ortografico. Nello specifico Nhunspell.

return (from word in words let correct = _engine[langId].Spell(word) where !correct select word).ToList(); 
+0

Provare a dividere gli spazi invece? Avete un buon esempio di casi d'uso per dimostrare cosa deve gestire questo Regex? – mellamokb

+0

Sto passando le parole in un correttore ortografico, quindi ho bisogno di perdere la punteggiatura. – Dean

+0

Dato che si desidera dividere per un certo numero di lingue diverse, è necessario utilizzare un tokenizer che comprenda le suddette lingue. Nel tuo esempio, non è chiaramente una parola, ma in un'altra lingua il 'potrebbe normalmente non far parte della parola. La maggior parte delle librerie di controllo ortografico sono quindi dotate di Tokenizer o Parser che può fare questo lavoro per te. – jessehouwing

risposta

7

Se si desidera dividere in parole a fini di controllo ortografico, questa è una buona soluzione:

new Regex(@"[^\p{L}]*\p{Z}[^\p{L}]*") 

Fondamentalmente è possibile utilizzare Regex.Split utilizzando la regex precedente. Utilizza la sintassi Unicode in modo che possa funzionare in più lingue (non per la maggior parte asiatica però). E non romperà le parole con apostrofi o trattini.

4

Utilizzare Split().

words = phrase.Split(' '); 

Senza punteggiatura.

words = phrase.Split(new Char [] {' ', ',', '.', ':', , ';', '!', '?', '\t'}); 
1

Non sembra proprio che sia necessario un regex. Potresti semplicemente fare:

phrase.Split(" "); 
+0

Solo se si desidera la punteggiatura delle parole. –

1

Su cosa vuoi dividere? Spazi? Punteggiatura? Devi decidere quali sono i caratteri di stop. Una semplice regex che utilizza lo spazio e alcuni caratteri di punteggiatura sarebbe "[^.?!\s]+". Ciò si dividerebbe su punto, punto interrogativo, punto esclamativo e qualsiasi carattere di spazio bianco.

+0

Ho anche bisogno di considerare lo spagnolo che avrà esclamazioni e domande che sono capovolte. – Dean

+0

Quindi aggiungi quei caratteri all'elenco di caratteri all'interno di '[]' e dopo '^'. Quindi, per esempio "" [^.?! ¿¡\ S] "'. Probabilmente vorrai aggiungere parentesi, virgola, punto e virgola e molti altri caratteri di punteggiatura. Quella lista è i caratteri che * non vuoi * nelle tue parole. Il '^' all'inizio significa "non questi caratteri". Quindi dovrai aggiungere anche il carattere caret (^) alla lista. –

+0

Ok, vedrò cosa posso fare per ottenere un elenco di punteggiatura. Mi piace questo approccio. – Dean

1

Si può provare se si sta tentando di dividere solo in base agli spazi.

var words = Regex.Split(phrase, @"[^ ]+").ToList(); 

L'altro approccio è quello di aggiungere l'apostrofo aggiungendo che alla classe personaggio.

var words = Regex.Split(phrase, @"(\W|')+").ToList(); 

In caso contrario, c'è un motivo specifico che non è possibile utilizzare String.split()? Questo sembrerebbe molto più semplice. Inoltre, è anche possibile passare altri caratteri di punteggiatura (ad esempio dividere in. Nonché spazi).

var words = phrase.Split(' '); 
var words = phrase.Split(new char[] {' ', '.'}); 
0

Io non sono una persona di Java, ma si potrebbe provare ad escludere la punteggiatura, mentre la divisione sulla
spazi allo stesso tempo. Forse qualcosa del genere.

Queste sono espressioni regolari e espanse, le parole sono nel gruppo di cattura 1.
Effettuare una ricerca globale.

Unicode (conto doesen't per grafema di)

[\s\pP]* ([\pL\pN_-] (?: [\pL\pN_-] | \pP(?=[\pL\pN\pP_-]))*) 

Ascii

3

A causa del fatto che un numero di lingue utilizza regole molto complesse per raggruppare le parole in frasi e frasi, non è possibile fare affidamento su una semplice espressione regolare per ottenere tutte le parole da una parte di testo. Anche per una lingua come "semplice" come l'inglese correrai in una serie di casi angolari come:

  • Come gestire le parole come sei, non è dove ci sono due parole combinate e un numero di i caratteri sostituiscono con '.
  • Come gestire abbreviazioni come Signore Signora cioè
  • parole combinate usando '-'
  • parole accentate alla fine di una frase.

Cinese e giapponese (tra gli altri) sono notoriamente difficili da analizzare in questo modo, in quanto queste lingue non utilizzano spazi tra le parole, ma solo tra frasi.

Si consiglia di leggere su Text Segmentation e se la segmentazione è importante per investire in un correttore ortografico che può analizzare un intero testo o un motore di segmentazione del testo che può dividere le frasi in parole secondo le regole del linguaggio.

Non sono riuscito a trovare un motore di segmentazione multilingue basato su .NET con una ricerca rapida su google. Scusate.

0

Questo ha funzionato per me: [^(\d|\s|\W)]*

Problemi correlati