Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

拼音转换中英文字符丢失 #307

Closed
tianliang0123 opened this issue Aug 18, 2016 · 14 comments
Closed

拼音转换中英文字符丢失 #307

tianliang0123 opened this issue Aug 18, 2016 · 14 comments

Comments

@tianliang0123
Copy link

在中文与拼音的转换过程中,只要输入句子中含有非中文字符,就输出none,建议能够保留原文中的非中文字符和标点,如当前输入“截至2012年,”就会输出 “ jié zhì none nián none”,建议输出“ jié zhì 2012 nián,”

@hankcs
Copy link
Owner

hankcs commented Aug 18, 2016

这是不可能的,为什么要把标点和拼音混淆在一起?你为什么不根据index去文本里面取呢

@hankcs
Copy link
Owner

hankcs commented Aug 18, 2016

只需少量的代码即可实现你的需求

@hankcs hankcs added the invalid label Aug 18, 2016
@tianliang0123
Copy link
Author

在一些出版行业,比如儿童读物,就需要保留原中文中的数字,标点信息,所以这个原文输出(虽然不需要转换成拼音),这种情况就是必要的。比如我们添加一个参数&fulloutput之类的,一个建议。

@hankcs
Copy link
Owner

hankcs commented Aug 23, 2016

现在应该是你要的效果了:

    System.out.println(HanLP.convertToPinyinString("截至2012年,", " ", true));
    System.out.println(HanLP.convertToPinyinString("截至2012年,", " ", false));

jie zhi none none none none nian none
jie zhi 2 0 1 2 nian ,

@Bahramudin
Copy link

我想问一下:这个姓名设别和地名设别返回的结果是能不能只包括姓名或地名,比如;如果我想设别地名在一句话里“我是在北京市的海淀里”这个算法返回的是“[北京市/ns, 海淀区/ns, 生活/vn, 呢/y, 田村/nr, 路/n]”这个就是做了一个分词而已,怎么知道哪个地名啊。谢谢!

@hankcs
Copy link
Owner

hankcs commented Aug 24, 2016

@hankcs hankcs closed this as completed Aug 24, 2016
@mq-shi
Copy link

mq-shi commented Sep 7, 2016

@hankcs
拼音转换可选保留无拼音的原字符
我用您提供的方法去做,数据包:data-for-1.2.11.zip,jar包:portable-1.2.11
HanLP.convertToPinyinString("截至2012年,", " ", false);返回的结果中已经没有数字
/**

  • 转移状态,支持failure转移
    *
  • @param currentState
  • @param character
  • @return
    */
    com.hankcs.hanlp.collection.AhoCorasick.AhoCorasickDoubleArrayTrie.getState 数字丢失
    可能是我使用方式不对?请求协助,万分感谢。

@hankcs
Copy link
Owner

hankcs commented Sep 7, 2016

哦,这是我的操作失误,portable忘了merge这段代码:

/**
     * 转化为拼音
     *
     * @param text 文本
     * @param separator 分隔符
     * @param remainNone 有些字没有拼音(如标点),是否保留它们的拼音(true用none表示,false用原字符表示)
     * @return 一个字符串,由[拼音][分隔符][拼音]构成
     */
    public static String convertToPinyinString(String text, String separator, boolean remainNone)
    {
        List<Pinyin> pinyinList = PinyinDictionary.convertToPinyin(text, true);
        int length = pinyinList.size();
        StringBuilder sb = new StringBuilder(length * (5 + separator.length()));
        int i = 1;
        for (Pinyin pinyin : pinyinList)
        {

            if (pinyin == Pinyin.none5 && !remainNone)
            {
                sb.append(text.charAt(i - 1));
            }
            else sb.append(pinyin.getPinyinWithoutTone());
            if (i < length)
            {
                sb.append(separator);
            }
            ++i;
        }
        return sb.toString();
    }

@mq-shi
Copy link

mq-shi commented Sep 8, 2016

@hankcs
非常感谢。
转换成带音标的拼音,是不是也可以参考处理。

@hankcs
Copy link
Owner

hankcs commented Sep 8, 2016

是的

@mq-shi
Copy link

mq-shi commented Sep 9, 2016

@hankcs
如果可以把不能转拼音的,如数字,url 能原样输出,而不是加空格,就完美了

@hankcs
Copy link
Owner

hankcs commented Sep 9, 2016

separator上改一下吧

@mq-shi
Copy link

mq-shi commented Sep 9, 2016

@hankcs
是的,separator可以控制,但是可以稍微改进下。
如果separator是空串,就拼音也会合到一起,阅读起来不方便
如果separator不是空串,url之类的特殊情况,看起来不符合常规阅读习惯
如果能在合成结果的时候,增加判断,能转成拼音的,添加separator,不能转拼音的,就不添加separator,最终结果可阅读性会更优。

@hankcs
Copy link
Owner

hankcs commented Sep 9, 2016

你可以按你的需求改改看,欢迎提交pr,谢谢。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants