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

时间:2019-09-05 14:35:19

标签: javascript string algorithm find indexof

我在数组中有一个表达式列表,需要查找它并在句子列表中突出显示该表达式,并根据发现的内容返回一些统计信息。这是一个简单的例子。

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突出显示文本很容易。)

预先感谢

欢呼

1 个答案:

答案 0 :(得分:1)

不确定是否可以回答您的全部问题,但认为这会有所帮助...

在处理计算机语法时,我发现存在歧义的地方,最好首先搜索按超集排序的令牌。例如,使用您的数据,“ will not”是“ will”的超集,因此,您已经推测到,“ will not”应该在“ will”之前查找。

因此,一旦构建了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,则例程将首先搜索超集合短语,从而消除匹配的歧义...

希望这会有所帮助。