本文和大家介紹一個使用超級簡單,但是功能特別強大的自然語言關鍵詞提取庫,可以根據輸入的自然語言提取出里面的資訊,例如我在一句話里面說了哪些數值變數或者說了手機號碼等
先看看下圖的一個效果,下圖是嘗試識別一句話里面的數值資訊

新建一個 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://www.uj5u.com/qita/14670.html
標籤:其他
