Domanda

Come faccio parse casi frasi frasi da un passo.

Ad esempio da questo passaggio

Conan Doyle ha detto che il personaggio di Holmes è stato ispirato dal dottor Joseph Bell, per il quale Doyle aveva lavorato come impiegato presso il Royal Infirmary di Edimburgo. Come Holmes, Campana è stato notato per il disegno di grandi conclusioni dalle più piccole osservazioni. [1] Michael Harrison ha sostenuto in un articolo del 1971 a Ellery Queen Mystery Magazine che il personaggio è stato ispirato da Wendell Scherer, un "detective di consulenza" in un caso di omicidio che avrebbe ricevuto una grande quantità di giornale attenzione in Inghilterra nel 1882.

Abbiamo bisogno di generare cose come Conan Doyle, Holmes, il dottor Joseph Bell, Wendell Scherr etc.

Io preferirei una soluzione Pythonic se possibile

È stato utile?

Soluzione

Questo tipo di trattamento può essere molto difficile. Questo semplice codice fa quasi la cosa giusta:

for s in re.finditer(r"([A-Z][a-z]+[. ]+)+([A-Z][a-z]+)?", text):
    print s.group(0)

produce:

Conan Doyle
Holmes
Dr. Joseph Bell
Doyle
Edinburgh Royal Infirmary. Like Holmes
Bell
Michael Harrison
Ellery Queen
Mystery Magazine
Wendell Scherer
England

Per includere "il dottor Joseph Bell", è necessario essere ok con il periodo nella stringa, che permette di "Royal Infirmary di Edimburgo. Come Holmes".

Ho avuto un problema simile:. separazione frasi

Altri suggerimenti

L'approccio "re" si esaurisce il vapore molto rapidamente. riconoscimento dell'entità di nome è un argomento molto complicato, ben oltre la portata di un SO rispondere. Se pensi di avere un buon approccio a questo problema, si prega di puntarlo verso Flann O'Brien alias Myles na cGopaleen, Sukarno, Harry S. Truman, J. Edgar Hoover, JK Rowling, il matematico L'Hopital, Joe di Maggio, Algernon Douglas-Montagu-Scott, e Hugo Max von und zu Graf Lerchenfeld auf Köfering und Schönberg.

Aggiorna In seguito è un "re" approccio basata su che trova molti casi più validi. Io ancora non credo che questo sia un buon approccio, però. N.B. Ho asciified nome del conte bavarese nel mio testo di esempio. Se qualcuno vuole davvero usare qualcosa come questo, essi dovrebbero lavorare in Unicode, e normalizzare gli spazi bianchi a un certo punto (sia in ingresso o in uscita).

import re

text1 = """Conan Doyle said that the character of Holmes was inspired by Dr. Joseph Bell, for whom Doyle had worked as a clerk at the Edinburgh Royal Infirmary. Like Holmes, Bell was noted for drawing large conclusions from the smallest observations.[1] Michael Harrison argued in a 1971 article in Ellery Queen's Mystery Magazine that the character was inspired by Wendell Scherer, a "consulting detective" in a murder case that allegedly received a great deal of newspaper attention in England in 1882."""

text2 = """Flann O'Brien a.k.a. Myles na cGopaleen, I Zingari, Sukarno and Suharto, Harry S. Truman, J. Edgar Hoover, J. K. Rowling, the mathematician L'Hopital, Joe di Maggio, Algernon Douglas-Montagu-Scott, and Hugo Max Graf von und zu Lerchenfeld auf Koefering und Schoenberg."""

pattern1 = r"(?:[A-Z][a-z]+[. ]+)+(?:[A-Z][a-z]+)?"

joiners = r"' - de la du von und zu auf van der na di il el bin binte abu etcetera".split()

pattern2 = r"""(?x)
    (?:
        (?:[ .]|\b%s\b)*
        (?:\b[a-z]*[A-Z][a-z]*\b)?
    )+
    """ % r'\b|\b'.join(joiners)

def get_names(pattern, text):
    for m in re.finditer(pattern, text):
        s = m.group(0).strip(" .'-")
        if s:
            yield s

for t in (text1, text2):
    print "*** text: ", t[:20], "..."
    print "=== Ned B"
    for s in re.finditer(pattern1):
        print repr(s.group(0))
    print "=== John M =="
    for name in get_names(pattern2, t):
        print repr(name)

Output:

C:\junk\so>\python26\python extract_names.py
*** text:  Conan Doyle said tha ...
=== Ned B
'Conan Doyle '
'Holmes '
'Dr. Joseph Bell'
'Doyle '
'Edinburgh Royal Infirmary. Like Holmes'
'Bell '
'Michael Harrison '
'Ellery Queen'
'Mystery Magazine '
'Wendell Scherer'
'England '
=== John M ==
'Conan Doyle'
'Holmes'
'Dr. Joseph Bell'
'Doyle'
'Edinburgh Royal Infirmary. Like Holmes'
'Bell'
'Michael Harrison'
'Ellery Queen'
'Mystery Magazine'
'Wendell Scherer'
'England'
*** text:  Flann O'Brien a.k.a. ...
=== Ned B
'Flann '
'Brien '
'Myles '
'Sukarno '
'Harry '
'Edgar Hoover'
'Joe '
'Algernon Douglas'
'Hugo Max Graf '
'Lerchenfeld '
'Koefering '
'Schoenberg.'
=== John M ==
"Flann O'Brien"
'Myles na cGopaleen'
'I Zingari'
'Sukarno'
'Suharto'
'Harry S. Truman'
'J. Edgar Hoover'
'J. K. Rowling'
"L'Hopital"
'Joe di Maggio'
'Algernon Douglas-Montagu-Scott'
'Hugo Max Graf von und zu Lerchenfeld auf Koefering und Schoenberg'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top