本文主要是來安利大家基於 Azure 的認知服務,主要是文本認知服務,可以做到分析輸入文本的情緒,以及判斷當前輸入文本所屬語言等功能 ...
本文主要是來安利大家基於 Azure 的認知服務,主要是文本認知服務,可以做到分析輸入文本的情緒,以及判斷當前輸入文本所屬語言等功能
本文分為兩個部分 ,一個就是在 Azure 上的配置,另一個就是 WPF 端的使用
在 Azure 上我用的是 世紀互聯 的一塊錢訂閱,可以用一塊錢訂閱一個月的試用,這就是為什麼我這幾天都會寫 Azure 相關博客的原因
登錄 Azure 控制台,新建一個 認知服務 新建方法基本上看界面就會了,而微軟的界面會改來改去,我就不放詳細的步驟了
這個服務屬於新建完成就完成 Azure 端的部署
在開始之前還請小伙伴看一下定價層是否是免費的哈,點擊資源管理,點擊定價層,選擇免費,點擊下方的選擇按鈕
接下來還需要點擊 密鑰和終結點 複製粘貼密鑰和訪問地址
在上面的圖片可以看到有兩個密鑰,其實這兩個密鑰可以在代碼裡面使用任意一個,在這裡放兩個只是為了在一個失效之後可以備用另一個
新建一個 WPF 項目,在項目裡面通過 NuGet 安裝 Microsoft.Azure.CognitiveServices.Language.TextAnalytics 庫,這個是 2.1 版本的,最新版本是 3.0 預覽版。不過 3.0 預覽版需要 Azure 伺服器的支持,暫時中國微軟的版本是不支持的,如果使用 3.0 的預覽版將會提示
{code: "404", message: "Resource not found"}
使用 3.0 預覽版需要安裝 Azure.AI.TextAnalytics 庫
安裝 NuGet 庫可以通過修改 csproj 的方法
<ItemGroup>
<!--<PackageReference Include="Azure.AI.TextAnalytics" Version="1.0.0-preview.4" />-->
<PackageReference Include="Microsoft.Azure.CognitiveServices.Language.TextAnalytics" Version="4.0.0" />
</ItemGroup>
被註釋掉的庫就是 3.0 預覽版的,現在是 2020.5 這個庫還是預覽版
在 WPF 中添加一個簡單的界面
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Grid>
<TextBox x:Name="Text" Margin="10,10,10,10" TextWrapping="Wrap" AcceptsReturn="True"></TextBox>
</Grid>
<Grid Grid.Row="1">
<TextBox x:Name="ShowText" Margin="10,10,10,10" IsReadOnly="True" TextWrapping="Wrap"></TextBox>
</Grid>
<StackPanel Margin="10,10,10,10" Grid.Row="2" Orientation="Horizontal">
<StackPanel.Resources>
<Style TargetType="Button">
<Setter Property="Margin" Value="10,10,10,10"></Setter>
</Style>
</StackPanel.Resources>
<Button Content="情緒分析" Click="SentimentAnalysis_OnClick"></Button>
<Button Content="語言檢測" Click="LanguageDetection_OnClick"></Button>
<Button Content="命名實體識別 (NER)" Click="RecognizeEntities_OnClick"></Button>
<Button Content="關鍵短語提取" Click="KeyPhraseExtraction_OnClick"></Button>
</StackPanel>
</Grid>
在使用之前需要創建客戶端模型,需要傳入剛纔複製的 key 和終結點 也就是訪問地址
private static TextAnalyticsClient GetAnalyticsClient()
{
var key = "d131f725093f460c99a09580beba34ed";
var endpoint = "https://lindexi.cognitiveservices.azure.cn/";
var credentials = new ApiKeyServiceClientCredentials(key);
TextAnalyticsClient client = new TextAnalyticsClient(credentials)
{
Endpoint = endpoint
};
return client;
}
請將上面的 key 和 endpoint 替換為你自己 Azure 的
上面的 ApiKeyServiceClientCredentials 是自己實現的類,請看代碼
class ApiKeyServiceClientCredentials : ServiceClientCredentials
{
public ApiKeyServiceClientCredentials(string apiKey)
{
_apiKey = apiKey;
}
public override Task ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request == null)
{
throw new ArgumentNullException(nameof(request));
}
request.Headers.Add("Ocp-Apim-Subscription-Key", _apiKey);
return base.ProcessHttpRequestAsync(request, cancellationToken);
}
private readonly string _apiKey;
}
在拿到 TextAnalyticsClient 類就可以調用很多有趣的方法了,本文的例子用的是同步的方法,但是推薦在實際項目中使用非同步的方法。使用同步的方法會讓界面卡頓
下麵是界面的各個方法實現
private void SentimentAnalysis_OnClick(object sender, RoutedEventArgs e)
{
var client = GetAnalyticsClient();
var sentiment = client.Sentiment(Text.Text, "zh");
ShowText.Text = $"分數:{sentiment.Score:0.00} \r\n 評分接近 0 表示消極情緒,評分接近 1 表示積極情緒";
}
private void LanguageDetection_OnClick(object sender, RoutedEventArgs e)
{
var client = GetAnalyticsClient();
var detectLanguage = client.DetectLanguage(Text.Text);
ShowText.Text =
$"判斷出可能的語言有 {detectLanguage.DetectedLanguages.Count} 個 \r\n {string.Join("\r\n", detectLanguage.DetectedLanguages.Select(temp => $"語言 {temp.Name} 分數 {temp.Score:0.00}"))}";
}
private void RecognizeEntities_OnClick(object sender, RoutedEventArgs e)
{
var client = GetAnalyticsClient();
var result = client.Entities(Text.Text);
ShowText.Text = "";
foreach (var entity in result.Entities)
{
ShowText.Text +=
$"Name: {entity.Name},\tType: {entity.Type ?? "N/A"},\tSub-Type: {entity.SubType ?? "N/A"} \r\n";
foreach (var match in entity.Matches)
{
ShowText.Text +=
$"\tOffset: {match.Offset},\tLength: {match.Length},\tScore: {match.EntityTypeScore:F3}\r\n";
}
}
}
private void KeyPhraseExtraction_OnClick(object sender, RoutedEventArgs e)
{
var client = GetAnalyticsClient();
var result = client.KeyPhrases(Text.Text);
ShowText.Text = $"關鍵詞: {string.Join(";", result.KeyPhrases)}";
}
大概運行效果如下
情緒分析可以分析出一句話是積極的還是消極的,使用分數表示,評分接近 0 表示消極情緒,評分接近 1 表示積極情緒
語言檢測主要用來分析當前輸入文本屬於哪個語言
如輸入英文就會判斷當前是英文
命名實體用來分析文本裡面的某些單詞是屬於什麼,例如某些單詞是人的名字,某些單詞是時間等
關鍵短語提取可以用來提取一句話中的關鍵詞
整體功能還是很爽的,特別是開發特別簡單。而服務本文是中國微軟速度也特別快,本文用的是同步的代碼,但實際上界面也不卡
快速入門:文本分析客戶端庫 v3 - Azure Cognitive Services
本文代碼放在 github 歡迎小伙伴訪問