У меня есть array
токенов для сопоставления и регулярное выражение, которое получает начальную и конечную позиции каждого токена в пределах входного предложения.Это работает нормально, когда токен имеет одно вхождение.Когда токен встречается несколько раз, жадный Regex
получит все совпадающие позиции токена в тексте, поэтому результирующая позиция для i-го вхождения токена будет отображаться последней найденной позицией.
Например, учитывая текст
var text = "Steve down walks warily down the street down\nWith the brim pulled way down low";
, первое вхождение токена down
отображается на последнюю позицию в тексте, соответствующем RegExp
, следовательно, у меня есть:
{
"index": 2,
"word": "down",
"characterOffsetBegin": 70,
"characterOffsetEnd": 73
}
Становится ясно, запустив этот пример:
var text = "Steve down walks warily down the street down\nWith the brim pulled way down low";
var tokens = text.split(/\s+/g);
var annotations = tokens.map((word, tokenIndex) => { // for each token
let item = {
"index": (tokenIndex + 1),
"word": word
}
var wordRegex = RegExp("\\b(" + word + ")\\b", "g");
var match = null;
while ((match = wordRegex.exec(text)) !== null) {
var wordStart = match.index;
var wordEnd = wordStart + word.length - 1;
item.characterOffsetBegin = wordStart;
item.characterOffsetEnd = wordEnd;
}
return item;
});
console.log(annotations)
, где первое вхождение токена down
должно быть первой совпадающей позицией:
{
"index": 2,
"word": "down",
"characterOffsetBegin": 6,
"characterOffsetEnd": 9
}
Так, учитывая, что я сопоставил позицию токеновдля каждого вхождения токена в тексте, т. е. первое вхождение down
с первым совпадением, 2-е - со вторым совпадением и т. д. Я могу восстановить текст соответствующим образом с помощью charOffsetBegin
и charOffsetEnd
, следовательно, сделав так:
var newtext = '';
results.sentences.forEach(sentence => {
sentence.tokens.forEach(token => {
newtext += text.substring(token.characterOffsetBegin, token.characterOffsetEnd + 1) + ' ';
});
newtext += '\n';
});