Domanda

Stringa di input:Un soldato può avere lividi, ferite, segni, lussazioni o altre lesioni che lo feriscono.

Risultato previsto:
lividi
ferite
segni
dislocazioni
Lesioni

Modello generalizzato provato:

       ".[\s]?(\w+?)"+                 // bruises.
      "(?:(\s)?,(\s)?(\w+?))*"+             // wounds marks dislocations
      "[\s]?(?:or|and) other (\w+).";     // Injuries

Il modello dovrebbe essere in grado di corrispondere ad altre stringhe di input come: Un soldato può avere lividi o altre ferite che lo feriscono.

Provando il modello generalizzato sopra, l'output è:Infortunie di dislocazioni contusioni

C'è qualcosa di sbagliato nel gruppo di acquisizione per "(?:(\s)?,(\s)?(\w+?))*".Il gruppo di cattura ha un'altra occorrenza..ma restituisce solo "dislocazioni"."segni" e "dislocazione:vengono divorati.

Potresti suggerire quale dovrebbe essere il modello giusto e dov'è l'errore?Questa domanda si avvicina di più a questa domanda, ma quella soluzione non ha aiutato.

Grazie.

È stato utile?

Soluzione

Quando il gruppo di cattura è annotata con un quantificatore [cioè: (foo) *], allora si otterrà solo l'ultima partita. Se si voleva ottenere tutti loro quindi è necessario quantificatore all'interno della cattura e poi si dovrà analizzare manualmente i valori. Come grande fan, come io lo sono di regex, non credo che sia opportuno qui per una serie di ragioni ... anche se non sono stati in ultima analisi, facendo NLP.

Come risolvere: (:???? (\ S), (\ s) (\ w +)) *

Bene, il quantificatore copre praticamente l'intera espressione regolare in quel caso e si potrebbe anche usare Matcher.find () per scorrere ogni partita. Inoltre, io sono curioso di sapere perchè avete gruppi di cattura per gli spazi. Se tutti si sta cercando di fare è trovare un set separato da virgole di parole allora questo è qualcosa di simile a: \ w + (?: \ S *, \ s * \ w +) * Quindi non perdete tempo con i gruppi di cattura e basta dividere l'intera partita.

E per qualcosa di più complicato Re: NLP, GATE è uno strumento molto potente. La curva di apprendimento è ripida a volte, ma si dispone di un intero settore della scienza-ragazzi a cui attingere: http: // cancello. ac.uk/

Altri suggerimenti

Regex non è adatto per l'elaborazione del linguaggio (naturale).Con le espressioni regolari puoi abbinare solo modelli ben definiti.Dovresti davvero, davvero abbandonare l'idea di farlo con regex.

Potresti voler iniziare una nuova domanda in cui specifichi quale linguaggio di programmazione stai utilizzando per eseguire questa attività e chiedere suggerimenti lì.

MODIFICARE

PVelocità ha pubblicato un collegamento promettente a una libreria di terze parti, Cancello, è in grado di eseguire molte attività di elaborazione del linguaggio.Ed è scritto in Java.Non l'ho usato personalmente, ma guardando le persone/istituzioni che ci lavorano, sembra piuttosto solido.

Il modello che funziona è: \ w + (?: \ S *, \ s * \ w +) * e CSV poi separati manualmente Non esiste un altro metodo per fare questo con Java Regex.

Idealmente, Java espressione regolare non è adatto per la PNL. Uno strumento utile per il text mining è: gate.ac.uk
Grazie a Bart K., e PSpeed.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top