Нахождение n-граммовых частот в большом наборе предложений - PullRequest
0 голосов
/ 25 августа 2018

У меня есть набор текстовых сообщений. Давайте назовем их m1, m2, ..... Максимальное количество сообщений ниже 1,000,000. Длина каждого сообщения не должна превышать 1024, а все они должны быть строчными. Давайте также выберем n-грамм s1.

Мне нужно найти частоту всех возможных подстрок из всех этих сообщений. Например, допустим, у нас есть только два сообщения:

m1 = a cat in a cage
m2 = a bird in a cage

Частота некоторых n-грамм в этих двух сообщениях:

'a' = 4
'in a cage' = 2
'a bird' = 1
'a cat' = 1
...

Обратите внимание, что, поскольку in = 2, in a = 2 и a cage = 2 являются подмножествами in a cage = 2 и имеют одинаковую частоту, они не должны быть перечислены. Только возьми самый длинный, который имеет самую высокую частоту; следуйте этому условию: самая длинная sn-грамма должна состоять максимум из 8 слов, с общим количеством символов ниже 30. Если n-грамм превышает этот предел, его можно разбить на два или более n-граммов и перечислить отдельно.

Мне нужно найти такие n-граммы для всех этих текстовых сообщений и отсортировать их по количеству вхождений в порядке убывания.

Как мне подойти к этой проблеме? Мне нужно решение в JavaScript.

PS: Мне нужна помощь, но я не знаю, где это спросить. Если вопрос не для этого сайта, то где мне его публиковать? пожалуйста, направьте это новичок здесь.

1 Ответ

0 голосов
/ 25 августа 2018

Может быть, вы можете подойти следующим образом.Я отредактирую, чтобы добавить объяснение, как только у меня будет время.

var subSentences = (w,...ws) => ws.length ? ws.reduce((r,s) => (r.push(r[r.length-1] + ` ${s}`), r),[w])
                                              .concat(subSentences(...ws))
                                          : [w],
    frequencyMap = sss => sss.reduce((map,ss) => subSentences(...ss.split(/\s+/)).reduce((m,s) => m.set(s, m.get(s) + 1 || 1), map), new Map());

    frequencies  = frequencyMap(["this is a test string",
                                 "this is another one",
                                 "yet another one is here"]);

console.log(...frequencies.entries()); // logging map object seems not possible hence entries
.as-console-wrapper { max-height : 100% !important
                    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...