Xamarin и NSLinguisticTagger - ошибка или неправильное использование?

Я пытаюсь интегрировать синтаксический разбор в приложение для iOS, написанное в Xamarin.iOS (4.03) для Visual Studio 2017. Для того, чтобы у меня были ноги, я создал простейшее из приложений.

  • одностраничное приложение
  • 2 UITextViews, один с именем SentenceInput, другой с именем SentenceOutput
  • одна кнопка со связанным методом TouchUpInside(), выполняющая быструю и грязную работу.

Проблема:

Лексическое распознавание лексем отключено!

Несколько примеров фраз и результатов (** выделение - мое для этого поста)

SentenceInput   | SentenceOutput
----------------|-----------------------------------
enter text here | Analysed text is 'enter text here'
                | **Adverb: enter**,here
                | Noun: text
----------------|-----------------------------------
draw a circle   | Analysed text is 'draw a circle'
                | Verb: draw
                | Determiner: a
                | Noun: circle
----------------|-----------------------------------
enter           | Analysed text is 'enter'
                | **OtherWord: enter**
----------------|-----------------------------------
enter text      | Analysed text is 'enter text'
                | **Adverb: enter**
                | Noun: text
----------------|-----------------------------------
draw circle     | Analysed text is 'draw circle'
                | **Adjective: draw**
                | Noun: circle
----------------|-----------------------------------
enter first door| Analysed text is 'enter first door on the right'
on the right    | **Adverb: enter**
                | Adjective: first,right
                | Noun: door
                | Preposition: on
                | Determiner: the

Я не ожидал качества шрифта ML, но это самые простые предложения, и они безнадежно отключены, если я не делаю что-то очень неправильное.

enter определяется как наречие и даже другое слово, но не правильно как глагол. Ничья однажды правильно определена как глагол, тогда это внезапно прилагательное!

Я даже не собирался бросать в него что-то более сложное - за исключением обычной "быстрой коричневой лисы", которая, что интересно, все получилось!

Вот простой базовый код

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using UIKit;
using Foundation;

namespace App
{
    public partial class ViewController : UIViewController
    {
        readonly List<Tuple<string, string>> words = new List<Tuple<string, string>>();

        public ViewController(IntPtr handle) : base(handle)
        {
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            // Perform any additional setup after loading the view, typically from a nib.
        }

        public override void DidReceiveMemoryWarning()
        {
            base.DidReceiveMemoryWarning();
            // Release any cached data, images, etc that aren't in use.
        }

        partial void UIButton219_TouchUpInside(UIButton sender)
        {
            words.Clear();

            var schemes = NSLinguisticTagger.GetAvailableTagSchemesForLanguage("en");

            var options = NSLinguisticTaggerOptions.OmitPunctuation | NSLinguisticTaggerOptions.OmitWhitespace;
            var tagger = new NSLinguisticTagger(schemes, options);

            var range = new NSRange(0, SentenceInput.Text.Length);

            tagger.AnalysisString = SentenceInput.Text;

            tagger.EnumerateTagsInRange(range, NSLinguisticTag.SchemeLexicalClass, options, TaggerEnumerator);

            var items = from word in words group word.Item2 by word.Item1 into g select new {Tag = g.Key, Words = g.ToList()};

            SentenceOutput.Text = $"Analysed text is '{SentenceInput.Text}'\n";
            foreach (var item in items)
            {
                var results = $"{item.Tag}: {string.Join(",", item.Words)}\n";
                Console.WriteLine(results);
                SentenceOutput.Text += results;
            }

        }

        private void TaggerEnumerator(NSString tag, NSRange tokenRange, NSRange sentenceRange, ref bool stop)
        {
            var word = SentenceInput.Text.Substring((int)tokenRange.Location, (int)tokenRange.Length);
            words.Add(new Tuple<string, string>(tag, word));
        }
    }
}

Как вы можете видеть, это почти так же просто, как это может быть для этой демонстрации. Никаких попыток оптимизации или рефакторинга.

NSLinguisticTagger действительно так плох? Я делаю это неправильно?

0 ответов

Другие вопросы по тегам