用JavaScript计算文档中单词的开始和结束位置

用JavaScript计算文档中单词的开始和结束位置,javascript,text-processing,Javascript,Text Processing,我有一个文本文档,表示为句子的数组,对于每个句子,我有一个单词标记的数组 我必须为每个标记位置计算文档中标记位置的绝对开始和结束,因此,如果在一个句子中我有ipsum五次,我必须为每次出现在该句子中获得正确的位置 我写了这个函数 // calculate begin and end to each token in a sentence function calculateTokenBeginEnd(textArray) { var currentText = []; textArray

我有一个文本文档,表示为句子的
数组
,对于每个句子,我有一个单词标记的
数组

我必须为每个标记位置计算文档中标记位置的绝对开始和结束,因此,如果在一个句子中我有
ipsum
五次,我必须为每次出现在该句子中获得正确的位置

我写了这个函数

// calculate begin and end to each token in a sentence
function calculateTokenBeginEnd(textArray) {
  var currentText = [];
  textArray.sentences.forEach(function(sentence) {
    for (var i = 0; i < sentence.tokens.length; ++i) {
      var token = sentence.tokens[i];
      var word = token.word;
      if (i > 0) {
        var thisBegin = token.characterOffsetBegin;
        var previousEnd = sentence.tokens[i - 1].characterOffsetEnd;
        if (thisBegin > previousEnd) {
          currentText.push(' ');
        }
      }
      token.characterOffsetBegin = currentText.length;
      for (var j = 0; j < word.length; ++j) {
        currentText.push(word[j]);
      }
      token.characterOffsetEnd = currentText.length;
    }
    currentText.push('\n');
  });
  return textArray;
} //calculateTokenBeginEnd
这是一个使用此方法的示例。然后,
calculateTokenBeginEnd
应该计算令牌开始和结束索引,而
text2centencestokens
创建了上面的文档结构。
calculateTokenBeginEnd
无法按预期工作

text=“我是一位杰出的职业经理人,我的工作和生活都是暂时性的。”,\不可撤销的劳动合同不可撤销。\n不可撤销的劳动合同不可撤销的劳动合同不可撤销。\n不可撤销的不可撤销的劳动合同不可撤销的劳动合同不可撤销。\n不可撤销的不可撤销的劳动合同,不可撤销的不可撤销的劳动合同
//将文本映射到句子和标记的步骤
text2centencestokens=函数(文本){
var self=这个;
返回新的承诺((解决,))=>{
让句子=text.split(/\n+/g);
让sentencesP=句子.map((句子,行索引)=>{//
返回新的承诺((解决,))=>{
让tokens=句子.split(/\s+/g);
对于每个令牌,让tokensP=tokens.map((token,tokenIndex)=>{//
让项目={
“索引”:(令牌索引+1),
“字”:代币
}
if(typeof(tokenP)==“函数”){
返回令牌p.apply(自身,[项目]);
}否则{
返回新的承诺((解决,))=>{
解决(项目);
});
}
});
Promise.all(令牌SP)
。然后(res=>{
决心({
索引:lineIndex,
案文:一句话,
代币:res
});
})
.catch(err=>console.error(err))
});
});
承诺,一切(句子SP)
。然后(res=>{
决心({
句子:res
})
})
.catch(err=>console.error(err))
});
}//text2centencestokens
//计算句子中每个标记的开始和结束
函数calculateTokenBeginEnd(textArray){
var currentText=[];
textArray.句子.forEach(函数(句子){
for(变量i=0;i<句子.tokens.length;++i){
var-token=句子。tokens[i];
var-word=token.word;
如果(i>0){
var thisbeng=token.characterOffsetBegin;
var previousEnd=句子。标记[i-1]。characterOffsetEnd;
如果(thisBegin>previousEnd){
currentText.push(“”);
}
}
token.characterOffsetBegin=currentText.length;
对于(变量j=0;j{
句子=计算开始(句子);
控制台日志(句子);

})
这可能是一种更简单的方法来计算句子中单词的开头/结尾,希望能有所帮助

var word=“Lorem”;
var reg=RegExp(单词“g”);
var station=“Lore ipsum Lorem dolor sit Lorem amet,”;
var匹配;
控制台日志(句子);
console.log(word);
while((match=reg.exec(句子))!==null){
var wordStart=match.index;
var wordEnd=wordStart+word.length-1;
log(wordStart+'-start index');
log(word.length+'-单词长度');
log(wordEnd+'-最后一个字符索引,需要+1才能与子字符串一起使用);
log(句子.子字符串(wordStart,wordEnd+1)+'-使用带有计算的子字符串查找单词并验证');

}
谢谢此建议帮助重写了问题,添加了一个可能的解决方案。
RegExp
也存在一个问题,即我们应该考虑当前
句子中
标记的多个匹配项。
更新了代码以考虑多个匹配项。嘿@xtothel我已经更新了问题是,当在一个句子中循环使用代币时,只考虑最后一个匹配,因此匹配的位置将是错误的。
{
    "sentences": [
        {
          "index": 0,
          "text": "Lorem ipsum dolor sit amet,",
          "tokens": [
            {
              "index": 1,
              "word": "Lorem",
              "characterOffsetBegin": 0,
              "characterOffsetEnd": 5
            },
            {
              "index": 2,
              "word": "ipsum",
              "characterOffsetBegin": 5,
              "characterOffsetEnd": 10
            },
    ...
          ]
        },
        {
          "index": 1,
          "text": " consectetur adipiscing elit,",
          "tokens": [
            {
              "index": 1,
              "word": "",
              "characterOffsetBegin": 24,
              "characterOffsetEnd": 24
            },
    ...
    }