2013-05-18 1 views
5

Идея проста: вы помещаете текст в текстовое поле, нажимаете «отправить» и возвращаете список повторяющихся фраз. По фразам я имею в виду два или более слова, повторяющиеся. Моя проблема в том, что я понятия не имею, как их обнаружить (я могу выделить только отдельные слова).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> 

Проблема, конечно, я не знаю даже, с чего начать. Любые иды?

Пример:

Париж s столица и самый густонаселенный город Франции. Париж и Парижский регион составляют более 30% валового внутреннего продукта Франции и имеют один из крупнейших городских ВВП в мире.

+0

Не могли бы вы объяснить вашу проблему дальше? Я не могу получить фразы в части –

+0

, повторяющейся как в «catcat dog» или как в «cat cat cat»? –

+0

Захватите событие отправки формы, а не событие щелчка одной кнопки! – Bergi

ответ

1

Извлекает http://brettterpstra.com/2011/11/02/word-repetition-checking-with-javascript/ Это может быть очень полезно в том, что вы пытаетесь do.Since проблемы не так просто. Лучше посмотреть этот пост в блоге вместе с предоставленным решением. На самом деле это сценарий повторения слов.

0

A quick search даст вам идею, что это не тривиальная проблема :-)

Тем не менее, для коротких примеров, как ваша грубой силы подход может работать, и держать алгоритм прост.

Я не знаю, с чего начать. Есть идеи?

Прежде всего, нужно разделить текст на слова - удаление пробелов, знаков препинания и т. Д. Вам нужно будет сделать определение термина «слово» здесь, например. следует ли считать 30% единым.

Затем создайте массив минимальных фраз - в вашем случае, каждые два последовательных слова. Возможно, вы захотите исключить те, у которых изначально была пунктуация между ними.

Теперь вы можете искать дубликаты в этом массиве фраз - лучше всего, отсортировав его и сравнив последовательные элементы.

Когда вы нашли эти повторяющиеся фразы, вы можете проверить их, есть ли у вас повторения, если вы включили больше слов.

0

I just wrote this JS Fiddle for fun. Я действительно не потрудился проверить, существует ли что-то вроде этого, я хотел написать его. Это должно служить примером.

Просто введите абзац и нажмите «проанализировать». Это даст вам количество выражений фраз, составленных из двух или более слов.

Удачи.:-)

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

Разделить текст на слова, генерировать 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/

Смежные вопросы