Python 중국어 정렬 방법 구현

이 글 은 Python 이 중국어 순 서 를 실현 하 는 방법 을 실례 로 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
Python 은 문자열 의 큰 시간 을 비교 합 니 다.ord 함수 에 따라 인 코딩 된 값 입 니 다.정렬 함수 sort 를 기반 으로 숫자 와 영문 자모 로 쉽게 정렬 할 수 있 습 니 다.인 코딩 표 에서 순서대로 배열 되 어 있 기 때 문 입 니 다.

>> print ','< '1'<'A'<'a'<' '
True

하지만 중국 어 를 잘 처리 하 는 것 은 쉽 지 않다.중국 어 는 보통 병 음 과 필획 두 가지 정렬 방식 이 있 는데 가장 자주 사용 하 는 중국어 표준 문자 집합 GB 2312 에서 3755 개의 1 급 중국어 한 자 는 병 음 순서에 따라 인 코딩 되 고 3008 개의 2 급 한 자 는 부수 의 필획 에 따라 배열 된다.

>> print ' '< ' ',' '<' '
True True

이런 결과 가 나 온 것 은'서'와'증'은 모두 상용 자 이 고'연어'와'이'는 모두 다음 상용 자 이기 때문이다.그러나 필획 이 든 병 음 이 든 이 두 쌍 의 순 서 는 모두 반대로 해 야 한다.나중에 확 장 된 GBK 와 GB 18030 인 코딩 은 아래로 호 환 되 기 위해 이전의 한자 순 서 를 바 꾸 지 않 았 기 때문에 sort 이후 의 순 서 는 매우 어 지 러 웠 다.
한편 유 니 코드 인 코딩 의 중국 어 는'강희 사전'의 편방 부수 와 필획 수 에 따라 배열 되 어 있 기 때문에 정렬 결과 와 GB 인 코딩 은 또 다르다.

# encoding=utf8
char=[' ',' ',' ',' ',' ']
char.sort()
for item in char:
  print item.decode('utf-8').encode('gb2312')

수출 은"서 손 이조 전"입 니 다.gb 2312 인 코딩 으로 저장 한 후

# encoding=gb2312
char=[' ',' ',' ',' ',' ']
char.sort()
for item in char:
  print item

수출 은'이 전 손 조서'다.분명히 이 두 결 과 는 모두 우리 가 원 하 는 것 이 아니다.그러면 우 리 는 도대체 어떻게 해야만 중국 어 를 정확하게 정렬 할 수 있 습 니까?
먼저 중국어 사전 의 정렬 규칙 을 알 아야 한다.먼저 병 음 에 따라 배열 하고 네 소 리 를 구분 해 야 한다.병 음 이 같은 것 은 필획 의 수량 이 얼마 인지 보고 필획 수도 같은 다음 에 필순 중의 구체 적 인 필획 유형 에 따라 구분 해 야 한다.신화 사전 이 사용 하 는 순 서 는 일 곤 주 을 이 고'천상 인간'이 라 고도 부 르 며 필획 유형 도 똑 같 지 않 을 것 이다.따라서 중국어 순 서 는 음조 가 있 는 한자 병 음 대조 표 뿐만 아니 라 구체 적 인 필순 의 데이터 도 필요 하 다.
기 존의 모듈 이 있다 고 생각 했 는데,몇 개 를 시험 해 보 았 지만 모두 이상 적 이지 않 았 다.pyzh 의 변환 코드 는 7 천자 도 지원 되 지 않 고 음조 도 없습니다.수목 의 roy 코드 는 2 만 여 자 를 포함 하고 있 지만 pysqlite 지원 이 필요 합 니 다.자립 갱생 하 세 요~
내 가 찾 은 가장 완전한 데 이 터 는 slow wind 9999 가 csdn 에 올 린 유 니 버 설 한자 인 코딩 표(여기 클릭본 사이트 다운로드입 니 다.)전체 20902 개의 한자 의 전체 철자,5 획,정 코드,유 니 코드,GBK,필획 수 부수,그리고 필순 번호(병 음 부분 에 음조 가 없 으 며 개별 주음 에 오류 가 있 음,예 를 들 어 정 g 등 글자 가 있 으 므 로 사용 에 주의해 야 한다)를 포함한다.저 는 그 중의 필순 데 이 터 를 추출 하고 강 지 키 의'실 용 한자 병 음'프로그램 으로 유 니 버 설 한자 음조 판 을 만 들 었 습 니 다.그 중에서 중국어 한 자 는 4 성 으로 표시 되 었 고 319 개의 한 자 는 음조 가 없어 서 차 이 를 나타 내 며 한 전의 데이터 에 따라 약간 수정 되 었 습 니 다(그러나 오류 가 있 을 수 있 습 니 다).이 두 개의 대조 표 가 있 으 면 아래 의 일 은 간단 해진 다.

#       
dic_py = dict()
f_py = open('py.txt','r')
content_py = f_py.read()
lines_py = content_py.split('
') n=len(lines_py) for i in range(0,n-1): word_py, mean_py = lines_py[i].split('\t', 1) dic_py[word_py]=mean_py f_py.close()
필순 사전 의 처리 방법 도 똑 같 습 니 다.텍스트 가 2 만 줄 이 있 지만 가 져 오 는 것 이 빠 르 고 0.5 초 정도 입 니 다.이 두 파일 을 합 쳐 통일 적 으로 처리 하면 더 빠 를 것 이다.

#       
def searchdict(dic,uchar):
  if isinstance(uchar, str):
    uchar = unicode(uchar,'utf-8')
  if uchar >= u'\u4e00' and uchar < = u'\u9fa5':
    value=dic.get(uchar.encode('utf-8'))
    if value == None:
      value = '*'
  else:
    value = uchar
  return value

중국 어 를 찾 으 면 일률적으로 UTF 8 문자열 로 바 뀌 고 한자 이외 의 다른 문 자 는 처리 하지 않 고 그대로 출력 합 니 다.성모 가 필요 하 다 면 병 음의 첫 번 째 문자 만 출력 하면 된다.자료 가 정확 하기 만 하면 비교 해 보면 매우 수월 하 다.숫자 는 자모 앞 에 있 기 전에 사랑(ai4)은 비 앙(ang2)보다 앞 에 있 고 필순 값 의 숫자 는 필획 수 를 대표 하 며 수 치 는 필획 의 가중치 에 대응 하여 숫자 크기 를 직접 비교 하면 정확 한 순 서 를 얻 을 수 있다.코드 는 다음 과 같 습 니 다:

#      
def comp_char_PY(A,B):
  if A==B:
    return -1
  pyA=searchdict(dic_py,A)
  pyB=searchdict(dic_py,B)
  if pyA > pyB:
    return 1
  elif pyA < pyB:
    return 0
  else:
    bhA=eval(searchdict(dic_bh,A))
    bhB=eval(searchdict(dic_bh,B))
    if bhA > bhB:
      return 1
    elif bhA < bhB:
      return 0
    else:
      return 'Are you kidding?'
#     
def comp_char(A,B):
  charA = A.decode('utf-8')
  charB = B.decode('utf-8')
  n=min(len(charA),len(charB))
  i=0
  while i < n:
    dd=comp_char_PY(charA[i],charB[i])
    if dd == -1:
      i=i+1
      if i==n:
        dd=len(charA)>len(charB)
    else:
      break
  return dd
#     
def cnsort(nline):
  n = len(nline)
  lines='
'.join(nline) for i in range(1, n): # tmp = nline[i] j = i while j > 0 and comp_char(nline[j-1],tmp): nline[j] = nline[j-1] j -= 1 nline[j] = tmp return nline
이제 우 리 는 사전 의 규범 에 따라 중국어 순 서 를 정할 수 있다.

char=[' ',' ',' ',' ',' ']
char=cnsort(char)
for item in char:
  print item.decode('utf-8').encode('gb2312')

마침내'이 전 서 손 조',예시 문서다운로드를 받 았 다.
여기 서 나 는 다 음 자 를 고려 하지 않 았 다.프로그램 이 자동 으로 인식 되 려 면 다 음 어구 대조 표를 추가 해 문맥 을 통 해 판단 할 수 있다.나 는 어디 에 이런 데이터 가 있 는 지 모 르 겠 지만,어쨌든 다 음 자가 그리 많 지 않 은 상황 에 대해 서 는 수 동 으로 조정 해도 충분 하 다.
PS:여기 서 실 용적 인 온라인 정렬 도구 2 가 지 를 추천 합 니 다.참고 하 시기 바 랍 니 다.
온라인 에서 영문 은 이니셜 에 따라 정렬 도구:
http://tools.jb51.net/aideddesign/zh_paixu
온라인 텍스트 뒤 집기 정렬 도구:
http://tools.jb51.net/aideddesign/flipped_txt
더 많은 파 이 썬 관련 내용 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기