javascript 中的上下文相关子字符串查找

Context-dependent substring finding in javascript

我有一个数组中的表达式列表,我需要查找并在句子列表中突出显示,并根据我找到的 return 一些统计信息。这是一个简单的例子来说明它是如何工作的。

listOfExpressions = new Array();
listOfSentences = new Array();
listOfSentences.push("I will not do my own bed very early");
listOfSentences.push("I will eat my lunch around 12:00");

listOfExpressions.push(["will","verb","positive"];
listOfExpressions.push(["will not","verb","negative"]);
listOfExpressions.push(["bed","noun","common_object"]);
listOfExpressions.push(["very","adverb",""]);
listOfExpressions.push(["my","possessive,"singular"]);

我需要为 listOfSentences 中的每个句子突出显示我发现的 listOfExpressions 的表达加上 return 一些额外的统计数据,例如所有格的数量直接跟在名词后面(在第一个句子中为 0,在第二个句子中为 1),并为每个句子显示此内容。

我最初的想法是用 .replace(/([.?!])\s*(?=[A-Z])/g, "|").split("|") 之类的东西按单词拆分句子,但是用 "will not" 示例会失败......当然可以想象拆分 listOfExpressions 但这在项目中是不可能的。我在这里给出了一个非常简单的例子,但我正在寻找的东西更复杂, listOfExpressions 应该被视为不可变的。将每个句子拆分为单词数组的另一个问题是,它还会将 "I will not" 检测为 "will" 出现,而​​不是将不会检测到。

所以这让我简单地将 indexOf()listOfExpressions 的每个项目一起使用。现在的问题是,对于我提到的额外统计数据,我还需要了解前后单词,以便能够正确计算句子中直接跟在名词后面的所有格的数量。我想称呼这个问题的一个好方法是说它是一个上下文相关的子字符串查找。

看来我被困在那里了。我不确定如何从这里开始......我认为这可能是一个简单的问题(和解决方案)并且我可能会遗漏一些明显的东西,所以我想出一些外部外观并且 advice/ideas 会有所帮助。这是一个与语言无关的算法问题,但我很乐意就此获得一些建议。 Javascript 会更受欢迎,因为它是我目前用于该项目的语言(我认为在 JS 中突出显示文本很容易)。

提前致谢,

干杯

我不确定这是否回答了您的整个问题,但认为它会有所帮助...

在处理计算机语法时,我发现在可能存在歧义的地方,最好先搜索以超集排序的标记。例如,使用您的数据,"will not" 是 "will" 的超集,因此,正如您已经推测的那样,应该在 "will" 之前寻找 "will not"。

因此,一旦构建了 listOfExpressions,它们就可以按如下方式排序...

listOfExpressions.sort( (a,b) => { return b[0].localeCompare(a[0]) } )

为了增加示例的复杂性,我将以下内容添加到上面的列表中...

listOfExpressions.push(["will not run","x","x"]);
listOfExpressions.push(["will be home","x","x"]);
listOfExpressions.push(["will be back","x","x"]);
listOfExpressions.push(["will be","x","x"]);
listOfExpressions.push(["will not be","x","x"]);

...然后按上述排序,示例结果如下...

0: (3) ["will not run", "x", "x"]
1: (3) ["will not be", "x", "x"]
2: (3) ["will not", "verb", "negative"]
3: (3) ["will be home", "x", "x"]
4: (3) ["will be back", "x", "x"]
5: (3) ["will be", "x", "x"]
6: (3) ["will", "verb", "positive"]
7: (3) ["very", "adverb", ""]
8: (3) ["my", "possessive", "singular"]
9: (3) ["bed", "noun", "common_object"]

...现在,如果您使用此有序的 listOfExpressions 和 indexOf() 搜索 listOfSentences,例程将首先查找超集短语,从而消除匹配项的歧义...

希望对您有所帮助。