Cuma Ekim 11th, 2019

Xamarin.Forms Metin Analizi(Text Analytics)

ile Ebubekir Sezer

Merhabalar, Daha önceki yazımda Cognitive Servislerden yüz tanımayı yapmıştım, buğun ise Metin Analizini yapmaya çalışacağım. Metin Analizini uygulamamızda kullanma amaçları verilen bir metinden duygu analizi, metin dilini belirleme, metin içerisinde geçen önemli kişi veya kuruluşları belirleme ve önemli kelimeleri seçme gibi işlemleri yapmak için kullanabiliriz.

İlk olarak Azure’a giriş yapıp burada Cognitive Servislerden Metin Analizi API’ını oluşturmamız gerekir, bu işlemi yapmak çok basit. Api’ ımızı oluşturduktan sonra Bir Xamarin.Forms blank application oluşturabilirsiniz ben daha önce oluşturduğum projeden devam edeceğim. Proje oluştuktan sonra, TextAnalyticsPage adında bir sayfa oluşturuyorum ve bu sayfanın tasarımını yapıyorum.

 <ScrollView>
        <StackLayout Margin="10">
            <Editor Placeholder="Write Something :)"
                    HeightRequest="250"
                    TextColor="Black"
                    PlaceholderColor="Gray"
                    x:Name="myEditor"/>
            <Button Text="Analyze"
                    TextColor="White"
                    BackgroundColor="Green"
                    Clicked="ButtonAnalyze_Clicked"/>
            <ActivityIndicator Color="Green"
                               VerticalOptions="Center"
                               HorizontalOptions="Center"
                               IsVisible="False"
                               x:Name="myActivitIndicator"/>
            <Label x:Name="labelSentiment"
               Style="{StaticResource myLabelStyle}"/>
            <Label x:Name="labelLanguage"
               Style="{StaticResource myLabelStyle}"/>
            <ListView ItemsSource="{Binding .}"
                      HasUnevenRows="True"
                      IsVisible="False"
                      x:Name="listEntityDetails">
                <ListView.Header>
                    <Label Text="Entities ; "
                           Style="{StaticResource myLabelStyle}"
                           TextColor="Red"/>
                </ListView.Header>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <StackLayout Grid.Row="0"
                                             Orientation="Horizontal">
                                    <Label Style="{StaticResource myLabelStyle}">
                                        <Label.FormattedText>
                                            <FormattedString>
                                                <Span Text="Name : "/>
                                                <Span Text="{Binding Name}"/>
                                            </FormattedString>
                                        </Label.FormattedText>
                                    </Label>
                                    <Label Style="{StaticResource myLabelStyle}">
                                        <Label.FormattedText>
                                            <FormattedString>
                                                <Span Text="Type : "/>
                                                <Span Text="{Binding Type}"/>
                                            </FormattedString>
                                        </Label.FormattedText>
                                    </Label>
                                   
                                </StackLayout>
                                <StackLayout Grid.Row="1"
                                             Orientation="Horizontal">
                                    <Label Style="{StaticResource myLabelStyle}">
                                        <Label.FormattedText>
                                            <FormattedString>
                                                <Span Text="Sub-Type : "/>
                                                <Span Text="{Binding SubType}"/>
                                            </FormattedString>
                                        </Label.FormattedText>
                                    </Label>
                                    <Label Style="{StaticResource myLabelStyle}">
                                        <Label.FormattedText>
                                            <FormattedString>
                                                <Span Text="OffSet : "/>
                                                <Span Text="{Binding OffSet}"/>
                                            </FormattedString>
                                        </Label.FormattedText>
                                    </Label>
                                </StackLayout>
                                <StackLayout Grid.Row="2"
                                         Orientation="Horizontal">
                                    <Label Style="{StaticResource myLabelStyle}">
                                        <Label.FormattedText>
                                            <FormattedString>
                                                <Span Text="Length : "/>
                                                <Span Text="{Binding Length}"/>
                                            </FormattedString>
                                        </Label.FormattedText>
                                    </Label>
                                    <Label Style="{StaticResource myLabelStyle}">
                                        <Label.FormattedText>
                                            <FormattedString>
                                                <Span Text="Score : "/>
                                                <Span Text="{Binding Score}"/>
                                            </FormattedString>
                                        </Label.FormattedText>
                                    </Label>
                                </StackLayout>
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <ListView ItemsSource="{Binding .}"
                      HasUnevenRows="False"
                      IsVisible="False"
                      x:Name="listKeyPhrases">
                <ListView.Header>
                    <StackLayout>
                        <Label Text="Key Phrases ; "
                               Style="{StaticResource myLabelStyle}"
                               TextColor="Red"/>
                    </StackLayout>
                </ListView.Header>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Label Text="{Binding KeyPhrase}"
                                   Style="{StaticResource myLabelStyle}"/>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackLayout>
    </ScrollView>

Eğer benim yazdığım kodu kopyala yapıştır yaparsanız, benimle aynı tasarımı elde edersiniz. Tasarım kısmını yaptıktan sonra Analiz etme işlemlerini yapmak için Microsoft’un dokümantasyonunu takip ediyorum. Dokümantasyona erişmek için tıklayın. Projemize Microsoft.Azure.CognitiveServices.Language.TextAnalytics nuget package’ını eklememiz gerekiyor. Paketi indirdikten sonra gerekli olan key ve end-point’i ekleyelim.

private static readonly string subscriptionKey = "Key";
        private static readonly string endpoint = "End-Point";

Bilgileri internette tutacak ve işlem yapmamızı yardımcı olacak class’ı yazalım,

 //Storing credentials
        class ApiKeyServiceClientCredentials : ServiceClientCredentials
        {
            private readonly string apiKey;

            public ApiKeyServiceClientCredentials(string apiKey)
            {
                this.apiKey = apiKey;
            }

            public override Task ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            {
                if (request == null)
                {
                    throw new ArgumentNullException("request");
                }
                request.Headers.Add("Ocp-Apim-Subscription-Key", this.apiKey);
                return base.ProcessHttpRequestAsync(request, cancellationToken);
            }
        }

Metinin duygu analizini yapmamız için yazmamız gereken kod;

 // Sentiment Analyzing of Text
        public void SentimentAnalysisExample(TextAnalyticsClient client)
        {
            //Determining the language
            var detectedLanguage = client.DetectLanguage(myEditor.Text);
            string languageCode = detectedLanguage.DetectedLanguages[0].Iso6391Name;

            var result = client.Sentiment(myEditor.Text, languageCode);
            labelSentiment.Text = "Sentiment Score : " + result.Score;
        }

Metinin dilini belirlemiz için yazmamız gereken kod;

// Language Analyze of Text
        public void LanguageDetectionExample(TextAnalyticsClient client)
        {
            var result = client.DetectLanguage(myEditor.Text);
            labelLanguage.Text = "Language : " + result.DetectedLanguages[0].Name;
        }

Metindeki önemli kurum veya kişilerin belirlemek için yazmamız gereken kod;

// Entity Analyze of Text
        public void EntityRecognitionExample(TextAnalyticsClient client)
        {
            // Otomatically Language setted to the English
            var result = client.Entities(myEditor.Text);

            List<Entity> entities = new List<Entity>();

            if(result.Entities.Count != 0)
            {
                listEntityDetails.IsVisible = true;
                foreach (var entity in result.Entities)
                {
                    foreach (var match in entity.Matches)
                    {
                        entities.Add(new Entity
                        {
                            Name = entity.Name,
                            Length = match.Length.ToString(),
                            OffSet = match.Offset.ToString(),
                            Score = match.EntityTypeScore.ToString(),
                            SubType = entity.SubType,
                            Type = entity.Type
                        });
                    }
                }

                listEntityDetails.BindingContext = entities;
            }
            else
            {
                listEntityDetails.IsVisible = false;
            }
        }

Metindeki önemli kelimeleri bulmak için yazmamız gerekli olan kod;

 // Analyzing of the Key Phrase in the Text
        public void KeyPhraseExtractionExample(TextAnalyticsClient client)
        {
            var result = client.KeyPhrases(myEditor.Text);

            List<Phrase> phrases = new List<Phrase>();

            if(result.KeyPhrases.Count != 0)
            {
                listKeyPhrases.IsVisible = true;
                foreach (string keyphrase in result.KeyPhrases)
                {
                    phrases.Add(new Phrase { KeyPhrase = keyphrase });
                }

                listKeyPhrases.BindingContext = phrases;
            }
            else
            {
                listKeyPhrases.IsVisible = false;
            }
            
        }

Ve yazdığımız fonksiyonları çağırması ve işlem yapmamız için gereken buton eventi;

private void ButtonAnalyze_Clicked(object sender, EventArgs e)
        {
            var credentials = new ApiKeyServiceClientCredentials(subscriptionKey);
            TextAnalyticsClient client = new TextAnalyticsClient(credentials)
            {
                Endpoint = endpoint
            };

            myActivitIndicator.IsVisible = true;
            myActivitIndicator.IsRunning = true;

            SentimentAnalysisExample(client);
            LanguageDetectionExample(client);
            EntityRecognitionExample(client);
            KeyPhraseExtractionExample(client);

            myActivitIndicator.IsVisible = false;
            myActivitIndicator.IsRunning = false;
        }

 

Gerekli olan kodları yazdıktan sonra metin analizini çok rahatlıkla yapabiliriz. Soru ve görüşlerinizi e-mail veya yorum olarak belirtirseniz sevinirim.