2013-05-18 6 views
5

アイデアは簡単です:テキストエリアにテキストを配置し、「送信」を押して繰り返すフレーズのリストを返します。フレーズは2つ以上の単語が繰り返されていることを意味します。私の問題は、これらを検出する方法がわからないということです。 javascriptを使用して、繰り返しのフレーズをテキストに作成する

$(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の1つを占めています。

+0

あなたは、さらにあなたの問題を説明してもらえますか?私はフレーズ部分を得ることができません –

+0

"catcat dog"や "cat dog cat"のように繰り返すのですか? –

+0

ボタンのクリックイベントではなく、フォームの送信イベントにフックします。 – Bergi

答えて

1

チェックアウトこれは、あなたが問題をdo.Sinceしようとしているもので、実際に役に立つかもしれhttp://brettterpstra.com/2011/11/02/word-repetition-checking-with-javascript/ ので、非常に簡単ではありません。与えられた解決策とともにこのブログ記事を見ている方が良いです。 実際には単語の繰り返しスクリプトです。

0

A quick searchが、これは

:-)些細な問題が強引なアプローチが働くかもしれあなたのような短い例については、しかし、ではないことをあなたのアイデアを与える、と単純なアルゴリズムを維持します。

どこから始めてもわかりません。何か案は?

まず、テキストを単語に分割して、空白や句読点などを削除します。単語「単語」の定義をここで作成する必要があります。 30%を1としてカウントするかどうかを指定します。

次に、2つの連続する単語ごとに、最小のフレーズの配列を作成します。もともとの間に句読点があったものを除外したいかもしれません。

これで、フレーズの配列内の重複を検索することができます。これは、ソートして連続するアイテムを比較することによって最も効果的です。

これらの反復フレーズを見つけたら、より多くの単語を含めると、繰り返しを見つけるかどうかを確認できます。

0

I just wrote this JS Fiddle for fun。私はそれが既に存在するかどうかを確認することを本当に気にしなかった、私はそれを書きたいと思った。それは例として役立ちます。

段落を入力して「分析」を押してください。それはあなたに2つ以上の単語で構成されたフレーズの出現の数を与えるでしょう。

楽しんでください。:-) JSフィドルは、この機能が含まれている

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); 
     } 
    } 
} 
0

スプリット言葉にテキスト、最も発生するnグラムそれらからn-gramsを生成し、カウント - ケーキを!

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/

関連する問題