mozillazg / python-pinyin

汉字转拼音(pypinyin)

Home Page:https://pypinyin.readthedocs.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

tone_to_tone2等函数可能存在的逻辑混乱;拼音转换函数的健壮性

Roseleaves opened this issue · comments

运行环境

  • 操作系统(Linux/macOS/Windows):
  • Python 版本:3.9.12
  • pypinyin 版本:0.46.0

问题描述

一般认为,to_tone2() 是输入单个音节,然后得到 tone2 风格的音节;但是对于多个音节,或者汉字-数字-拼音混合的字符串,则显然很容易产生错误;
此时,如果是汉字-数字-tone风格拼音混合的字符串,tone_to_tone2() 函数理应从字符串中挑出所有的符合 tone 风格的音节,分别转换成 tone2 风格的音节,然后放在混合字符串的原来拼音所在位;
但是出现了问题。经查询原代码,tone_to_tone2() 函数引用了 tone_to_tone3() 函数,tone_to_tone3() 函数引用了 converter.to_tone3(tone) 函数, converter.to_tone3(tone) 函数引用了 converter.to_tone2(tone) 函数,并使用 re.compile(r'^([a-zê]+)([1-5])([a-zê]*)$').sub(r'\1\3\2', pinyin) 来实现 tone2tone3 的转换。

问题复现步骤

from pypinyin.style.tone import converter
from pypinyin.contrib.tone_convert import *
str1 = '1297\tRECID=R2012111530044703\t径直\tjìng zhí\n'

converter.to_tone2(str1)
'1297\tRECID=R2012111530044703\t径直\tji4ng zhi2\n'
converter.to_tone3(str1)
'1297\tRECID=R2012111530044703\t径直\tji4ng zhi2\n'
tone_to_tone3(str1)
'1297\tRECID=R2012111530044703\t径直\tji4ng zhi2\n'
tone_to_tone2(str1)
'\tRECID=R\t径直\tji1ng zhi\n'
to_tone2(str1)
'\tRECID=R\t径直\tji1ng zhi\n'
to_tone3(str1)
'\tRECID=R\t径直\tji1ng zhi\n'

感谢反馈!那些辅助函数设计的都是只支持单个合法的拼音格式作为输入,可能是我的文档没写清楚,我后面更新一下文档,强调一下这个限制。

首先,汇报一下我的进展:tone2tone3 的转化可以用 re.sub(r'([aoeiuvüê]+)([1-5])([oiungr]*)',r'\1\3\2',str2) ,也就是说,去掉^和$,来实现对整个字符串的多次匹配。
顺变一说,tone3tone2 的转化可以用 re.sub(r'([aoeiuvüê])(ng?|r)([1-5])',r'\1\3\2',str2)re.sub(r'([aoe])([oiu])([1-5])',r'\1\3\2',str2) 两句来实现。

那么,关于:

  • “检查一个字符串是不是单个合法拼音“
  • “一个表示单个合法拼音的字符串是什么风格的”
  • ”从某个位点开始,寻找下一个完整拼音的开始位点“
  • ”从某个位点开始,寻找下一个完整拼音的结束位点“
  • ”从字符串中提取所有可能的拼音,返回一个list“
  • “从字符串中提取符合特定规则的拼音,返回一个list”
  • “把字符串中所有所有可能的拼音都转化成特定风格的拼音”
  • “把字符串中所有特定风格的拼音都转化成另一种风格的拼音”

这些事,我还是自行实现吧。或者说,pypinyin有提供这样的功能吗

@Roseleaves pypinyin 没有有提供这样的功能