2017-05-23 1 views
1

특정 단어 및 bigrams를 강조 표시하는 동안 텍스트를 인쇄하려고합니다. 구두점과 같은 다른 토큰을 인쇄 할 필요가 없다면 이것은 상당히 솔직하게 진행될 것입니다.시퀀스에 나타나는 특정 단어 강조 표시

강조 표시 할 단어 목록과 강조 할 bigram 단어 목록이 있습니다. 개별 단어를 강조

예를 들어 같은, 매우 간단합니다 : 더 복잡 순서에 표시

import re 
import string 

regex_pattern = re.compile("([%s \n])" % string.punctuation) 

def highlighter(content, terms_to_hightlight): 
    tokens = regex_pattern.split(content) 
    for token in tokens: 
     if token.lower() in terms_to_hightlight: 
      print('\x1b[6;30;42m' + token + '\x1b[0m', end="") 
     else: 
      print(token, end="") 

만 강조하는 단어. 나는 반복자로 놀아 왔지만 명백하게 복잡하지 않은 것을 생각해낼 수 없었다.

+0

'하이 라이터'기능이 예상대로 작동하고 * 예상대로 작동하지 않는 경우의 예를 제공 할 수 있습니까? 힌트 : "연속적으로 나타나는 단어"는 당신에게 어떻게 보이나요? – blacksite

+1

먼저 텍스트를 목록으로 분할 한 다음 해당 목록을 반복 할 수 있습니다 (이미했던 것처럼). 그런 다음 해당 목록을 살펴보고 현재 요소와 다음 요소가 유효한 bigram인지 확인합니다. 그렇다면 "강조 표시된"단어를 별도의 목록으로 푸시합니다. 그렇지 않으면 목록에 "강조 표시되지 않음"을 넣습니다. 이전 bigram이 이미 (새 목록의) 현재 항목을 강조 표시했는지 항상 확인하십시오. –

+0

@not_a_robot 그는 아마도 두 단어를 연속으로 의미하는 단어 bigram을 찾고있을 것입니다. 그는 bigrams의 목록에있는 경우 단어의 부부를 강조 표시하려고합니다. 이로 인해 중복되는 문제가 발생합니다. –

답변

0

내가 올바르게 질문을 이해한다면, 한 가지 해결책은 다음 단어 토큰을 살펴보고 bigram이 목록에 있는지 확인하는 것입니다. 전화했을 때

import re 
import string 

regex_pattern = re.compile("([%s \n])" % string.punctuation) 

def find_next_word(tokens, idx): 
    nonword = string.punctuation + " \n" 
    for i in range(idx+1, len(tokens)): 
     if tokens[i] not in nonword: 
      return (tokens[i], i) 
    return (None, -1) 

def highlighter(content, terms, bigrams): 
    tokens = regex_pattern.split(content) 
    idx = 0 
    while idx < len(tokens): 
     token = tokens[idx] 
     (next_word, nw_idx) = find_next_word(tokens, idx) 
     if token.lower() in terms: 
      print('*' + token + '*', end="") 
      idx += 1 
     elif next_word and (token.lower(), next_word.lower()) in bigrams: 
      concat = "".join(tokens[idx:nw_idx+1]) 
      print('-' + concat + '-', end="") 
      idx = nw_idx + 1 
     else: 
      print(token, end="") 
      idx += 1 

terms = ['man', 'the'] 
bigrams = [('once', 'upon'), ('i','was')] 
text = 'Once upon a time, as I was walking to the city, I met a man. As I was tired, I did not look once... upon this man.' 
highlighter(text, terms, bigrams) 

,이 제공 :

-Once upon- a time, as -I was- walking to *the* city, I met a *man*. As -I was- tired, I did not look -once... upon- this *man*. 

가 있다는 점 유의 하시길 바랍니다 :

  • 이 욕심 알고리즘은, 그것이 발견되는 첫 번째 음절과 일치합니다. 예를 들어 yellow bananabanana boat을 확인하면 yellow banana boat은 항상 -yellow banana- boat으로 강조 표시됩니다. 다른 동작을 원할 경우 테스트 로직을 업데이트해야합니다.
  • 아마 당신은 또한 단어 terms 모두 내가 모든 가장자리 케이스를 테스트하지 않은 음절
  • 의 첫 번째 부분 인 경우를 관리하는 논리를 업데이트 할 깰 수있는 몇 가지/울타리가있을 수 있습니다 하여 필요한 경우 성능을 최적화 할 수
  • 자격증 신청인 오류
  • : 단어는 다음 단어에 대한 예견을하기 전에 그 안에있는 경우 음절의 첫 번째 단어 목록을 구축하고 확인
    • 및/또는 룩 어 헤드 (look-ahead)의 결과를 사용하여 두 단어 사이의 모든 비 단어 토큰을 한 단계에서 처리한다 즉이 도움이

희망 (이 단계를 구현하는 선형 성능을 보장하기에 충분해야한다).

관련 문제