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 действительно так плох? Я делаю это неправильно?