5

这个想法很简单:你在 textarea 中输入一个文本,然后按“发送”并返回一个重复短语的列表。短语我的意思是两个或多个单词重复。我的问题是我不知道如何检测这些(我可以只说一个词)。

$(function() {
    $("#but").click(function() {
        var get = $("#inc").val();
        $("#res").html(get);
        return false;
    });
});

和 HTML:

<form action="" method="POST">
    <textarea name="inc" id="inc" spellcheck="false"></textarea> <br>
    <input type="submit" id="but" value="Send">
</form>

<div id="res"></div>

问题当然是我什至不知道从哪里开始。有什么想法吗?

例子:

巴黎是法国的首都和人口最多的城市。巴黎及巴黎地区占法国国内生产总值的30%以上,是世界上GDP最大的城市之一。

4

4 回答 4

1

查看http://brettterpstra.com/2011/11/02/word-repetition-checking-with-javascript/ 这可能对您尝试做的事情很有帮助。因为问题不是那么简单。最好看看这篇博客文章以及给出的解决方案。它实际上是一个单词重复脚本。

于 2013-05-18T21:05:38.913 回答
0

我只是为了好玩而写了这个 JS Fiddle。我并没有真正费心去检查类似的东西是否已经存在,我想写它。它应该作为一个例子。

只需输入一个段落,然后按“分析”。它将为您提供由 2 个或更多单词组成的短语的出现次数。

玩得开心。:-)

那个 JS Fiddle 包含这个功能:

function analyze_words() {
    document.getElementById('results').innerHTML = '';
    var registry = {};
    var text = document.getElementById('words_input').value;
    var words_splitted = text.split(/[\W]+/);
    var words = [];
    for (var i = 0; i < words_splitted.length; i++) {
        if (words_splitted[i].match(/\w/)) {
            words.push(words_splitted[i].toLowerCase());
        }
    }
    for (var i = 0; i < words.length; i++) {
        var offset = i;
        var length = 1;
        while ((offset + length) < words.length) {
            var phrase = '';
            for (var x = offset; x <= (offset + length); x++) {
                phrase += words[x] + ' ';
            }
            phrase = phrase.replace(/\s$/, '');
            if (!(phrase in registry)) {
                registry[phrase] = 0;
            }
            registry[phrase]++;
            length++;
        }
    }
    for (var phrase in registry) {
        if (registry[phrase] > 1) {
           var div = document.createElement('div');
           div.innerHTML = '"' + phrase + '" appears ' + registry[phrase] + ' times.';
           document.getElementById('results').appendChild(div);
        }
    }
}
于 2013-05-18T21:49:48.610 回答
0

快速搜索会让您觉得这不是一个小问题:-)

但是,对于您的简短示例,蛮力方法可能会起作用,并保持算法简单。

我什至不知道从哪里开始。有任何想法吗?

第一件事是将文本拆分为单词 - 删除空格、标点符号等。您需要在此处对术语“单词”进行定义,例如是否30%应将其视为一个。

然后构建一组最小短语 - 在您的情况下,每两个连续单词。您可能希望排除那些最初在两者之间有一些标点符号的内容。

现在,您可以在该短语数组中搜索重复项 - 最好对其进行排序并比较连续的项目。

当您找到那些重复的短语时,如果您包含更多单词,您可以检查它们是否仍然找到重复。

于 2013-05-18T21:26:11.363 回答
0

将文本拆分为单词,从中生成n-gram并计算出现最多的 n-gram - 小菜一碟!

function ngrams(a, n) {
    return a.map(function(_, i) {
        return a.slice(i, i + n);
    }).slice(0, 1 - n);
}

function count(a) {
    return a.reduce(function(c, x) {
        c[x] = (c[x] || 0) + 1;
        return c;
    }, {});
}

function mostCommon(c) {
    return Object.keys(c).map(function(x) {
        return [x, c[x]]
    }).filter(function(a) {
        return a[1] > 1
    }).sort(function(a, b) {
        return b[1] - a[1]
    });
}

例子:

text = 
    "Paris is the capital of France. Paris is the most populous city of France. " + 
    "Most populous city of France is Paris, the capital of it " +
    "Another populous city of France is Lion";


words = text.toLowerCase().split(/\W+/g)
result = mostCommon(count(ngrams(words, 4)))
console.log(result)

结果:

[
 [
  "populous,city,of,france",  3
 ],
 [
  "most,populous,city,of",  2
 ],
 [
  "city,of,france,is",  2
 ]

http://jsfiddle.net/r9Ht4/

于 2013-05-18T22:10:52.797 回答