Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin和NSLinguisticTagger-错误或不正确的用法?_C#_Xamarin_Xamarin.ios_Nslinguistictagger - Fatal编程技术网

C# Xamarin和NSLinguisticTagger-错误或不正确的用法?

C# Xamarin和NSLinguisticTagger-错误或不正确的用法?,c#,xamarin,xamarin.ios,nslinguistictagger,C#,Xamarin,Xamarin.ios,Nslinguistictagger,我正在尝试将语法解析集成到Visual Studio 2017上用Xamarin.iOS(4.03)编写的iOS应用程序中。为了让我的脚湿透,我创建了最简单的应用程序 单页应用程序 2个UITextView,一个命名为SentenceInput,一个命名为SentenceOutput 一个带有相关TouchUpInside()方法的单个按钮可以快速完成肮脏的工作 问题是: 词法标记识别全部关闭 一些示例词组和结果(本帖的**高亮度是我的) 我不期望ML类型的质量,但这些是最简单的句子,它们是

我正在尝试将语法解析集成到Visual Studio 2017上用Xamarin.iOS(4.03)编写的iOS应用程序中。为了让我的脚湿透,我创建了最简单的应用程序

  • 单页应用程序
  • 2个UITextView,一个命名为SentenceInput,一个命名为SentenceOutput
  • 一个带有相关TouchUpInside()方法的单个按钮可以快速完成肮脏的工作
问题是:

词法标记识别全部关闭

一些示例词组和结果(本帖的**高亮度是我的)

我不期望ML类型的质量,但这些是最简单的句子,它们是无望的,除非我做了一些非常错误的事情

enter被检测为副词甚至其他词,但不能正确地作为动词。draw一旦被正确地检测为一个动词,那么它就突然变成了一个形容词

我甚至没有约会过比这更复杂的东西——除了通常的“快速棕色狐狸”,有趣的是,它一切正常

下面是简单的基本代码

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));
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统诊断;
使用System.Linq;
使用UIKit;
使用基础;
命名空间应用程序
{
公共部分类ViewController:UIViewController
{
只读列表单词=新列表();
公共视图控制器(IntPtr句柄):基本(句柄)
{
}
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
//加载视图后,通常从nib执行任何附加设置。
}
公共覆盖无效DidReceiveMemoryWarning()
{
base.DidReceiveMemoryWarning();
//释放所有未使用的缓存数据、图像等。
}
部分无效UIButton219_内部接触(UIButton发送器)
{
单词。清除();
var schemes=nsLanguagistTagger.GetAvailableTagSchemesForLanguage(“en”);
var options=nsLinguagistTaggerOptions.Omit标点符号| nsLinguagistTaggerOptions.OmitWhitespace;
var tagger=新的NSLanguagistTagger(方案、选项);
var range=new NSRange(0,SentenceInput.Text.Length);
tagger.AnalysisString=SentenceInput.Text;
tagger.EnumerateTagsInRange(range,nsLanguagisticTag.SchemeLexicalClass,options,TaggerEnumerator);
var items=从words中的word将word.Item2按word.Item1分组到g中,选择新的{Tag=g.Key,words=g.ToList()};
SentenceOutput.Text=$“分析的文本为“{SentenceInput.Text}”\n”;
foreach(项目中的var项目)
{
var results=$“{item.Tag}:{string.Join(“,”,item.Words)}\n”;
控制台写入线(结果);
SentenceOutput.Text+=结果;
}
}
专用void标记分子(NSString标记、NSRange标记范围、NSRange语句范围、参考布尔停止)
{
var word=SentenceInput.Text.Substring((int)tokenRange.Location,(int)tokenRange.Length);
添加(新元组(标签,单词));
}
}
}
正如你所看到的,这是一个简单的演示。没有优化或重构的尝试


语言学家真的这么糟糕吗?我做错了吗?

它不是对单个单词进行字典查找,而是进行概率确定,因此,一个由一两个单词组成的“短语”将导致非常糟糕的分数(使用
PossibleTags
查看分数),现在是“输入您的电话号码”提供足够的语义信息以提供适当的近况。对于像您的示例这样的简短“短语”,一个基于特定领域规则的词法分析器(或解析器)就足够了,并且可以提供比NSLinguisticTagger.Dang更好的结果。我知道这个问题。方法,但曾认为它与查找相结合,以获得更精确的评分。有没有关于.NET词法分析器或解析器不完全使用NLP的建议?有
Stanford CoreNLP for.NET
(这是
Stanford NLP
java代码的IKVM翻译),但可能属于“完全使用NLP”;-)而且它是基于GPL的,并且在没有商业许可证的情况下不能在任何分布式软件中使用(当然,除非您是开源应用程序…),OpenNlp(SharpNlp)提供词性标记以及许多其他功能。。。有许多基于.Net的通用词法分析器/解析器,但它们需要您定义特定于域的规则。谷歌/必应成为您的朋友,因为这一点;-)我查看了斯坦福大学的库套件,发现它们更像是包装器,而不是整个重新实现。因此,它们不会在Xamarin.iOS中工作。除非我看错了什么。看起来我要看的是DSL lexers。
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));
        }
    }
}