免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 10391 | 回复: 33
打印 上一主题 下一主题

大侠请进:如何在英文和中文之间加入分隔符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-27 17:49 |只看该作者 |正序浏览
小弟目前在用python处理一份txt文件,中英文夹杂,目前一个关键问题是想在中文和英文之间加上标记,最好能变成xml的格式,例如:
  1. 【地板】 dìbǎn ? 室内铺在地面上的木板,有时也指木质楼板flooring; wooden board laid
  2. on the floor; wooden floor ?
  3. 我的目标是变成:
  4. <w>【地板】</w><p> dìbǎn</p><chexp>室内铺在地面上的木板,有时也指木质楼板</chexp><enexp>flooring; wooden board laid
  5. on the floor; wooden floor </enexp>
复制代码

哪位大侠给点提示,不胜感激!

[ 本帖最后由 wolfg 于 2006-2-27 21:27 编辑 ]

论坛徽章:
0
34 [报告]
发表于 2006-03-09 16:09 |只看该作者
希望你的python能更上一层楼。

论坛徽章:
0
33 [报告]
发表于 2006-03-09 14:49 |只看该作者

回复 32楼 limodou 的帖子

基本搞定了,感谢limodou大侠这么久以来的耐心的教授。
明年央视《感动中国》我题名您上,再次感谢!

论坛徽章:
0
32 [报告]
发表于 2006-03-09 12:12 |只看该作者
存成文本的编码要与你转码的编码要一致。比如使用utf-8转码,那文本就需要是utf-8的。如果是gbk转码,那文本就需要是gbk的。不是简单地存一下就行的。

论坛徽章:
0
31 [报告]
发表于 2006-03-09 10:26 |只看该作者
原帖由 limodou 于 2006-3-8 17:47 发表
有可能是你的文件有无法识别的汉字。可以考虑把示例的文本写入一个文件,用它先试一下。如果没有问题,那就考虑文件中的汉字有非法的。那可以考虑使用utf-8来处理了。但代码中有一处要转为gbk编码的也要转为utf-8 ...

我就把
【牴牾】 dǐwǔ 抵牾 contradiction; conflict
存成文本也不行,错误一样,应该不是修改编码能解决的,因为直接处理上面一行没问题。
还是试一下,改成了utf8,cp936,果然还是不行,报错:


  1. Traceback (most recent call last):
  2.   File "C:\Python24\limodou.py", line 5, in -toplevel-
  3.     a = unicode(test,'utf8')
  4.   File "C:\Python24\lib\encodings\utf_8.py", line 16, in decode
  5.     return codecs.utf_8_decode(input, errors, True)
  6. UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 0: unexpected code byte
复制代码

论坛徽章:
0
30 [报告]
发表于 2006-03-08 18:45 |只看该作者

回复 29楼 limodou 的帖子

好的,我再试试!

论坛徽章:
0
29 [报告]
发表于 2006-03-08 17:47 |只看该作者
有可能是你的文件有无法识别的汉字。可以考虑把示例的文本写入一个文件,用它先试一下。如果没有问题,那就考虑文件中的汉字有非法的。那可以考虑使用utf-8来处理了。但代码中有一处要转为gbk编码的也要转为utf-8才行。

论坛徽章:
0
28 [报告]
发表于 2006-03-08 17:45 |只看该作者
limodou大侠真是热心,好感动!您的代码已经超出我的要求,呵呵,谢谢先!
您的代码肯定是没问题的,但我按您的提示,修改a:

  1. text=file('outputfile.txt').read()
  2. a= unicode(text,'gbk')
复制代码

结果报错:

  1. Traceback (most recent call last):
  2.   File "C:/Python24/limodou.py", line 5, in -toplevel-
  3.     a= unicode(text,'gbk')
  4. UnicodeDecodeError: 'gbk' codec can't decode bytes in position 266-267: illegal multibyte sequence
复制代码

这也是我一直郁闷的,我原来一直用的是直接定义字符串,调试unicode没问题,但是一旦读文件,再转unicode就报错,是不是我的编译环境问题啊?

论坛徽章:
0
27 [报告]
发表于 2006-03-08 17:19 |只看该作者

  1. #coding=gbk

  2. a = u'【牴牾】 dǐwǔ 抵牾 contradiction; conflict 【牴牾】 dǐwǔ 抵牾 contradiction; conflict'

  3. FLAG_WORD = 1
  4. FLAG_PINYIN = 2
  5. FLAG_ZH = 3
  6. FLAG_EN = 4
  7. tags = {
  8.     FLAG_WORD:('<w>', '</w>'),
  9.     FLAG_PINYIN:('<p>', '</p>'),
  10.     FLAG_ZH:('<zh>', '</zh>'),
  11.     FLAG_EN:('<en>', '</en>')
  12. }

  13. flag = -1
  14. i = 0
  15. s = [] #结果
  16. buf = [] #缓冲区
  17. pinyin = u'dǐwǔ' + ' '
  18. last_begin_tag = ''
  19. last_flag = flag
  20. while i<len(a):
  21.     if a[i] == u'【': #开始处理单词
  22.         #判断buf是否有内容,有则输出,同时注意结束tag
  23.         if buf:
  24.             b, e = tags[last_flag]
  25.             buf.append(e)
  26.             s.append(''.join(buf))
  27.             buf = []
  28.         flag = FLAG_WORD
  29.         buf.append(a[i])
  30.         i += 1
  31.         while i < len(a) and a[i] != u'】':
  32.             buf.append(a[i])
  33.             i += 1
  34.         #将】也加到缓冲区中
  35.         buf.append(a[i])
  36.         i += 1
  37.         b, e = tags[flag]
  38.         s.append(b + ''.join(buf) + e)
  39.         
  40.         #开始处理拼音
  41.         flag = FLAG_PINYIN
  42.         buf = []
  43.         while i<a[i] and a[i] in pinyin:
  44.             buf.append(a[i])
  45.             i += 1
  46.         b, e = tags[flag]
  47.         s.append(b + ''.join(buf).strip() + e) #使用strip去掉多余的首尾空格
  48.         last_flag = flag
  49.         buf = []
  50.         continue
  51.     else:
  52.         if ord(a[i]) < 127: #英文
  53.             flag = FLAG_EN
  54.         else:
  55.             flag = FLAG_ZH
  56.         if last_flag != flag:
  57.             #判断是否上一个标志是否是中或英文,如果不是表示第一次进入则输出开始tag,
  58.             #否则先输出上一个的结束tag,然后是一个开始tag
  59.             if last_flag in (FLAG_ZH, FLAG_EN):
  60.                 b, e = tags[last_flag]
  61.                 buf.append(e)
  62.             b, e = tags[flag]
  63.             buf.append(b)
  64.             buf.append(a[i])
  65.             last_flag = flag
  66.         else:
  67.             buf.append(a[i])
  68.     i += 1

  69. if buf:
  70.     b, e = tags[last_flag]
  71.     buf.append(e)
  72.     s.append(''.join(buf))
  73.         
  74. print ''.join([x.encode('gbk') for x in s])
复制代码


这里我没有从文件中读出文本,直接使用了一个unicode串来处理的。而且可以处理多个汉语词组。因此最开始可以:

text = file('a.txt').read() #这样把文本全部读出来
然后转化为unicode

a = unicode(text, 'gbk')

论坛徽章:
0
26 [报告]
发表于 2006-03-08 16:08 |只看该作者
原帖由 limodou 于 2006-3-8 14:59 发表
不是已经说了嘛,使用unicode呀。因为unicode的一个字符就表示一个完整的汉字。而gbk汉字的话两个字符是一个汉字。如果使用gbk来处理的话,那么你要两个字符两个字符来处理,这样才是完整的。 

估计您也烦躁了,我自以为不是太笨,找了一些python中unicode的资料,还是不得要领。简单直接点问您吧,我有一行文本:
【牴牾】 dǐwǔ 抵牾 contradiction; conflict
保存在test.txt中,请问您要如何读取,然后如何操作(能把汉字和拼音像abcd一样处理),最好您就直接写段代码,将test.txt中的文本变成:
【牴牾】 <p>dǐwǔ</p> 抵牾 contradiction; conflict
我菜不是问题,问题是菜了还不承认。您也不要再教导了,如果我看不懂代码再来请教,谢谢!
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP