2009-11-11 13 views
5

Mi piacerebbe trovare un buon modo per trovare alcune frasi (lasciate che siano due) in un testo. Cosa sarà meglio - usare regexp o split-method? Le tue idee?trovare alcune frasi

come richiesto da Jeremy Stein - Ci sono alcuni esempi

Esempi:

ingresso:

La prima cosa da fare è quello di creare il modello commento. Creeremo questo nel modo normale, ma con una piccola differenza. Se stessimo creando commenti per un articolo avremmo un campo intero chiamato article_id nel modello per memorizzare la chiave esterna, ma in questo caso avremo bisogno di qualcosa di più astratto.

prime due frasi:

La prima cosa da fare è quello di creare il modello commento. Creeremo questo nel modo normale, ma con una piccola differenza.

ingresso:

Mr. T è uno significa tizio. Non oso litigare con lui.

prime due frasi:

Mr. T è uno significa tizio. Non oso litigare con lui.

ingresso:

La corrente continua, Sniper è stato eseguito è stato giustiziato mediante iniezione letale in una prigione della Virginia. La morte è stata pronunciata alle 9:11 pm ET.

prime due frasi:

La corrente continua, Sniper è stato eseguito è stato giustiziato mediante iniezione letale in una prigione della Virginia. La morte è stata pronunciata alle 9:11 pm ET.

ingresso:

Nelle sue osservazioni conclusive, l'avvocato avversario ha detto che "... in questo e in tanti altri casi, due torti non farà un diritto." La giuria sembrava essere d'accordo.

prime due frasi:

Nelle sue osservazioni conclusive, l'avvocato avversario ha detto che "... in questo e in tanti altri casi, due torti non farà un diritto." La giuria sembrava essere d'accordo.

Ragazzi, come potete vedere, non è così facile determinare due frasi dal testo. :(

+0

Qual è il tuo contributo? Come vuoi che sia la tua produzione? –

+0

qualsiasi testo. Ho bisogno delle prime 2 (o forse più) frasi di questo testo –

risposta

0

Se si sa cosa cercare frasi, Regex dovrebbe fare bene alla ricerca di

((YOUR SENTENCE HERE)|(YOUR OTHER SENTENCE)){1} 

Spalato sarebbe probabilmente usare un bel po 'di memoria, in quanto consente di risparmiare anche le cose che non è necessario (tutto il testo che non è la tua frase) come Regex salva solo la frase cercata (se lo trova, ovviamente)

+0

Ho semplicemente bisogno di trovare 2 frasi diverse nel testo selezionato. Ad esempio "La prima cosa da fare è creare il modello Comment. Lo creeremo normalmente, ma con una piccola differenza: se creessimo solo commenti per un articolo avremmo un campo intero chiamato article_id in il modello per memorizzare la chiave esterna, ma in questo caso avremo bisogno di qualcosa di più astratto. "- Ho bisogno solo di 2 frasi -" La prima cosa ... "e" Creeremo questo ... " –

+0

Tutte le frasi divise per "." (Punto e spazio). Ho solo bisogno del primo 2 di tutto. –

+0

Quindi, non sai quali frasi, ma sai che ce ne sono due? Sembrava che tu stia cercando due frasi particolari. – Kobi

3
your_string = "First sentence. Second sentence. Third sentence" 
sentences = your_string.split(".") 
=> ["First sentence", " Second sentence", " Third sentence"] 

non c'è bisogno di rendere il codice semplice complicato.

Modifica: Ora che hai chiarito che l'input reale è più complesso del tuo esempio iniziale, devi ignorare questa risposta in quanto non considera casi limite. Una prima occhiata a NLP dovrebbe mostrarti in cosa ti stai concentrando.

Alcuni dei casi limite che ho visto in passato per essere un po 'complicato sono:

  • Date: Alcune regioni utilizzano gg.mm.aaaa
  • Citazioni: Mentre sospirava — "In ogni caso, fallo. Ora. A proposito ...". Questo era abbastanza
  • Unità: Stava andando a 138 km. mentre si guida in autostrada.

Se si pianifica di analizzare questi testi, è necessario evitare le suddivisioni o le espressioni regolari.

+0

ok, ma per quanto riguarda your_string = "Prima frase ...... Seconda frase ... Terza frase" ??? forse sarà meglio frasi = your_string.split (".") ??? –

+0

intendo con spazio aggiuntivo –

+0

È necessario preoccuparsi anche delle ellissi. – Garrett

1
irb(main):005:0> a = "The first sentence. The second sentence. And the third" 
irb(main):006:0> a.split(".")[0...2] 
=> ["The first sentence", " The second sentence"] 
irb(main):007:0> 

EDIT: ecco come si gestisce la "Questa è una frase ...... e un altro e un altro ...." Caso:

irb(main):001:0> a = "This is the first sentence ....... And the second. Let's not forget the third" 
=> "This is the first sentence ....... And the second. Let's not forget the thir 
d" 
irb(main):002:0> a.split(/\.+/) 
=> ["This is the first sentence ", " And the second", " Let's not forget the thi rd"] 

E si può applicare lo stesso operatore della gamma ... per estrarre il primo 2.

+0

Ti sei imbattuto in un problema con "Il signor Smith ha aiutato la signora Smith a parlare con il dott. Frankenstein della vittoria di H.M.S." – ealdent

+0

Forse sarebbe necessaria una parola tokenizzazione. – Geo

0

Se si segmenta una parte di testo in frasi, allora ciò che si vuole fare è iniziare determinando quali segni di punteggiatura possono separare le frasi. In generale, questo è !, ? e . (ma se tutto quello che ti interessa è un . per i testi che stai elaborando, poi vai con quello).

Ora che questi possono apparire all'interno di virgolette o parti di abbreviazioni, ciò che si vuole fare è trovare ogni occorrenza di questi segni di punteggiatura ed eseguire una sorta di classificatore di apprendimento automatico per determinare se tale occorrenza inizia una nuova frase, o se fa qualcos'altro Ciò comporta l'addestramento di dati e un classificatore correttamente costruito. E non sarà preciso al 100%, perché probabilmente non c'è modo di essere accurati al 100%.

Suggerisco di consultare la letteratura per le tecniche di segmentazione della frase e dare un'occhiata ai vari toolkit di elaborazione del linguaggio naturale che sono disponibili. Non ho ancora trovato uno per Ruby, ma mi capita di gradire OpenNLP (che è in Java).

1

Questo di solito corrisponde alle frasi.

/\S(?:(?![.?!]+\s).)*[.?!]+(?=\s|$)/m 

Per il tuo esempio di due frasi, prendi le prime due partite.

4

Come hai notato, la tokenizzazione della frase è un po 'più complicata di quanto possa sembrare. Quindi puoi anche approfittare delle soluzioni esistenti. L'algoritmo di tokenizzazione della frase Punkt è molto popolare in PNL, e c'è una buona implementazione in Python Natural Language Toolkit che descrivono l'uso di here. Descrivono anche un altro approccio here.

Probabilmente ci sono altre implementazioni in giro, oppure si potrebbe anche leggere l'originale paper descrivendo l'algoritmo di Punkt: Kiss, Tibor e Strunk, Jan (2006): Rilevamento di confini di frasi multilingue senza supervisione. Linguistica computazionale 32: 485-525.

È inoltre possibile leggere un'altra domanda di overflow dello stack relativa alla tokenizzazione della frase here.

+0

Ottima risposta. –