模型方言转换器 | demo

方言转换器作为一种先进的语言处理工具,在现代社会中发挥着越来越重要的作用。其核心功能在于能够将方言转换为标准的普通话,或者将普通话转换为各种方言,从而打破地域语言障碍,促进不同地区之间的交流与理解。

具体来说,方言转换器的作用主要体现在以下几个方面:

  1. 促进无障碍沟通:方言转换器能够帮助来自不同地区的人进行更顺畅的交流。在工作、学习、旅行等场合,使用方言转换器可以消除语言障碍,使得信息能够更有效地传递。

  2. 辅助方言学习:对于想要学习方言的人来说,方言转换器是一个很好的辅助工具。它不仅可以提供方言的发音和语调,还可以帮助学习者理解方言的词汇和语法结构。

  3. 文化传承与保护:方言转换器在转换方言的过程中,也起到了传承和保护方言文化的作用。通过方言转换器,更多人能够了解和欣赏到方言的独特魅力,从而增强对方言文化的认知和尊重。

  4. 新闻报道与文化传播:方言转换器在新闻报道和文化传播领域也有广泛应用。它可以帮助新闻从业者更好地采访和报道方言地区的新闻,让更多人了解不同地区的文化特色。同时,在文化传播中,方言转换器也能够让更多人欣赏到方言的魅力,促进文化交流与融合。

在进入正题之前先来了解余弦距离和欧式距离

‌‌欧式距离和余弦距离是两种常用的距离度量方法,它们在计算方式和应用场景上有显著差异。‌

欧式距离

欧式距离是指在欧几里得空间中两点之间的距离,即两点坐标之间的直线距离。其公式为:

图片

其中,(x1, y1)和(x2, y2)是两个点的坐标。欧式距离适用于数据的绝对数值差距比较大的情况,例如二维坐标系中的点‌。

余弦距离

余弦距离是指两个向量之间的夹角,也称为余弦相似度的补数。其公式为:

图片

其中,θ是两个向量之间的夹角,∑(xi)^2和∑(yi)^2分别是两个向量对应元素的平方和。余弦距离适用于无量纲数据或数据特征相似度的度量,例如文本处理中的词向量‌。

应用场景

  • ‌欧式距离‌:适用于数值上的绝对差异较大的情况,例如分析用户活跃度时,关注登录次数和平均观看时长的绝对差异‌。

  • ‌余弦距离‌:适用于方向上的相对差异较大的情况,例如分析用户行为时,关注用户对不同视频的偏好差异‌。

数学公式和计算方法

  • ‌欧式距离‌:直接计算两点在多维空间中的直线距离。

  • ‌余弦距离‌:通过计算两个向量之间的夹角来衡量它们的相似度,然后取补数得到距离。

在后面的dmeo中采用余弦距离来测算数据。

演示

一句话的时候比如:"今天和你摆龙门阵,很高兴。"

转换成普通话的时候其实可以是: "今天和你聊天,很高兴。

或者"今天和你闲谈,很高兴"。

这个地方根据前文后语发现明显使用"聊天"合适一点。

这个就是希望出现的结果;那么我们转换成编程语言如何来进行控制呢?

ps:其中有假设的地方文本的多维度数据计算,需自行考虑。

1.先来假设训练了一组数据


//摆龙门阵 的chars值 是{25670, 40857, 38376, 38453}
//对应的是聊天的chars值{32842, 22825} 和 闲谈的值是 {38386, 35848}
// 自己编写训练时可根据自己的模型生成不同维度的数据 
// 比如第一个维度生成谓语的值,第二个维度生成宾语的值。    
//实际应用中相当于把用户的话语根据自己的模型生成多维度的值,
// 确保方言的语义畅通
    static Map<int[], List<int[]>> map =
            Map.of(new int[]{25670, 40857, 38376, 38453},
                    java.util.List.of(
                    //聊天 这个相当于用户自定义的值
                    new int[]{32842, 22825,0,0},
                    //闲谈  这个相当于用户自定义的值
                    new int[]{38386, 35848,0,0}
            ));
    static Map<int[], List<int[]>> map2 =
            Map.of(new int[]{25670, 40857, 38376, 38452},
                    List.of(
                            new int[]{32842, 22825,0,0},
                            new int[]{38386, 35848,0,0}
                    ));
    private static List<Map<int[],List<int[]>>> finalList= List.of(
            map,map2
    );

2.设定阀值

//阀值默认设置为2 代表2个数组长度以上,进行计算
private static final int threshold = 2;

3.计算两个值之间的距离

// 计算两个向量的余弦距离
    public static double cosineDistance(int[] vec1, int[] vec2) {
        if (vec1.length != vec2.length) {
            throw new IllegalArgumentException("长度不相等");
        }
        double dotProduct = 0.0;
        double norm1 = 0.0;
        double norm2 = 0.0;
        for (int i = 0; i < vec1.length; i++) {
            dotProduct += vec1[i] * vec2[i];
            norm1 += vec1[i] * vec1[i];
            norm2 += vec2[i] * vec2[i];
        }
        return 1 - dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
    }

4.主入口

//今天和你摆龙门阵,很高兴。[25670, 40857, 38376, 38453]
        String input_str1 = "今天和你摆龙门阵,很高兴。";
        //实际应用中相当于把整段话,根据自己的逻辑生成多维度的数组值进行计算 demo演示先固定使用摆龙门阵的chars的值
        //获取字段的chars数组值 实际应用中,根据逻辑或模型,生成当前文本的多维度数组值
        int[] input_chars = input_str1.chars().toArray();
        List<int[]> thresholdList = getThresholdList(input_chars);
        //根据文本的维度值调用当前文本的map数据,
        // 实际应用中,根据文本的计算值,先查用户给的训练数据
        Map<int[], List<int[]>> listMap = queryMap(thresholdList);

        //根据文本chars计算出了方言转换器,根据转换获得普通话是当前哪个值,根据余弦距离或欧式距离等等
        // 获取Map中所有键的Set视图
        Set<int[]> keySet = listMap.keySet();
        System.out.println(input_str1+"---方言转换前的chars数据:"+Arrays.toString(input_chars));
        for (int[] key : keySet) {
            //这里应该是根据用户的文本生成的多维度数据来进行判断,来看使用聊天还是使用闲聊,
            //这里目前暂时直接根据chars的值进行余弦距离来选择
            // 按道理这里只是计算你训练后的维度值,然后根据维度值来查找字符的chars值
            //这里略过了生成维度值,直接使用chars的值来当维度值
            double v1 = cosineDistance(key, listMap.get(key).get(0));
            double v2 = cosineDistance(key, listMap.get(key).get(1));
            System.out.println(v1);
            System.out.println(v2);
            //假设我只训练了2条数据 聊天和闲谈
            if(v1>=v2){
                int[] newValues = listMap.get(key).get(0);
                int[] oldValues = key;
                replaceSequence(input_chars,oldValues,newValues);
            }
        }
        // 使用StringBuilder还原字符串
        StringBuilder sb = new StringBuilder();
        for (int unicodePoint : input_chars) {
            // 将Unicode码点转换回字符并添加到StringBuilder中
            if(unicodePoint!=0){
                char ch = (char) unicodePoint;
                sb.append(ch);
            }
        }
        // 获取还原后的字符串
        String restored_str = sb.toString();
        System.out.println(restored_str+"---方言转换后的chars数据:"+Arrays.toString(input_chars));

结果:

图片

本文demo文件载地址:

链接: https://pan.baidu.com/doc/share/LDAroZvSpVcHNBiZeA5OmQ-98953341978034 提取码: 01lt

作者介绍:

        一个在这里探索编程乐趣,专注于分享、工具箱类小程序、涵盖各类实用工具,让你的日常生活和工作更加便捷高效。

        休闲游戏类小程序、轻松有趣的小游戏,让你在忙碌之余享受片刻的欢愉与放松;         

        一直探索各种可能性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值