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 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.