`
totoxian
  • 浏览: 1034021 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

[转]Python中文排序

阅读更多

from: http://gerry.lamost.org/blog/?p=338

Python比较字符串大小时,根据的是ord函数得到的编码值 。基于它的排序函数sort可以很容易为数字和英文字母排序,因为它们在编码表中就是顺序排列的。

print ‘,’< '1'<'A'<'a'<'阿'
True

但要很处理中文就没那么容易了。中文通常有拼音和笔画两种排序方式,在最常用中文标准字符集GB2312中,3755个一级中文汉字是按照拼音序进行编码的,而3008个二级汉字则是按部首笔画排列,

print ‘曙’< '鲑','曾'<'怡'
True True

出现这样的结果是因为‘曙’和‘曾’都是常用字,而‘鲑’和‘怡’都是次常用字,但无论从笔画还是拼音来看,这两对顺序都应该反过来。后来扩充的GBK和GB18030编码为了向下兼容,都没有更改之前的汉字顺序,于是sort之后的次序就很乱了。

另一方面unicode编码的中文是按《康熙字典》的偏旁部首和笔画数来排列的 ,所以排序结果和GB编码又不一样。

  1. # encoding=utf8
  2. char=['赵','钱','孙','李','佘']
  3. char.sort()
  4. for item in char:
  5. print item.decode('utf-8').encode('gb2312')

的输出是:”佘孙李赵钱”;而保存成gb2312编码后

  1. # encoding=gb2312
  2. char=['赵','钱','孙','李','佘']
  3. char.sort()
  4. for item in char:
  5. print item

输出是:“李钱孙赵佘”。显然,这两个结果都不是我们想要的。那我们究竟怎样才能对中文正确排序呢?

先要弄清楚中文词典的排序规则:先按拼音排列,区分四声,拼音相同的就看笔画数目多少,笔画数也相同的再按笔顺中的具体笔划类型来区分,新华字典采用的顺序是一丨丿丶乙,也称作“天上人间” ,应该没有笔划类型也完全一样的。所以中文排序不仅需要带音调的汉字拼音对照表,还需要有具体笔顺的数据。

本以为有现成的模块,试了几个都不理想。pyzh 的转换代码只支持不到7千字,而且还没有音调。水木的roy的代码 涵盖了2万多字符,但需要pysqlite支持……还是自立更生吧~

我找到最全的数据是slowwind9999上传到csdn的unicode汉字编码表 ,包括全部20902个汉字的全拼、五笔、郑码、UNICODE、GBK、笔画数 部首,以及笔顺编号(拼音部分没有音调,而且个别注音有误,如 囍,猤,啹等字,使用需注意。)我提取了其中的笔顺数据,又用江志键的“实用汉字转拼音 ”程序制作了unicode汉字音调版,其中中文汉字用四声标注,319个日韩汉字没有音调以示区别,并根据汉典的数据略作修正(但仍可能存在错误)。有了这两个对照表,下面的工作就简单了。

  1. # 建立拼音辞典
  2. dic_py = dict()
  3. f_py = open('py.txt',"r")
  4. content_py = f_py.read()
  5. lines_py = content_py.split('\n')
  6. n=len(lines_py)
  7. for i in range(0,n-1):
  8. word_py, mean_py = lines_py[i].split('\t', 1)
  9. dic_py[word_py]=mean_py
  10. f_py.close()

笔顺字典的处理方法也完全相同,虽然文本有两万行,导入还是很快的,0.5秒左右。如果把这两个文件合并起来统一处理,应该可以更快。

  1. # 辞典查找函数
  2. def searchdict(dic,uchar):
  3. if isinstance(uchar, str):
  4. uchar = unicode(uchar,'utf-8')
  5. if uchar >= u'\u4e00' and uchar< =u'\u9fa5':
  6. value=dic.get(uchar.encode('utf-8'))
  7. if value == None:
  8. value = '*'
  9. else:
  10. value = uchar
  11. return value

查找中文,一律转为UTF8字符串,汉字外的其他字符不做处理,原样输出。如果需要声母,只输出拼音的第一个字符就是了。只要资料准确,比较起来就 很轻松了。数字在字母之前,爱(ai4)便会比昂(ang2)靠前,而笔顺值的位数代表了笔画数,数值对应笔划权重,直接比较数字大小就可以得到正确的顺 序。代码如下:

  1. #比较单个字符
  2. def comp_char_PY(A,B):
  3. if A==B:
  4. return -1
  5. pyA=searchdict(dic_py,A)
  6. pyB=searchdict(dic_py,B)
  7. if pyA > pyB:
  8. return 1
  9. elif pyA < pyB:
  10. return 0
  11. else:
  12. bhA=eval(searchdict(dic_bh,A))
  13. bhB=eval(searchdict(dic_bh,B))
  14. if bhA > bhB:
  15. return 1
  16. elif bhA < bhB:
  17. return 0
  18. else:
  19. return "Are you kidding?"
  20. #比较字符串
  21. def comp_char(A,B):
  22. charA = A.decode("utf-8")
  23. charB = B.decode("utf-8")
  24. n=min(len(charA),len(charB))
  25. i=0
  26. while i < n:
  27. dd=comp_char_PY(charA[i],charB[i])
  28. if dd == -1:
  29. i=i+1
  30. if i==n:
  31. dd=len(charA)>len(charB)
  32. else:
  33. break
  34. return dd
  35. # 排序函数
  36. def cnsort(nline):
  37. n = len(nline)
  38. lines="\n".join(nline)
  39. for i in range(1, n): #插入法
  40. tmp = nline[i]
  41. j = i
  42. while j > 0 and comp_char(nline[j-1],tmp):
  43. nline[j] = nline[j-1]
  44. j -= 1
  45. nline[j] = tmp
  46. return nline

现在我们就可以按照字典的规范给中文排序了。

  1. char=['赵','钱','孙','李','佘']
  2. char=cnsort(char)
  3. for item in char:
  4. print item.decode('utf-8').encode('gb2312')

终于得到了“李钱佘孙赵”,样例文件点此下载
这里我没有考虑多音字的情况。如果想让程序自动识别,可以增加多音词组对照表,通过上下文来判断。我不知道哪里有这样的数据,反正对于多音字不太多的情形,手动调整也就够了。

分享到:
评论

相关推荐

    python 汉字按拼音排序

    NULL 博文链接:https://ipython.iteye.com/blog/2007346

    Python 如何按照拼音顺序对中文汉字进行排序 Python源码

    Python 如何按照拼音顺序对中文汉字进行排序 Python源码Python 如何按照拼音顺序对中文汉字进行排序 Python源码Python 如何按照拼音顺序对中文汉字进行排序 Python源码Python 如何按照拼音顺序对中文汉字进行排序 ...

    Python实现EXCEL表格的排序功能示例

    那么,在Python大法中,有没有这样强大的排序功能呢?答案是有的,而且本人觉得Python的排序功能,一点不比EXCEL的差。 同样,我们依然用到的是强大的pandas这个三方库。我们先将numpy和pandas导入进来: 接着构造...

    Python实现针对中文排序的方法

    中文通常有拼音和笔画两种排序方式,在最常用中文标准字符集GB2312中,3755个一级中文汉字是按照拼音序进行编码的,而3008个二级汉字则是按部首笔画排列, &gt;&gt; print '曙'&lt; '鲑','曾'&lt;'怡' True True 出现...

    中文数组按拼音排序代码

    看了网友写的基于Python2中文排序,将其改成Python3的,希望对大家有用。

    按汉字笔画排序

    这个小工具可以用来给名字或者姓氏按笔画多少排序,非常好用。

    Python实现按中文排序的方法示例

    本文实例讲述了Python实现按中文排序的方法。分享给大家供大家参考,具体如下: 安装中文库 sudo apt-get update sudo apt-get install language-pack-zh-hans-base sudo dpkg-reconfigure locales 使用 import ...

    老男孩第三期Python全栈开发视频教程 零基础系统学习Python开发视频+资料

    (5)\\python全栈day41-50\\python全栈s3 day41;目录中文件数:10个 ├─(1) 01 python s3 day41 JS的历史以及引入方式.avi ├─(2) 02 python s3 day41 JS的基础规范.avi ├─(3) 03 python s3 day41 JS的基本数据...

    python入门教程大全.pdf 精心整理

    4.[python入门教程]Python3解决中文字符输出乱码的方法 5.[python入门教程]Python运行错误详解 6.[python入门教程]Python面试基础知识大全 7.[python入门教程]常用Python模版库大全 8.[python入门教程]在IIS下配置...

    Python-汉字拼音转换工具Python版

    将汉字转为拼音。可以用于汉字注音、排序、检索

    Python代码源码-实操案例-框架案例-如何按照拼音顺序对中文汉字进行排序.zip

    Python代码源码-实操案例-框架案例-如何按照拼音顺序对中文汉字进行排序.zip

    Python CategoricalDtype自定义排序实现原理解析

    默认情况下是按照utf-8的编码来进行排序的但是即使如此也很难满足我们对汉字排序的要求。所以通过CategoricalDtye可以把数据类型转成Category类型 然后通过指定参数列表的顺序来自定义那个元素先那个元素后,完全取...

    python字典排序的方法

    python字典怎么排序? 定义一个字典类型 mydict = {2: ‘小路’, 3: ‘黎明’, 1: ‘郭富城’, 4:’周董’} 可分别打印 key和value 看一下数据 按KEY排序,使用了 lambda和 reverse= False(正序) key和value都...

    python进行词频统计的三种方式

    python词频统计, 可视化展示使用pyecharts

    Python Cookbook

    绍了Python应用在各个领域中的一些使用技巧和方法,从最基本的字符、文件序列、字典和排序,到进阶的面向对象编程、数据库和数据持久化、XML处理和Web编程,再到比较高级和抽象的描述符、装饰器、元类、迭代器和生成...

    Python Cookbook(第3版)中文版.pdf

    本书介绍了Python应用在各个领域中的一些使用技巧和方法,从最基本的字符、文件序列、字典和排序,到进阶的面向对象编程、数据库和数据持久化、 XML处理和Web编程,再到比较高级和抽象的描述符、装饰器、元类、迭代...

    Python Cookbook中文版(第2版)(美)马特利(美)阿舍尔.扫描版

    Python Cookbook中文版(第2版)(美)马特利(美)阿舍尔.扫描版 著名的Cookbook系列之一  Python领域里久负盛名的技术图书  Python社区集体智慧的结晶  第一版好评如潮,Amazon五星推荐 本书介绍了python应用在...

    Python编程实践

    本书共15章,通过一些短小精悍的交互式Python脚本帮助学生进行练习,并在这个过程中掌握诸如数据结构、排序和搜索算法、面向对象编程、数据库访问、图形用户界面等基本概念以及良好的程序设计风格。本书既是一本注重...

Global site tag (gtag.js) - Google Analytics