Частота слов в тексте
От: Andriy Melnyk Украина  
Дата: 05.10.09 16:42
Оценка:
Есть довольно большой текст — более 400 000 слов. Где-то 14 000 уникальных слов.

Нужно

1. Составить список наиболее встречаемых слов — имеем частоту по словам. Это в принципе просто
2. Составить список наиболее встречаемых пар слов.
3. Составить список наиболее встречаемых три слова как фраза. Это усложнение пункта 2
4. Составить список наиболее встречаемых пар слов разделенных другим словом. Например, наиболее часто встречается 345 раз — "I <some word> you"

Нужны прежде всего эффективные алгоритмы, а не простой перебор.

Куда копать?
Re: Частота слов в тексте
От: Lloyd Россия  
Дата: 05.10.09 17:18
Оценка: 10 (4)
Здравствуйте, Andriy Melnyk, Вы писали:

AM>Нужны прежде всего эффективные алгоритмы, а не простой перебор.


AM>Куда копать?


Дык, 2, 3, 4 — это разновидности 1-го.
Поскольку слов немного, то каждому слову пожно сопоставить 2-х байтовое число. Поучаем массив 2-х байтовых чисел A.
1. Чтобы найти частоты слов, достаточно найти частоты соответствующих 2-х байтовых чисел.
2. Чтобы найти частоты пар, достаточно сформировать другой массив 4-х байтовых чисел: B[i] = A[i] + A[i+1] >> 16. И найти частоты этих чисел.
3. Для трех слов можно поступить так же, только в формуле будет учавствовать еще и B[i] = A[i] + A[i+1] >> 16 + A[i+2] >> 32
4. Разновидность 2-го: B[i] = A[i] + A[i+2] >> 16
Re[2]: Частота слов в тексте
От: andy1618 Россия  
Дата: 06.10.09 06:33
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Дык, 2, 3, 4 — это разновидности 1-го.

L>Поскольку слов немного, то каждому слову пожно сопоставить 2-х байтовое число. Поучаем массив 2-х байтовых чисел A.
L>1. Чтобы найти частоты слов, достаточно найти частоты соответствующих 2-х байтовых чисел.
L>2. Чтобы найти частоты пар, достаточно сформировать другой массив 4-х байтовых чисел: B[i] = A[i] + A[i+1] >> 16. И найти частоты этих чисел.
L>3. Для трех слов можно поступить так же, только в формуле будет учавствовать еще и B[i] = A[i] + A[i+1] >> 16 + A[i+2] >> 32
L>4. Разновидность 2-го: B[i] = A[i] + A[i+2] >> 16

Причём, если для пункта 1 можно устроить подсчёт частот через обычный массив, то для остальных пунктов целесообразно будет использовать какой-нибудь список/дерево с хешированием. Например, в C# очень хорошо для этого подойдёт
Dictionary<long, int>
, где первый параметр (ключ) — это число, представляющее пару/тройку слов, а второй параметр (значение) — это счётчик употреблений данной пары/тройки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.