"다시"접근법은 매우 빨리 증기가 고갈됩니다. 명명 된 엔티티 인식은 SO 응답 범위를 넘어서는 매우 복잡한 주제입니다. 이 문제에 대한 좋은 접근 방법이 있다고 생각한다면 Flann O'Brien 일명 Myles na cGopaleen, Sukarno, Harry S. Truman, J. Edgar Hoover, JK Rowling, 수학자 L' Hopital, Joe di Maggio, Algernon Douglas-Montagu-Scott, Köfering und Schönberg의 Hugo Max Graf von und zu Lerchenfeld 등이있다.
업데이트 다음은 유효한 사례를 많이 찾는 "다시"기반 접근 방식입니다. 그래도 여전히 좋은 접근 방식이라고 생각하지 않습니다. N.B. 필자는 텍스트 샘플에서 바이에른 카운트의 이름을 높이 평가했습니다. 누구나 정말 이런 식으로 사용하고 싶다면, 유니 코드로 작업하고, 어떤 단계 (입력 또는 출력 중 하나)에서 공백을 표준화해야합니다.
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'
이 정확히 문장의 경우 구문이 무엇인지 구체적으로 기재 할 수 있습니까? (단지 예제를 제공하는 것보다는 예제를 사용하는 것도 유용합니다) –
"문장의 경우"는 정확히 무엇을 의미합니까? – Triptych
나는 OP가 어느 단어가 대문자로 시작해야 하는지를 결정하고 분석하는 방법을 알고 싶어한다고 생각한다. – ChrisW