2017-01-11 12 views
0

텍스트의 일부 엔티티를 대체하기위한 좋은 알고리즘을 생각하는 데 몇 가지 문제가 있습니다. 세부 사항은 다음과 같습니다. html로 형식화해야하는 텍스트가 있습니다. 형식에 관한 정보는 엔티티 사전이 들어있는 파이썬 목록에 있습니다. (형식에주의하십시오)의 원래 텍스트가 같은 것을 예를 들어 가정 해 봅시다 :인덱스로 다중 문자열을 대체하기위한 알고리즘

로렘 입숨 간단하다 printing 및 조판 업계의 더미 텍스트입니다. 내가 얻을 것이다

텍스트는이 (포맷없이)입니다 :

로렘 입숨은 단순히 인쇄 및 조판 산업의 더미 텍스트입니다.

와 같은 개체의 목록 :

entities = [{"entity_text":"Lorem Ipsum", "type": "bold", "offset": 0, "length":"11"}, {"entity_text":"dummy", "type": "italic", "offset": 22, "length":"5"},{"entity_text":"printing", "type": "text_link", "offset": 41, "length":"8", "url": "google.com"}] 

이 HTML로 제공되지 않은 텍스트 및 개체 번역해야 내 알고리즘 : 그래서 그것은 수

<b>Lorem Ipsum</b> is simply <i>dummy</i> text of the <a href="google.com">printing</a> and typesetting industry

을 원래 메시지로 컴파일된다. 문자열 바꾸기를 시도했지만 오프셋 (텍스트 시작 부분의 엔터티 위치)이 엉망입니다. 그리고 텍스트에 서식이있는 많은 단어가있을 수 있다는 점을 기억하십시오. 서식이 지정되지 않은 단어는 서식 지정되어야하는 단어를 정확하게 찾아야합니다. 누구 한테 도움이 필요 하신가요? 나는 파이썬 코드를 쓰고 있어요하지만 당신은 어떤 언어로 알고리즘을 지정할 수 있습니다

편집 내가 시도 코드를 게시하는 것을 잊었다 죄송합니다. 즉 :

format_html(text, entities): 
    for entity in entities: 
     try: 
      entity_text = entity['entity_text'] 
      position = text.find(entity_text, entity['offset']) 
      if position == entity['offset']: 
       before = text[:position] 
       after = text[min(position+entity['length'], len(text)-1):] 
       if entity['type'] == 'text_link': 
        text_link = '<a href="{}">{}</a>'.format(entity['url'], entity_text) 
        text = before + text_link + after 
       elif entity['type'] == 'code': 
        code = '<code>{}</code>'.format(entity_text) 
        text = before + code + after 
       elif entity['type'] == 'bold': 
        bold_text = '<b>{}</b>'.format(entity_text) 
        text = before + bold_text + after 
       elif entity['type'] == 'italic': 
        italic_text = '<i>{}</i>'.format(entity_text) 
        text = before + italic_text + after 
       elif entity['type'] == 'pre': 
        pre_code = '<pre>{}</pre>'.format(entity_text) 
        text = before + pre_code + after 
     except: 
      pass 
+0

어떤 알고리즘을 시도 했습니까? 여기에 코드를 게시하십시오. – blacksite

+0

@not_a_robot, 편집을 확인하십시오 – Ken

+0

'get_message'와'parse_entity'는 어떻게 생겼습니까? 이 수업과 관련된 모든 코드를 포함시켜 주시겠습니까? * 너는 너의 수업에 익숙 할지도 모르지만, 우리는 그렇지 않다! – blacksite

답변

0

음으로 변환, 이것은 내가 그것을 해결하는 방법이었다. 나는 텍스트를 수정할 때마다 (태그 때문에) 텍스트에 추가 된 추가 문자열의 길이로 오프셋을 조정했다. 이것은 계산 시간면에서 비용이 많이 들지만, 내가 본 유일한 옵션입니다.

def format_html(text, entities): 
    for entity in entities: 
     try: 
      modified = None 
      entity_text = entity['entity_text'] 
      position = text.find(entity_text, entity['offset']) 
      if position == entity['offset']: 
       before = text[:position] 
       after = text[min(position+entity['length'], len(text)-1):] 
       if entity['type'] == 'text_link': 
        text_link = '<a href="{}">{}</a>'.format(entity['url'], entity_text) 
        text = before + text_link + after 
        modified = 15 + len(entity['url']) 
       elif entity['type'] == 'code': 
        code = '<code>{}</code>'.format(entity_text) 
        text = before + code + after 
        modified = 13 
       elif entity['type'] == 'bold': 
        bold_text = '<b>{}</b>'.format(entity_text) 
        text = before + bold_text + after 
        modified = 7 
       elif entity['type'] == 'italic': 
        italic_text = '<i>{}</i>'.format(entity_text) 
        text = before + italic_text + after 
        modified = 7 
       elif entity['type'] == 'pre': 
        pre_code = '<pre>{}</pre>'.format(entity_text) 
        text = before + pre_code + after 
        modified = 11 
       if modified: 
        for other in entites: 
         if other['offset'] > entity.offset: 
          other.offset += modified 
     except: 
      pass 
+0

다른 유형의 반복이있을 때이 코드가 작동합니까? 똑같은 * 단어 *는 굵은 글씨로, ** 같은 단어는 이탤릭체로 ** 오프셋이 주문되지 않은 때는 어떨까요? – RobinHood

+0

그래, 실제로 두 개 이상의 서식이있는 단어에주의를 기울이지 않았다.이 알고리즘은 그렇게 작동하지 않을 것 같다. 오프셋의 순서는 현재 엔터티의 오프셋보다 큰 오프셋 만 이동하기 때문에 중요하지 않습니다. if other [ 'offset']> entity.offset :' – Ken

+0

offset을 업데이트하는 것은 좋은 생각이지만 문제 requieres보다 더 복잡합니다. 또한 len() 함수를 사용하여 수정 된 내용을 제어하고 각각의 경우 코드의 특정 부분 인 specific_text라는 일반 'text = before + specific_text + after'를 수행하면 더 쉬운 코드를 작성할 수 있습니다. – RobinHood

1

이런 뜻일까요?

text = "" 
for entry in entries: 
    line = "" 
    for key, value in entry.iteritems(): 
     if key == 'entity_text': 
      line += value 
     elif key == 'type' and value == 'bold': 
      line = "<b> {} </b>".format(line) 
     elif key == 'type' and value == 'italic': 
      line = "<i> {} </i>".format(line) 
     elif key == 'type' and value == 'text_link': 
      line = '<a href="google.com">{}</a>'.format(line) 
    text += line 
text 

'<b> Lorem Ipsum </b><i> dummy </i><a href="google.com">printing</a>' 
+0

죄송합니다. 전체적인 방법을 게시하지 않으려 고 잘못 생각했습니다. 'text'는 실제로 주어진 텍스트, 보통 텍스트입니다. 변수'text'에서 형식을 지정할 단어를 찾아야합니다. 이 경우 '텍스트'는 "Lorem Ipsum은 단순히 인쇄 및 조판 업계의 모조 텍스트입니다." 문제는 텍스트를 추가 할 위치를 어떻게 알 수 있습니까? 보시다시피, 결과는 원본과 다른 텍스트를 제공합니다. – Ken

+0

제가보기에, 실제로 시작한 데이터에 따라 달라질 것입니다. 그게 아직도 나에게 불분명합니다. 웹 사이트 코드 또는 파일 내용입니까? – Daniel

+0

웹 사이트가 아니므로 여기에 정보가 필요한 방법을 알지 못합니다. 필자는 문자열 (형식이 지정되지 않음)과 위치를 어떤 형식으로 형식화해야하는지에 대한 정보가 포함 된 변수 (엔터티)를 제공합니다 (예를 들어 질문과 같이). 텍스트의 올바른 형식으로 html 출력을 제공 할 필요가 있습니다. 문자열 객체의 내부에 단어의 위치가있는 경우 – Ken