Стэнфордский RegexNER - проблема с регулярными выражениями? - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь добавить пользовательские теги, используя классы Stanford NLP .Net.Я реализовал конвейер с помощью regexner и добавил внешний файл тегов для своих настроек.У меня проблема в том, что (несмотря на внешнюю проверку выражений регулярных выражений) ни один из моих пользовательских тегов телефонных номеров не применяется, но очень просто применяется очень простой тег «градус».(Я скопировал тегирование степени из другого примера Стэнфорда, просто чтобы убедиться, что файл регулярного выражения был загружен и работает должным образом.)

Вопрос : что-то не так или несовместимо с использованием регулярных выраженийперечисленные ниже, и если да, то что?или есть проблема формата файла с внешним файлом, который я предоставил?Или ошибка в библиотеке Stanford NLP?

Вот моя настройка C # для простого теста:

using System.IO;
using Console = System.Console;
using edu.stanford.nlp.ling;
using edu.stanford.nlp.pipeline;
using edu.stanford.nlp.sentiment;
using edu.stanford.nlp.ie.crf;
using java.util;

    public MainWindow()
    {
        InitializeComponent();

        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string appPath = System.IO.Path.GetDirectoryName(Uri.UnescapeDataString(uri.Path));

        // Path to the folder with models extracted from `stanford-corenlp-3.4-models.jar`            
        var libraryRoot = appPath + @"/models/";
        var modelRoot = libraryRoot + @"stanford-corenlp-3.9.1-models/";

        const string text = "I have a Bachelor of Science degree.\nPhone: 856.821.9331\n856-821-1234\n856.821.1234\n8568211234";
        Test3(libraryRoot, modelRoot, text);

    }
   public void Test3(string libraryRoot, string modelRoot, string text)
    {
        // Annotation pipeline configuration
        var props = new java.util.Properties();
        props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref, coref, regexner");
        props.setProperty("ner.useSUTime", "0");
        props.put("regexner.mapping", $"{libraryRoot}regexner-general.txt");

        var curDir = Environment.CurrentDirectory;
        Directory.SetCurrentDirectory(modelRoot);
        var pipeline = new StanfordCoreNLP(props);
        Directory.SetCurrentDirectory(curDir);

        Annotation document = new Annotation(text);
        pipeline.annotate(document);

        var sentences = document.get(typeof(CoreAnnotations.SentencesAnnotation));
        if (sentences == null)
            return;

        foreach (Annotation sentence in sentences as ArrayList)
        {
            Console.WriteLine(sentence);
            var tokens = sentence.get(typeof(CoreAnnotations.TokensAnnotation));
            foreach (CoreLabel token in tokens as ArrayList)
            {
                string word = token.get(typeof(CoreAnnotations.TextAnnotation)).ToString();
                string position = token.get(typeof(CoreAnnotations.PartOfSpeechAnnotation)).ToString();
                string ne = token.get(typeof(CoreAnnotations.NamedEntityTagAnnotation)).ToString();
                Console.WriteLine($"=>  word={word}\tposition={position}\tNE={ne}");
            }
        }
    }

Внешний файл regexner, который я собрал, выглядит так (да, вкладки между каждымстолбец):

^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$   PHONE   MISC,NUMBER 4.0
^(?:\(?)(\d{3})(?:[\).\s]?)(\d{3})(?:[-\.\s]?)(\d{4})(?!\d) PHONE   MISC,NUMBER 3.0
[0-9]{3}\W[0-9]{3}-[0-9]{4} PHONE   MISC,NUMBER 2.0
Bachelor of (Arts|Laws|Science|Engineering|Divinity)    DEGREE      2.0

Это приводит к следующему выводу.Обратите внимание, что степень правильно определена, но ни один из телефонных номеров.По крайней мере один номер телефона должен охватываться каждым правилом телефона regexner.(Я проверял это внешне).

I have a Bachelor of Science degree.
=>  word=I  position=PRP    NE=O
=>  word=have   position=VBP    NE=O
=>  word=a  position=DT NE=O
=>  word=Bachelor   position=NN NE=DEGREE
=>  word=of position=IN NE=DEGREE
=>  word=Science    position=NNP    NE=DEGREE
=>  word=degree position=NN NE=O
=>  word=.  position=.  NE=O
Phone: 856.821.9331
856-821-1234
856.821.1234
8568211234
=>  word=Phone  position=NN NE=O
=>  word=:  position=:  NE=O
=>  word=856.821.9331   position=CD NE=NUMBER
=>  word=856-821-1234   position=CD NE=NUMBER
=>  word=856.821.1234   position=CD NE=NUMBER
=>  word=8568211234 position=CD NE=NUMBER
...