Я пытаюсь добавить пользовательские теги, используя классы 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