保留分词结构?
npuichigo opened this issue · comments
Yuchao Zhang commented
问题描述
已经有分词结果的情况下,如何让返回的拼音保持分词的结构呢?
问题复现步骤
pinyin = pypinyin.lazy_pinyin(['我', '是', 'NBA', '的', '球员'])
assert pinyin == ['wo3', 'shi4', 'NBA', 'de5', 'qiu2', 'yuan2']
pypinyin的返回结果是flatten
的拼音序列,正常情况下数一数每个词的字数就能和pinyin结果对应上。但是出现了外文的时候,这种方法就失效了,需要额外考虑原始输入中哪些部分转换失败了
Expected output
pinyin = pypinyin.lazy_pinyin2(['我', '是', 'NBA', '的', '球员'])
assert pinyin == [['wo3'], ['shi4'], ['NBA'], ['de5'], ['qiu2', 'yuan2']]
Huang Huang commented
当前可以通过类似下面这样的方法间接实现:
In [1]: from pypinyin import lazy_pinyin
In [2]: def lazy_pinyin2(words):
...: for w in words:
...: yield lazy_pinyin(w)
...:
In [3]: list(lazy_pinyin2(['我', '是', 'NBA', '的', '球员']))
Out[3]: [['wo'], ['shi'], ['NBA'], ['de'], ['qiu', 'yuan']]
Yuchao Zhang commented
@mozillazg 感谢回答,那么这种对每个word分别调用lazy_pinyin的方法在效果上和性能上,与整句话直接调用相比有什么区别吗
Yuchao Zhang commented
@mozillazg ping
Huang Huang commented
@npuichigo 把 yield lazy_pinyin(w)
改成 yield lazy_pinyin([w])
后就没啥区别了。 lazy_pinyin 内部的实现也是 for 循环遍历处理传入的 list