Ruby: найти наиболее распространенную фразу в массиве строк - PullRequest
2 голосов
/ 08 марта 2012

Я бы хотел найти 10 самых распространенных вопросов в массиве из 300-500 строк в Ruby.

Примером элемента является

[«Привет, я хотел бы получить ваш продукт. У меня только один вопрос. Как мне изменить свой пароль?», «Может кто-то сказать мнекак я могу изменить свой пароль? »,« Я не могу себе этого позволить. Как я могу отменить свою учетную запись? »,« Удаление учетной записи? »,« Я забыл свой пароль, как я могу изменить свой пароль? », .....]

По сути, у меня будет множество строк, и я должен извлечь вопрос и найти 10 самых распространенных вопросов из этого массива.

Я попытался осмотреться (проверил n-грамм, но это не показалось мне слишком уместным) и еще не нашел каких-либо идей.

Вам известны какие-нибудь алгоритмы, на которые вы посоветовали бы мне взглянуть?Ссылка на пару примеров была бы потрясающей!

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Я бы сказал, что первым шагом было бы определить, какие строки (или подстроки) на самом деле являются вопросами.Простой подход к этому заключался бы в поиске «?», Но опять же, в зависимости от ваших требований, вы можете усилить это - возможно, ищите «вопросительные слова».Вероятно, это будет самая легкая часть вашей задачи.

Как только вы получите список строк (которые предположительно являются вопросами) - вам нужно сгруппировать подобные и вернуть 10 самых больших корзин.Лучшим способом было бы объединить семантический + синтаксический подход.Возможно, вы могли бы взглянуть на эту статью , поскольку они, похоже, решают проблему нахождения сходства между двумя строками.Они приводят некоторые убедительные причины того, почему требуется двойной синтаксически-семантический подход.

0 голосов
/ 08 марта 2012

Не уверен насчет специальных алгоритмов, но если бы мне было поручено это задание:

array = ["my account is locked.", "can i have the account password to my account?", "what's my password?"]

array.map! {|x| x.split(' ')} #make each sentence an element

word_freq = Hash.new(0)

i = 0
while i < array.length
array[i].each {|x| word_freq[x] += 1}
i += 1
end

word_freq.each {|m, x| puts "#{m} appears #{x} times"}  #words are now keys with frequency values

print word_freq.keys  #an array of key words to mess with
...