Простая фильтрация общих слов из текстового описания - PullRequest
2 голосов
/ 11 января 2011

Такие слова, как «а», «the», «best», «kind».Я почти уверен, что есть хорошие способы достижения этого

Просто чтобы прояснить ситуацию, я ищу

  1. Самое простое решение, которое может быть реализовано, желательно в ruby.
  2. У меня высокий уровень толерантности к ошибкам
  3. Если мне нужна библиотека общих фраз, я тоже очень доволен

Ответы [ 5 ]

2 голосов
/ 11 января 2011

Эти распространенные слова известны как «стоп-слова» - здесь есть похожий вопрос о стеке потока: Список «стоп-слов» для английского языка?

Подводя итог:

  • Если у вас есть большой объем текста, с которым стоит иметь дело, было бы целесообразно собрать статистику о частоте слов в этом конкретном наборе данных и выбрать наиболее часто встречающиеся слова для вашего списка стоп-слов.(То, что вы включили «kind» в свои примеры, подсказывает мне, что у вас может быть довольно необычный набор данных, например, с множеством разговорных выражений, таких как «kind», поэтому, возможно, вам придется это сделать.)
  • Поскольку вы говорите, что вы не особо против ошибок, то может быть достаточно просто использовать список стоп-слов для английского языка, который создал кто-то другой, например, довольно длинный, используемый MySQL или все остальное, что обнаруживает Google .

Если вы просто поместите эти слова в хеш в своей программе, то будет легко отфильтровать любой список слов.

1 голос
/ 11 января 2011

Это вариант ответа DigitalRoss.

str=<<EOF
To be, or not to be: that is the question: 
  Whether 'tis nobler in the mind to suffer
  The slings and arrows of outrageous fortune,
  Or to take arms against a sea of troubles,
  And by opposing end them? To die: to sleep;
  No more; and by a sleep to say we end
  The heart-ache and the thousand natural shocks
  That flesh is heir to, 'tis a consummation
  Devoutly to be wish'd. To die, to sleep;
  To sleep: perchance to dream: ay, there's the rub;
  For in that sleep of death what dreams may come
EOF

common = {}
%w{ a and or to the is in be }.each{|w| common[w] = true}
puts str.gsub(/\b\w+\b/){|word| common[word.downcase] ? '': word}.squeeze(' ')

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

1 голос
/ 11 января 2011
  Common = %w{ a and or to the is in be }
Uncommon = %{
  To be, or not to be: that is the question: 
  Whether 'tis nobler in the mind to suffer
  The slings and arrows of outrageous fortune,
  Or to take arms against a sea of troubles,
  And by opposing end them? To die: to sleep;
  No more; and by a sleep to say we end
  The heart-ache and the thousand natural shocks
  That flesh is heir to, 'tis a consummation
  Devoutly to be wish'd. To die, to sleep;
  To sleep: perchance to dream: ay, there's the rub;
  For in that sleep of death what dreams may come
}.split /\b/
ignore_me, result = {}, []
  Common.each { |w| ignore_me[w.downcase] = :Common          }
Uncommon.each { |w| result << w unless ignore_me[w.downcase[/\w*/]] }
puts result.join


 ,  not  : that   question: 
Whether 'tis nobler   mind  suffer
 slings  arrows of outrageous fortune,
  take arms against  sea of troubles,
 by opposing end them?  die:  sleep;
No more;  by  sleep  say we end
 heart-ache   thousand natural shocks
That flesh  heir , 'tis  consummation
Devoutly   wish'd.  die,  sleep;
 sleep: perchance  dream: ay, there's  rub;
For  that sleep of death what dreams may come
0 голосов
/ 20 марта 2011

Если у вас есть массив слов для удаления с именем stop_words, то вы получите результат из этого выражения:

description.scan(/\w+/).reject do |word|
  stop_words.include? word
end.join ' '

Если вы хотите сохранить несловарные символы между каждым словом,

description.scan(/(\w+)(\W+)/).reject do |(word, other)|
  stop_words.include? word
end.flatten.join
0 голосов
/ 12 января 2011

Постойте, вам нужно провести какое-то исследование, прежде чем вынимать стоп-слова (иначе говоря, шумовые слова, ненужные слова). Размер индекса и ресурсы обработки - не единственные проблемы. Многое зависит от того, будут ли конечные пользователи печатать запросы, или вы будете работать с длинными автоматическими запросами.

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

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

...