현재 "if member in self.body"를 선택하면 250,000 개의 이름 각각에 대해 메모리의 각 연설을 한 번씩 다시 읽습니다.
전체 단어, 공백 및 구두점을 찾아 음성 본문을 한 번 구문 분석해야합니다. 그런 다음 알려진 이름의 선형 시간 조회를 사용하거나 최악의 로그 시간을 사용하여 이름을 찾았는지 확인해야합니다.
문제는 다양한 단어 길이를 가진 회원 이름을 찾아야한다는 것입니다. 그래서 여기에 마지막 세 단어를 검사하는 것을 처리하기 위해 작성한 빠른 (그리고 아주 좋지 않은) 구현이 있습니다.
# This is where you load members from a file.
# set gives us linear time lookup
members = set()
for line in ['First Person', 'Pele', 'Some Famous Writer']:
members.add(line)
# sample text
text = 'When Some Famous Writer was talking to First Person about Pele blah blah blah blah'
from collections import deque
# pretend we are actually parsing, but I'm just splitting. So lazy.
# This is why I'm not handling punctuation and spaces well, but not relevant to the current topic
wordlist = text.split()
# buffer the last three words
buffer = deque()
# TODO: loop while not done, but this sort of works to show the idea
for word in wordlist:
name = None
if len(buffer) and buffer[0] in members:
name = buffer.popleft()
if not name and len(buffer)>1:
two_word_name = buffer[0] + ' ' + buffer[1]
if two_word_name in members:
name = two_word_name
buffer.popleft()
buffer.popleft()
if not name and len(buffer)>2:
three_word_name = buffer[0] + ' ' + buffer[1] + ' ' + buffer[2]
if three_word_name in members:
name = three_word_name
buffer.popleft()
buffer.popleft()
buffer.popleft()
if name:
print ('<member>', name, '</member> ')
if len(buffer) >2:
print (buffer.popleft() + ' ')
buffer.append(word)
# TODO handle the remaining words which are still in the buffer
print (buffer)
나는 개념을 설명하려고합니다. 공백이나 구두점은 처리하지 않습니다. 이것은 전혀 끝을 처리하지 못합니다. 끝내지 않은 동안 반복해야합니다. 그것은 파싱 할 때 임시 문자열을 생성합니다. 하지만 구문 분석의 기본 개념을 한 번 보여줍니다. 음성 텍스트를 파싱하는 데 너무 느리긴하지만 음성 텍스트를 25 만 회 검색하는 데는 어려움이 있습니다.
텍스트를 구문 분석하고 이름에서 집합을 확인하려는 이유는 한 번 수행하는 것입니다. 한 세트가 선형 시간 조회를 할부 상환 했으므로 구성원의 이름이 맞는지 확인하는 것이 훨씬 빠릅니다.
기회가 생기면 나중에 토큰을 생성하고 끝에 이름을 찾는 문제를 해결할 수 있지만 최종 코드는 아닙니다.
'replace (member,' '+ member +' ')하면 완전히 새로운 문자열이 생성됩니다. 목록에 누적되어 끝에 합류하는 것이 좋습니다. –
또한 회원 명단을 사용하지 말고'set'을 사용하십시오. –
readlines를 잃어버린 ... 단지'for line in l :'을 사용하십시오. 또한 두 루프를 결합해야합니다. –