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

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表达式,并返回一些额外的统计数据,例如直接跟在名词后面的所有格的数量(在第一个句子中是0,在第二个句子中是1),并为每个句子显示这个。
我最初的想法是用类似于.replace(/([.?!])\s*(?=[A-Z])/g, "$1|").split("|")这样的词把句子一个词一个词地分开,但是如果用“will not”这个例子的话就会失败当然,可以想象将listOfExpressions拆分,但这在项目中是不可能的。我在这里举了一个非常简单的例子,但是我要找的东西更复杂,而且listOfExpressions应该被看作是不可变的。把每个句子分成一组词的另一个问题是,它也会检测到“我不会”作为“意志”发生,而不是作为意志不发生。
因此,我只需对indexOf()中的每一项使用listOfExpressions现在的问题是,我需要,对于我提到的其他统计数据,也要知道前面和后面的单词,以便能够正确地计算句子中直接跟在名词后面的所有格的数量。我想调用这个问题的一个好方法是说它是一个上下文相关的子字符串查找。
所以我好像被困在那里了。我不知道怎么从现在开始…我认为这可能是一个简单的问题(和解决方案),我可能遗漏了一些显而易见的东西,所以我认为一些外部的看法和建议/想法会有帮助。这是一个语言不可知和算法问题,但我想得到一些建议。javascript将更受欢迎,因为它是我目前用于该项目的语言(我认为在js中突出显示文本很容易)。
提前谢谢你,
干杯

最佳答案

我不确定这能回答你的全部问题,但你认为这会有帮助…
在处理计算机语法时,我发现在有可能产生歧义的地方,最好先搜索用超集排序的标记。例如,使用你的数据,“will not”是一个“will”的超级集合,因此“will not”应该在“will”之前找到,正如你已经推测的那样。
因此,一旦您构建了表达式列表,它们可以按如下顺序排列…

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

为了增加示例的复杂性,AM将以下添加到您的列表中…
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"]

……这样,如果现在使用这个有序的表达式列表搜索词条列表,并且如您所示,indexOf(),那么例程将首先搜索超级集合短语,从而消除匹配的模糊性……
希望这有帮助。

10-07 16:01