Как найти заголовки фраз из отрывка или группы абзацев - PullRequest
1 голос
/ 28 августа 2009

Как мне разобрать фразы в предложениях из отрывка.

Например, из этого отрывка

Конан Дойл сказал, что персонаж Холмса был вдохновлен доктором Джозефом Беллом, для которого Дойл работал клерком в Королевском лазарете в Эдинбурге. Как и Холмс, Белл был известен тем, что делал большие выводы из самых маленьких наблюдений. [1] Майкл Харрисон утверждал в статье 1971 года в Mystery Magazine Ellery Queen, что персонаж был вдохновлен Уэнделлом Шерером, «детективом-консультантом» по делу об убийстве, которое якобы получило большое внимание газет в Англии в 1882 году.

Нам нужно создать такие вещи, как Конан Дойл, Холмс, доктор Джозеф Белл, Уэнделл Шерр и т. Д.

Я бы предпочел Pythonic Solution, если это возможно

Ответы [ 2 ]

5 голосов
/ 28 августа 2009

Этот вид обработки может быть очень сложным. Этот простой код делает почти правильные вещи:

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

производит:

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

Чтобы включить «Доктор Джозеф Белл», вам нужно быть в порядке с периодом в строке, что позволяет «Эдинбургский королевский лазарет. Как Холмс».

У меня была похожая проблема: Разделение предложений .

2 голосов
/ 28 августа 2009

Подход "re" очень быстро истощается. Распознавание именованных объектов - очень сложная тема, выходящая за рамки SO-ответа. Если вы думаете, что у вас есть хороший подход к этой проблеме, пожалуйста, направьте ее на Фланна О'Брайена, известного как Майлз на Гопалине, Сукарно, Гарри С. Трумэна, Дж. Эдгара Гувера, Дж. К. Роулинг, математика Л'Опитала, Джо ди Маджио, Алджернон Дуглас-Монтегю-Скотт и Хьюго Макс Граф фон унд Лерхенфельд и Кёферинг унд Шёнберг.

Обновление Ниже приведен подход, основанный на повторном подходе, который находит намного больше допустимых случаев. Я все еще не думаю, что это хороший подход. Нотабене Я уточнил имя баварского графа в моем текстовом образце. Если кто-то действительно хочет использовать что-то подобное, он должен работать в Юникоде и нормализовать пробелы на некотором этапе (либо на входе, либо на выходе).

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)

Выход:

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'
...