String 如何从一组字符串中提取常用词

String 如何从一组字符串中提取常用词,string,algorithm,String,Algorithm,假设我们有这样的字符串: Tommy is a very good child Tommy has a very wonderful child Tommy loves his very child 我想将上述3个字符串的常用词提取为: Tommy*very*child 我该怎么做?谢谢。编辑我刚刚意识到@Joce的评论,我用JavaScript给出了我的答案。但它可以很容易地适应其他语言。如果不是JavaScript,则将其视为伪代码 编辑2哇!它在我第一次尝试时工作得很好!请参阅上的工

假设我们有这样的字符串:

Tommy is a very good child
Tommy has a very wonderful child
Tommy loves his very child
我想将上述3个字符串的常用词提取为:

Tommy*very*child 

我该怎么做?谢谢。

编辑我刚刚意识到@Joce的评论,我用JavaScript给出了我的答案。但它可以很容易地适应其他语言。如果不是JavaScript,则将其视为伪代码

编辑2哇!它在我第一次尝试时工作得很好!请参阅上的工作示例

这可能是一个非常庞大的脚本解决方案,但下面是:

将原始句子作为字符串数组给出:

var sentences = [
    "Tommy is a very good child",
    "Tommy has a very wonderful child",
    "Tommy loves his very child"
];
您可以尝试从每个数组创建一个单词数组,并将其存储在多维数组中

var split = [];
for(var i = 0; i < sentences.length; i++) {
    split[i] = sentences[i].split(" ");
}
var split=[];
for(var i=0;i<句长;i++){
拆分[i]=句子[i]。拆分(“”);
}
您也可以在这里删除重复的单词,但我不知道如何当场删除,但您可能会得到一些简单的算法来执行此操作。当然,除非你允许重复单词短语

然后,您可以使用相同的单词创建另一个数组,并按如下方式填充:

var same = [];
for(var i = 0; i < split.length; i++) {             // loop through sentences
    for(var j = 0; j < split[i].length; j++) {      // go through each sentence for new words
        if(same.indexOf(split[i][j]) <= -1) {       // if not already found
            var inAll = true;
            for(var k = 0; k < split.length; k++) { // check if in every sentence
                if(k == i) continue;
                if(split[k].indexOf(split[i][j]) <= -1) inAll = false; // if not found, make `inAll` false
            }
            if(inAll) same.push(split[i][j]);       // if found in all other sentences, add to array `same`
        }
    }
}
var same=[];
对于(var i=0;i如果(same.indexOf(split[i][j])EDIT我刚刚意识到@Joce的评论,我用JavaScript给出了我的答案。但是它可以很容易地适应其他语言。如果不是JavaScript,就把它当作伪代码

编辑2哇!在我第一次尝试时,它工作得非常出色!请参阅上的工作示例

这可能是一个非常庞大的脚本解决方案,但下面是:

将原始句子作为字符串数组给出:

var sentences = [
    "Tommy is a very good child",
    "Tommy has a very wonderful child",
    "Tommy loves his very child"
];
您可以尝试从每个数组创建一个单词数组,并将其存储在多维数组中

var split = [];
for(var i = 0; i < sentences.length; i++) {
    split[i] = sentences[i].split(" ");
}
var split=[];
for(var i=0;i<句长;i++){
拆分[i]=句子[i]。拆分(“”);
}
你也可以在这里删除重复的单词,但我不知道如何当场删除,但你可能会得到一些简单的算法来完成。当然,除非你允许重复的单词短语

然后,您可以使用相同的单词创建另一个数组,并按如下方式填充:

var same = [];
for(var i = 0; i < split.length; i++) {             // loop through sentences
    for(var j = 0; j < split[i].length; j++) {      // go through each sentence for new words
        if(same.indexOf(split[i][j]) <= -1) {       // if not already found
            var inAll = true;
            for(var k = 0; k < split.length; k++) { // check if in every sentence
                if(k == i) continue;
                if(split[k].indexOf(split[i][j]) <= -1) inAll = false; // if not found, make `inAll` false
            }
            if(inAll) same.push(split[i][j]);       // if found in all other sentences, add to array `same`
        }
    }
}
var same=[];
对于(var i=0;i如果(same.indexOf(split[i][j])保持简单,我将在这里使用:

我之所以使用
lodash
,仅仅是因为它提供了一种简洁的方法,用于描述您实际要做的事情,即基于(例如)分隔符和变换的联合

联合是独立于语言的:用于实现联合的算法将根据您选择的语言有所不同


您可以在函数中使用它,在函数中定义分隔符(例如,我是否在空格处分隔?)和转换(例如,单词是否必须大写才能匹配?

为了保持简单,我将在这里使用:

我之所以使用
lodash
,仅仅是因为它提供了一种简洁的方法,用于描述您实际要做的事情,即基于(例如)分隔符和变换的联合

联合是独立于语言的:用于实现联合的算法将根据您选择的语言有所不同


您可以在函数中使用它,在函数中定义分隔符(例如,我是否在空格处分隔?)和转换(例如,单词是否必须大写才能匹配?

您可以使用名为
反向索引的数据结构

首先,为每个输入字符串指定一个唯一的整数。然后,对于输入字符串中的每个单词,您希望计算一个整数列表,表示该单词出现在其中的字符串。请注意,只需处理所有输入字符串即可轻松完成此操作。在您的情况下,为了获得所有字符串中出现的单词,您可以输出出现列表中条目数与输入中字符串数相同的单词

有关更多详细信息,请参阅此处:


您可以使用名为
反向索引的数据结构

首先,为每个输入字符串指定一个唯一的整数。然后,对于输入字符串中的每个单词,您希望计算一个整数列表,表示该单词出现在其中的字符串。请注意,只需处理所有输入字符串即可轻松完成此操作。在您的情况下,为了获得所有字符串中出现的单词,您可以输出出现列表中条目数与输入中字符串数相同的单词

有关更多详细信息,请参阅此处:


所谓“部分”是指“整个单词”还是指单个字符或一组字符?编辑谢谢clarifying@JonathanLam,我的意思是以单词为单位。谢谢。你说的“部分”是指“整个单词”吗?还是可以是单个字符或一组字符?编辑谢谢clarifying@JonathanLam,我的意思是用词单位。谢谢。是吗“一个提供一致性、模块性、性能和附加功能的JavaScript实用程序库。”我不确定它是什么,所以我希望这能为其他人澄清。是“一个提供一致性、模块性、性能和附加功能的JavaScript实用程序库”。我不确定它是什么,所以我希望这能为其他人澄清。