본문 바로가기
Python

27. 파이썬 활용 미니프로젝트1(qwerty 분석3)

by To올라운더 2023. 8. 7.
반응형

우리는 파이썬을 이용해 쿼티 자판이 단순히 타이핑 속도를 낮추기 위한 

비효율적인 배열이 아니라는 것을 검증하고 있다.

 

지난 글들을 통해 확인 해본 내용을 다시 알아보면,
첫번째, 글속에서의 빈도 수를 통해 해당 배열이 효과적으로 구성되어 있는지
두번째, 글을 입력할 때, 오른손과 왼손을 번갈아 가며 입력하는 구성이 되는지
세번째, 글속에서 사용되는 문자를 쿼티 배열로 입력 할 때 다음 알파벳과의 연속성을 얼마나 차단할 수 있는지이다.


3가지 궁금증을 파이썬을 이용해 해결하고 있고,

이제 마지막 3번째 궁금증에 대해 검증을 해 볼 차례이다.

(사실 재밍은 입력 시 발생하는 활자의 물리적인 구성으로 인한 타자기의 장애일 뿐, 타자기를 안쓰는 현재는 배열의 우수함을 검증하는 것과는 아무런 상관이 없는 배제되어야할 비교 항목이지만, 처음 도입된 시점을 고려하여 해당 내용도 검증해보겠다.)

 

 1. 재밍과 활자판 배치(쿼티)

  - 활자가 먹지를 때리기 위해 물리적으로 이동하며 서로 엉키는 것을 재밍이라고 하는데, 아래 그림처럼 근처에 있는 활자들이 빠르게 입력될 때 발생한다.

 

 - 사실 이 포스팅을 작성하기 위해 가장 많은 시간을 쏟은 것이 이 내용인데,

   해당 활자의 위치를 확인하려 여러 자료와 사진을 수집하였으나, 건진건 쿼티 자판기의 활자 배열뿐이었다.

   (이 2장의 자료를 위해 5시간도 넘게 헤메고 있었다면... 믿어주실지...)

 - 어쨋든 긴 검색 중에 Leica Story님의 네이버 블로그(이 세상에서 가장 얇은 타자기 - Rooy : 네이버 블로그 (naver.com))에서 찾은 두 장의 사진인데,이 사진으로 인해 드디어 재밍에 대한 분석을 시작 할 수 있었다.

 ( 찾아낸건 쿼티 뿐이지만, 우리가 진행하고자 하는 최우선 목표는 파이썬이 얼마나 효율적인지를 알아보는 것이 주된 목표이기 때문에 쿼티만으로도 다른 문자열들을 비교함에 부족함이 없을 거라 생각한다.)

 - 아래 사진을 보면 쿼티 배열 자판기의 활자부분이 사진에 선명히 찍혀있는데

 

타자기의 물리적인 배열은 정확히 보이는 몇개의 활자와 유추를 통해 아래와 같이 전체 배열을 유추할 수 있다.

 

표의 가장 첫번째 줄은 활자의 순서, 두번째 줄은 인식이 가능한 활자, 마지막은 유추된 활자이다.

마지막 줄을 유추할 수 있는 이유는 아래의 그림을 참고하면 되는데,

빨간색이 인식이 가능한 자판, 노란색이 유추된 자판이다.

1열의 숫자들을 보면 2~9까지 정확히 인식이 가능한데, 순서를 확인해보면 4개씩 증가함을 알 수 있다.

그리고 25번부터 36번을 보면 35번을 제외한 자판들이 인식가능한데, 1열 -> 4열 -> 2열 -> 3열의 순서로 진행됨을 알 수 있다.

이를 바탕으로 타자기의 물리적인 위치 값이 확인되었고, 해당 번호를 통해 재밍이 발생할 수 있는 물리적인 자판의 순서를 알 수 있었다.

이제 코딩으로 작성을 해보는 일만 남았다.

 

비교는 1867년 큰 고민 없이 순서대로 제안된 배열과 쿼티 배열, 마지막으로 드보락 배열까지 진행해보겠다.

 1) 1867년 알파벳순 배열(쿼티 이전)

# 1867년 최초 제안된 배열
- 3 5 7 9 N O P Q R S T U V W X Y Z
2 4 6 8 . A B C D E F G H I J K L M

 쿼티 타자기의 교차된 물리구성을 생각하며 1867년 자판의 순서를 구성해보면 아래와 유사한 형태가 될 것이다.

(근거 자료가 없어 차이가 날 수 있습니다. 혹시 관련 자료가 있으시면 공유 및 댓글 부탁드리며,

해당 글은 파이썬을 활용하는 방안에 대한 글이므로 결과와는 무관할 수 있습니다.)

아마도 활자의 자판의 물리적인 구성은 주황색과 같이, 윗열과 아래열이 교차로 진행되었을 것이다.

 

 2) 쿼티 배열

쿼티는 위의 이미지와 동일하며,

 

 3) 드보락 배열

드보락은 쿼티와 동일한 타자기의 활자 배열만 다를 것으로 생각된다.

 

2. 코드 작성 및 결과 확인

# 확인용 소스 텍스트
source_text ='''Title : Why young people have 'call phobia' and how to manage it.

These all-too-familiar symptoms seem to arise when she has to make or receive a phone call, prompting her to avoid speaking on the phone whenever possible.

Phone anxiety, also known as call phobia or telephobia, is a form of social anxiety disorder observed in a growing number of people, particularly among those belonging to the so-called "MZ Generation" -- millennials and Generation Z born between the early 1980s to early 2010s.

"I rarely had opportunities to communicate with people on the phone since childhood," Lee told The Korea Herald. Text messages via chat apps are the predominant way for her to engage in social communications, she added.

Psychology professor Lim Myung-ho from Dankook University said young people have become particularly susceptible to this type of anxiety over the years.

A survey conducted in 2022 by the local research group Embrain, which polled 1,000 individuals, found that the highest percentage of respondents experiencing mental pressure before making phone calls were in their 20s at 43.6 percent, followed by those in their 30s at 36.4 percent. Figures for those in their 40s and 50s were 29.2 percent and 19.6 percent, respectively.

The survey also revealed that approximately 60 percent of respondents in their 20s and 30s preferred texting as their primary mode of communication, with only 14.4 percent of those in their 20s and 16 percent in their 30s opting for phone calls.

When asked for the reason for preferring text, Lee said, "I worry about making mistakes when speaking on the phone. While I can easily revise text messages, I have to be extremely careful not to say anything that might sound impolite or foolish."

For an office worker surnamed Jeon in her 20s, the thought of being on the phone makes her feel uncomfortable, as she feels compelled to respond quickly.

“Unlike text messaging, I don’t have much time to arrange my thoughts during phone calls, which often leads me to stutter or sputter out random things to fill the silence,” she said.

“I have significantly improved my speaking skills by frequently making and receiving phone calls at the office. Yet, I still rely on writing short scripts and anticipating questions to reduce panic during calls,” she added.

Explaining why voice communication induces more stress, professor Lim points out that texting is a less emotionally charged format than speaking, as the voice carries one's emotions.

“Many people in their 20s and 30s struggle when dealing with direct and spontaneous emotions conveyed through talking on the phone because they are more accustomed to communicating through text messages,” he said.

The daunting nature of phone conversations can also be attributed to the communication being enacted solely through talking, without other social cues such as body language and facial expressions, he explained.

As a way to combat phone anxiety, Lim calls for acknowledging one's insecurities and gradually exposing oneself to phone calls in a variety of social settings over a long period of time.

“I recommend having conversations on the phone with people you are close to regularly and preparing scripts beforehand if calling is too stressful,” Lim said, adding, “Phone anxiety should be better dealt with, especially in the workplace, where effective communication skills are of utmost importance.”

Furthermore, for alleviating phone anxiety, Shin You-ah, a speech director at U Speech, a private speech improvement institution, offers both mental and physical treatment.

“Firstly, creating a new mindset is important. If you feel nervous about making phone calls, you need to stay calm and eliminate fear by recognizing that phone calls will not have serious repercussions,” Shin said.

“We also help students practice diaphragmatic breathing, through which they not only calm their mind but also deepen and stabilize their voice,” Shin said.

She further stated, “In the face of unexpected calls, they should answer and politely ask for time to call back, organizing their thoughts and reducing anxiety in the meantime.”

Both Shin and Lim emphasized the importance of listening to and becoming aware of one's own voice as a way to manage the phobia.'''

# 쿼티 이전 타자기 활자별 배열 순서
pre_qwerty_order = {'A':12, 'B':14, 'C':16, 'D':18, 'E':20, 'F':22, 'G':24, 'H':26, 'I':28, 'J':30, 'K':32, 'L':34, 'M':36, 'N':11, 'O':13, 'P':15, 'Q':17, 'R':19, 'S':21, 'T':23, 'U':25, 'V':27, 'W':29, 'X':31, 'Y':33, 'Z':35}

# 쿼티 타자기 활자별 배열 순서
qwerty_order = {'A':2, 'B':20, 'C':12, 'D':10, 'E':9, 'F':14, 'G':18, 'H':22, 'I':29, 'J':26, 'K':30, 'L':34, 'M':28, 'N':24, 'O':33, 'P':37, 'Q':1, 'R':13, 'S':6, 'T':17, 'U':25, 'V':16, 'W':5, 'X':8, 'Y':21, 'Z':4}

# 드보락 타자기 활자별 배열 순서
dvorak_order = {'A':2, 'B':20, 'C':29, 'D':22, 'E':10, 'F':21, 'G':25, 'H':26, 'I':18, 'J':8, 'K':12, 'L':37, 'M':24, 'N':34, 'O':6, 'P':13, 'Q':4, 'R':33, 'S':38, 'T':30, 'U':14, 'V':32, 'W':28, 'X':16, 'Y':17, 'Z':36}



retry_count = 0

# 자판 배열 선택, qwerty = 1, dvorak =2
while retry_count < 5:
    choose_array_mode = int(input('자판 배열을 입력하세요. \n\t0.pre_qwerty\n\t1.qwerty\n\t2.dvorak \n\t  :  '))

    if choose_array_mode == 0:
        print('1867 배열이 선택되었습니다.')
        arraymode = pre_qwerty_order
        break

    elif choose_array_mode == 1 :
        print('쿼티(qwerty) 배열이 선택되었습니다.')
        arraymode = qwerty_order
        break

    elif choose_array_mode == 2:
        print('드보락(dvorak) 배열이 선택되었습니다.')
        arraymode = dvorak_order
        break


    else:
        print('비정상적인 입력입니다. 0과 1, 2 중 선택하여 입력해주세요.')
        retry_count += 1

if retry_count == 5:
    print('재시도 횟수를 초과하여 프로그램을 종료합니다.')
    quit()


#import math

crash_range = 4
jamming_count = 0

except_char_set = set()
except_count = 0

# 원문 문자별로 분리하기(string -> list)
split_text_to_list = list(source_text)

pre_position_no = 100

for used_char in split_text_to_list[1:]: # 첫번째 입력은 jamming이 날 수 없으므로 인덱스 1번부터 시작
    
    try: # 알파벳 외 다른 특수문자 등이 입력될 경우, 예외처리
    
        # 전에 입력된 활자의 위치와 현재 입력된 활자의 위치가 crash_range 보다 작으면,
        if abs(pre_position_no - arraymode[used_char.upper()]) < crash_range and abs(pre_position_no - arraymode[used_char.upper()]) > 0 : 
            # 순서에 따라 - 값이 나올 수 있으므로 절대값으로 계산 and 같은 자판 연속 입력 시 jamming 발생 하지 않으므로 >0 조건 추가
            
            jamming_count += 1

        
    
        pre_position_no = arraymode[used_char.upper()]
    
    except:
        except_count += 1
        except_char_set.add(used_char)
        pre_position_no = 100 # 알파벳 외 문자 입력일 때 임의 위치 설정

print(f'전체 글자 수 : {len(split_text_to_list)}')

print(f'인접 범위(crash_range) : {crash_range} 일 때,')
print(f'jammaing 횟수는 : {jamming_count} 회 입니다.')

print(f'예외 입력 수(except_count : {except_count}')
print(except_char_set)

 - 1~42 라인 : 확인용 예시문

 - 44~51 라인 : 1867배열(쿼티 전), 쿼티, 드보락 배열에 대한 물리적인 자판 위치 값 설정

 - 55~ 83 라인 : 선택된 배열 값 설정 및 오입력 시 프로그램 종료

 - 88 라인 : crash_range 설정, 물리적인 범위가 어느 정도 일 떄 재밍이 생기는지 설정

 - 89 라인 : crash_range 가 몇 번 발생하는지 해당 변수에 입력

 - 91~92 라인 : 예외 문자 처리. 숫자 등 예외 문자로 처리

 - 95 라인 : 예시문 리스트로 변환(전체 str -> 개별 문자)

 - 97 라인 : 첫 문자 입력과 예외 문자의 위치 값 할당(해당 자판과 재밍이 안생긴다는 전제로 위치 값을 100으로 설정)

 - 104 라인 : 연속된 문자의 입력이 발생할 때 재밍이 발생하는 범위 인지 확인

                      88라인에 선언된 crash_range 범위 값 보다 작고, 0 이 아닐 때(같은 문자 연속 입력) jamming_count 증가

 - 111 라인 : 마지막 위치값 pre_position_no 로 입력

 - 113 ~ 116 라인 : 숫자, 특수문자 등 알파벳 입력이 아닐 경우, 예외 등록 및 pre_position_no 100으로 초기화

 - 결과를 확인해보면, 

  crash_range를 4 미만으로 할당했을 때,

  알파벳순배열은 689회, 쿼티는 275회, 드보락은 175회의 재밍(jamming)이 발생했다.

 - crash_range 를 변경해 보며 횟수를 확인해보면 아래와 같고, jamming 예방에도 드보락이 더 뛰어날 뿐, 알파벳순 배열과 비교해보면 쿼티도 효율성을 높인 배열임이 알 수 있다.(최초 분석 전 언급한 것처럼 쿼티배열이 단순히 타이피스트의 속도를 떨어뜨릴 목적이 아님은 분명하다.)

crash_range 2미만(바로 옆일 때만) 3미만(2칸 옆일 때) 4미만(3칸 옆일 때)
알파벳순 272 495 689
쿼티 147 147 275
드보락 47 86 175

 - 그리고 우연일 수 있지만, crash_range값이 증가 할 때마다 증가하지만, 쿼티 배열이 2에서 3으로 변경될 때 jamming 횟수가 동일한 것을 볼 때, 쿼티는 2칸 옆일 때까지를 염두에 두고 만든건 아닐까라는 조금 과장된 추측도 해본다.

 

앞의 포스팅의 총 결과를 보면,


첫번째, 글속에서의 빈도 수를 통해 쿼티 배열이 효과적으로 구성되어 있는지

   > 사실 
두번째, 글을 입력할 때, 오른손과 왼손을 번갈아 가며 입력하는 구성이 되는지

   > 사실
세번째, 글속에서 사용되는 문자를 쿼티 배열로 입력 할 때 다음 알파벳과의 연속성을 얼마나 차단할 수 있는지이다.

(해당 사항은 재밍이 발생하는 타자기에만 한함.)
   > 사실

 

로 3가지가 모두 사실로 들어났고, 개인적인 견해로 과거의 잘못된 관습이 우위를 점하는 선점 효과를 쿼티 효과라 부르는 건 잘못된 부분이 다소 포함된 것으로 생각할 수 있다.

(드보락이 뛰어나긴 하지만, 단축키는 선점효과로 인해 쿼티가 유리한 방향으로 설정되었다 하더라도 

해당 부분을 제외한 뒤, 타이핑과 마우스를 고려해본다면 드보락배열이 확실한 우세를 가지지 못한다.)
 

 

 

3. 전체 리뷰

우리는 타이핑 속도를 줄이기 위해 쿼티가 도입되었다는 내용이 잘못된 사항임을 검증하기 위해 파이썬을 이용했다.

 

처음 궁금증을 가졌던 3가지 사항에 대한 검증 작업을 통해

쿼티 자판이 드보락보다 부족하지만

단순히 알파벳순으로 정렬된 배열보다는 효과적이고 효율적인 배열을 만들기 위해 고민한 흔적들을 찾아냈다.

 

이런 부분을 실제 손으로 검증하려 했다면, 

얼마나 많은 시간이 필요했을지 모른다.

하지만 우리는 파이썬을 통해 효율적이고 효과적으로 시간을 단축하며 결과를 산출할 수 있었다.

 

코딩은 어려울 수 있지만,

앞으로 일을 효율적으로 하고 싶다면, 코딩의 효과를 생각하며 꼭 한번은 배워야 하는 부분이 아닐까 생각해본다.

반응형