def _pinyin(words, style, heteronym, errors, strict=True): pys = [] # 初步过滤没有拼音的字符 if RE_HANS.match(words): pys = phrase_pinyin(words, style=style, heteronym=heteronym, errors=errors, strict=strict) return pys for word in simple_seg(words): if not (RE_HANS.match(word)): py = handle_nopinyin(word, errors=errors) pys.append(py) if py else None else: pys.extend(_pinyin(word, style, heteronym, errors, strict=strict)) return pys
def convert(self, words, style, heteronym, errors, strict, **kwargs): """根据参数把汉字转成相应风格的拼音结果。 :param words: 汉字字符串 :type words: unicode :param style: 拼音风格 :param heteronym: 是否启用多音字 :type heteronym: bool :param errors: 如果处理没有拼音的字符 :param strict: 是否严格遵照《汉语拼音方案》来处理声母和韵母 :type strict: bool :return: 按风格转换后的拼音结果 :rtype: list """ pys = [] # 初步过滤没有拼音的字符 if RE_HANS.match(words): pys = self._phrase_pinyin(words, style=style, heteronym=heteronym, errors=errors, strict=strict) return pys py = self.handle_nopinyin(words, style=style, errors=errors, heteronym=heteronym, strict=strict) if py: pys.extend(py) return pys
def _seg(chars): """按是否是汉字进行分词""" s = '' # 保存一个词 ret = [] # 分词结果 flag = 0 # 上一个字符是什么? 0: 汉字, 1: 不是汉字 for n, c in enumerate(chars): if RE_HANS.match(c): # 汉字, 确定 flag 的初始值 if n == 0: # 第一个字符 flag = 0 if flag == 0: s += c else: # 上一个字符不是汉字, 分词 ret.append(s) flag = 0 s = c else: # 不是汉字 if n == 0: # 第一个字符, 确定 flag 的初始值 flag = 1 if flag == 1: s += c else: # 上一个字符是汉字, 分词 ret.append(s) flag = 1 s = c ret.append(s) # 最后的词 return ret
def _pinyin(words, style, heteronym, errors): pys = [] # 初步过滤没有拼音的字符 if RE_HANS.match(words): pys = phrases_pinyin(words, style=style, heteronym=heteronym, errors=errors) return pys for word in simple_seg(words): if not (RE_HANS.match(word)): py = handle_nopinyin(word, errors=errors) pys.append(py) if py else None else: pys.extend(_pinyin(word, style, heteronym, errors)) return pys
def pinyin(self, hans, style=Style.TONE, heteronym=False, errors='default', strict=True, **kwargs): """将汉字转换为拼音,返回汉字的拼音列表。 :param hans: 汉字字符串( ``'你好吗'`` )或列表( ``['你好', '吗']`` ). 可以使用自己喜爱的分词模块对字符串进行分词处理, 只需将经过分词处理的字符串列表传进来就可以了。 :type hans: unicode 字符串或字符串列表 :param style: 指定拼音风格,默认是 :py:attr:`~pypinyin.Style.TONE` 风格。 更多拼音风格详见 :class:`~pypinyin.Style` :param errors: 指定如何处理没有拼音的字符。详见 :ref:`handle_no_pinyin` * ``'default'``: 保留原始字符 * ``'ignore'``: 忽略该字符 * ``'replace'``: 替换为去掉 ``\\u`` 的 unicode 编码字符串 (``'\\u90aa'`` => ``'90aa'``) * callable 对象: 回调函数之类的可调用对象。 :param heteronym: 是否启用多音字 :param strict: 只获取声母或只获取韵母相关拼音风格的返回结果 是否严格遵照《汉语拼音方案》来处理声母和韵母, 详见 :ref:`strict` :return: 拼音列表 :rtype: list """ # 对字符串进行分词处理 if isinstance(hans, text_type): han_list = self.seg(hans) else: if isinstance(self._converter, UltimateConverter) or \ isinstance(self._converter, ToneSandhiMixin): han_list = [] for h in hans: if not RE_HANS.match(h): han_list.extend(self.seg(h)) else: han_list.append(h) else: han_list = chain(*(self.seg(x) for x in hans)) pys = [] for words in han_list: pys.extend( self._converter.convert(words, style, heteronym, errors, strict=strict)) return pys
def seg(hans): hans = simple_seg(hans) ret = [] for x in hans: if not RE_HANS.match(x): # 没有拼音的字符,不再参与二次分词 ret.append(x) elif PHRASES_DICT: ret.extend(list(mmseg.seg.cut(x))) else: # 禁用了词语库,不分词 ret.append(x) return ret
def tag_pinyin(txt): newparts = [] for part in simple_seg(txt): if RE_HANS.match(part): pys = lazy_pinyin(part) newparts += [_ for _ in zip(part, pys)] else: for p in re.split(r'([,。?!?,])', part): if p: newparts.append((p, None)) return newparts
def _pinyin(words, style, heteronym, errors, strict=True): """ :param words: 经过分词处理后的字符串,只包含中文字符或只包含非中文字符, 不存在混合的情况。 """ pys = [] # 初步过滤没有拼音的字符 if RE_HANS.match(words): pys = phrase_pinyin(words, style=style, heteronym=heteronym, errors=errors, strict=strict) return pys py = handle_nopinyin(words, errors=errors) if py: pys.append(py) return pys
def _pinyin(words, style, heteronym, errors, strict=True): """ :param words: 经过分词处理后的字符串,只包含中文字符或只包含非中文字符, 不存在混合的情况。 """ pys = [] # 初步过滤没有拼音的字符 if RE_HANS.match(words): pys = phrase_pinyin(words, style=style, heteronym=heteronym, errors=errors, strict=strict) return pys py = handle_nopinyin(words, errors=errors, heteronym=heteronym) if py: pys.extend(py) return pys
def seg(hans): if getattr(seg, 'no_jieba', None): ret = hans return simple_seg(ret) if seg.jieba is None: try: import jieba seg.jieba = jieba except ImportError: seg.no_jieba = True return seg(hans) else: hans = simple_seg(hans) ret = [] for x in hans: if not RE_HANS.match(x): # 没有拼音的字符,不再参与二次分词 ret.append(x) else: ret.extend(list(seg.jieba.cut(x))) return ret