dotnet Microsoft.Recognizers.Text 超强大的自然语言关键词提取库

本文和大家介绍一个使用超级简单,但是功能特别强大的自然语言关键词提取库,可以根据输入的自然语言提取出里面的信息。例如我在一句话里面说了哪些数值变量或者说了手机号码等

先看看下图的一个效果,下图是尝试识别一句话里面的数值信息

新建一个 WPF 项目,大概运行效果如下

先编辑 csproj 文件,在里面添加安装库的代码

    <ItemGroup>
        <PackageReference Include="Microsoft.Recognizers.Text" Version="1.3.2"></PackageReference>
        <PackageReference Include="Microsoft.Recognizers.Text.Number" Version="1.3.2"></PackageReference>
        <PackageReference Include="Microsoft.Recognizers.Text.NumberWithUnit" Version="1.3.2"></PackageReference>
        <PackageReference Include="Microsoft.Recognizers.Text.DateTime" Version="1.3.2"></PackageReference>
        <PackageReference Include="Microsoft.Recognizers.Text.Sequence" Version="1.3.2"></PackageReference>
        <PackageReference Include="Microsoft.Recognizers.Text.Choice" Version="1.3.2"></PackageReference>
    </ItemGroup>

这几个库提供了如下的功能

数值

 var recognizeNumber = NumberRecognizer.RecognizeNumber(text, Culture.Chinese);

返回的值是解析到多少个数值,可以通过下面代码转换为字符串

        private static string ModelResultToString(List<ModelResult> list)
        {
            var pre = "";
            var breakLine = "\r\n";
            var str = new StringBuilder();
            foreach (var modelResult in list)
            {
                str.Append(pre)
                    .Append("关键词: ")
                    .Append(modelResult.Text)
                    .Append(breakLine)
                    .Append(pre)
                    .Append($"起点 {modelResult.Start} 终点 {modelResult.End}")
                    .Append(breakLine);
                if (modelResult.Resolution.TryGetValue("value", out var value))
                {
                    str.Append(pre)
                        .Append("值:")
                        .Append(value)
                        .Append(breakLine);
                }

                str.Append(breakLine);
            }

            return str.ToString();
        }

返回值包含了原文的关键词,也就是通过关键词解析的数值,关键词在原文的起点和终点。还有解析出的值

布尔

  var recognizeBoolean = ChoiceRecognizer.RecognizeBoolean("对的", Culture.Chinese);

IP

var recognizeIpAddress = SequenceRecognizer.RecognizeIpAddress(text, Culture.Chinese);

电话号

var recognizePhoneNumber = SequenceRecognizer.RecognizePhoneNumber(text, Culture.Chinese);

时间

var recognizeDateTime = DateTimeRecognizer.RecognizeDateTime("下午6点", Culture.Chinese);

温度

var recognizeTemperature = NumberWithUnitRecognizer.RecognizeTemperature("十度", Culture.Chinese);

大小

var recognizeDimension = NumberWithUnitRecognizer.RecognizeDimension("十米", Culture.Chinese);

货币

var recognizeCurrency = NumberWithUnitRecognizer.RecognizeCurrency(text, Culture.Chinese);

年龄

var recognizeAge = NumberWithUnitRecognizer.RecognizeAge(text, Culture.Chinese);

序号

var recognizeOrdinal = NumberRecognizer.RecognizeOrdinal(text, Culture.Chinese);

这是一个开源的项目,请看 Recognizers-Text/.NET at master · microsoft/Recognizers-Text

本文的界面使用 WPF 写的,代码放在 github 欢迎小伙伴访问

界面如下

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid Margin="10,10,10,10">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <TextBox x:Name="Text" AcceptsReturn="True" Height="60" TextWrapping="Wrap" />
            <Button Margin="10,0,0,0" Grid.Column="1" Content="字节" Click="Button_OnClick" />
        </Grid>
        <Grid Grid.Row="1" Margin="10,10,10,10">
            <ListView x:Name="ListView" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
                <ListView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel Orientation="Horizontal" />
                    </ItemsPanelTemplate>
                </ListView.ItemsPanel>
                <ListView.ItemTemplate>
                    <DataTemplate DataType="local:ModelInfo">
                        <Grid Height="300" Width="200" Margin="10,10,10,10" Background="#C6C6C6">
                            <Grid Margin="10,10,10,10">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" />
                                    <RowDefinition />
                                </Grid.RowDefinitions>
                                <TextBlock FontWeight="Bold" FontSize="30" Text="{Binding Title}" />
                                <TextBlock Grid.Row="1" Text="{Binding Content}" TextWrapping="Wrap" />
                            </Grid>
                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>
    </Grid>

数据绑定的是 ModelInfo 里面包含两个值

    public class ModelInfo
    {
        public ModelInfo(string title, string content)
        {
            Title = title;
            Content = content;
        }

        public string Title { get; }

        public string Content { get; }
    }

在每次点击按钮的时候重新创建列表给 ListView 控件

        private void Button_OnClick(object sender, RoutedEventArgs e)
        {
            var text = Text.Text;
            var modelInfoList = new List<ModelInfo>();

            RecognizeNumber(text, modelInfoList);
            RecognizeOrdinal(text, modelInfoList);

            RecognizeAge(text, modelInfoList);
            RecognizeCurrency(text, modelInfoList);
            RecognizeDimension(text, modelInfoList);
            RecognizeTemperature(text, modelInfoList);

            RecognizeDateTime(text, modelInfoList);

            RecognizePhoneNumber(text, modelInfoList);
            RecognizeIpAddress(text, modelInfoList);

            RecognizeBoolean(text, modelInfoList);

            ListView.ItemsSource = modelInfoList;
        }

对应的几个方法就是判断如果存在对应的值就添加到列表

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

版权声明:本文为lindexi_gd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lindexi_gd/article/details/106316322

智能推荐

mybatis+ehcache二级缓存

导入jar包 mapper.xml文件开启二级缓存 pojo类实现序列化接口 配置ehcache.xml 测试...

python+opencv实现图像拼接

任务 拍摄两张图片去除相同部分,拼接在一起 原图 结果 步骤 读取两张图片 使用sift检测关键点及描述因子 匹配关键点 处理并保存关键点 得到变换矩阵 图像变换并拼接 代码实现 扩展 这里对右边图像进行变换,右边变得模糊,可以修改代码对左边图像变换 这里只有两张图片拼接,可以封装实现多张图片拼接 可以修改代码实现上下图片的拼接...

python_sklearn机器学习算法系列之AdaBoost------人脸识别(PCA,决策树)

          注:在读本文之前建议读一下之前的一片文章python_sklearn机器学习算法系列之PCA(主成分分析)------人脸识别(k-NearestNeighbor,KNN)         本文主要目的是通过一个简单的小...

memmove函数与memcpy函数的模拟实现

memmove函数和memcpy函数都是在内存复制任意类型的,但是它俩也有区别。当源区域和目标区域有重复的,memmove函数会复制缓冲区重叠的部分,而memcpy相反,会报出未知错误。 下面给出两个函数的实现 首先,memmove函数。 实现的基本原理如下图。 具体代码如下: memcpy函数的实现很简单,就直接给出源代码了...

猜你喜欢

SpringFramework核心 - IOC容器的实现 - 总结

1. 概述 把Spring技术内幕第一章和第二章过了一遍,也做了一些笔记, 对IOC容器的实现有了一定皮毛理解,现在跟着源码再过一遍总结一下IOC容器的初始化,Bean的初始化的过程,做一下总结 ① IOC容器和简单工厂模式 在开始之前,先想想我们平时是怎么使用IOC容器为我们管理Bean的,假设我们要把下面的User类交给IOC容器管理 我们不想关心如何创建一个User对象实例的,仅仅在需要他的...

Python和Django的安装

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈  一、下载并安装Python Python 官方下载地址:http://www.python.org/ftp/python/ 我们这里选择的是 Python 2.7.2 。虽然目前最新版是Python 3.2.2, 但是Django目前还不支持 Python 3.2.2。 安装步骤很简单,双击安装包开...

OpenStack代码贡献初体验

为什么80%的码农都做不了架构师?>>>     OpenStack如今已成为开源云平台中的明星项目,得到广泛关注。OpenStack的优秀出众依赖于众多开发者的努力,在享受其带来的便利与快捷的同时,为其做一份贡献也是一个开发者的义务。  在前段时间的OpenStack的测试过程中,我发现Nova项目中的一个Bug,于是向社区提交了Bug报...

SQL Server之8:sql查询每个学生得分最高的两门课

这是一道面试题,今天有空把它记下来,以后遇到此类问题作个参考!刚一看到这个题目,估计好多人都会想到关键字top,其实这里用到的关键字是partition, 好了,先看看表结构,及数据吧!     接下来看一看partition的功能,执行语句   结果如下:   到这里一目了然知道最终结果了!   View Code     &...

vue-video-player 浏览器缩放

文章目录 前言 一、vue-video-player的封装 二、调用 1. 引入 2. vue template代码 2. 主要js代码 效果 前言 此篇是在上一次《[Vue 播放rtmp直播流]》基础之上的更新及补充;近期接到客户需求,需要在视频流上显示额外的信息;当然,视频流上叠加信息可以通过canvas来完成(透明canvas实现),但是在测试的过程中发现,当浏览器缩放时,叠加的图层信息与初...