Programming/Python

[Python 3.7] 파이썬 회문 판별과 N-gram

Nirsa 2020. 2. 3. 17:57
반응형

 

  • 회문 판별

회문은 앞으로 읽으나, 뒤집어서 읽으나 모두 똑같은 단어가 되는 문장 이고 대표적인 회문으로는 level 이 있습니다. 앞으로 읽어도 level, 뒤집어서 읽어도 level이 됩니다.

for문을 이용해 아래와 같이 회문을 판별할 수 있는데, 아래 코드를 간단히 한줄로 말하자면 문자열의 앞뒤를 하나씩 비교하고 같다면 참, 다르면 거짓으로 판별하는 방식 입니다. 회문이라면 if 조건문에 만족하지 않아 True가 유지될것이고 회문이 아니라면 if 조건문에 만족하여 False로 변경 될겁니다.

x = input('회문 판별할 단어 입력: ')

Discrimination = True				# 회문이 아닐 경우 False를 확인하기 위해 초기값 True 설정
a = -1						# 아래 if문에서 x의 우측부터(-1) 확인하기 위한 설정

for i in range(len(x) // 2):			# 회문은 앞뒤가 같으므로 문자열 길이의 반만 반복
	if x[i] != x[a]:				# x의 왼쪽 첫번째 문자와 오른쪽 첫번째 문자 비교, 다를 경우 회문이 아니므로 if 조건문 진입
		Discrimination = False	# 회문이 아니므로 True에서 False로 변경
		break				# 중지
	a -= 1					# if 조건문을 거치지 않고 문자가 서로 같았다면 그 다음 문자를 비교하기 위해 a의 -1이 더 올라가도록 설정

 

이 외에도 슬라이스를 활용하거나 리스트와 reversed를 활용 또는 join 메서드와 reversed를 사용하여 원래의 문자열과 완전히 뒤집어버린 문자열을 비교하는 방법도 있습니다.

 

  • N-gram

N-gram은 문자열에서 N개의 연속된 요소를 추출하는 방법 입니다. 예를들어 syntax 라는 단어가 있을 때 2-gram을 사용하면 sy / yn / nt / ta / ax 가 출력되고, 3-gram을 사용하면 syn / ynt / nta / tax 가 출력 됩니다. 즉, 문자열을 특정 개수만큼 나눠서 출력시켜주는 방법 입니다.

이러한 방법은 검색 엔진에서 자주 사용 되는데 program, programming, programer 에서 program만 추출하여 단어의 사용 빈도를 세거나 할때에 사용할 수 있습니다.

마찬가지로 for문을 이용할 수도 있고 zip을 사용해서도 구현할 수 있습니다. 아래 코드는 zip을 사용하여 2-gram 구현 방법 입니다. (zip의 대략적인 개념은 https://nirsa.tistory.com/43를 참고해주세요.)

# 2-gram
text='syntax'
two_gram = zip(text, text[1:])
for i in two_gram:
	print(i[0], i[1], sep='')
    
    
# 3-gram    
text='syntax'
three_gram = zip(text, text[1:], text[2:])
for i in three_gram:
	print(i[0], i[1], i[2], sep='')

 

반응형