Наиболее часто встречающиеся леммы

Тема в разделе "Lotus - Программирование", создана пользователем NetWood, 23 сен 2010.

  1. NetWood

    NetWood Lotus team
    Lotus team

    Регистрация:
    17 апр 2008
    Сообщения:
    308
    Симпатии:
    0
    Вот такая задачка. В доке есть РТФ поле в которое напихано всякой инфы.

    Задача - распарсить это поле и выудить из него около 10 наиболее часто встречающихся слов.
    Подойдет и собаковое и скриптовое решение.
     
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Первое пришедшее в голову:
    1. Взять Item.Text
    2. Посплитить по пробелу
    3. Пройтись по получившемуся аррею, загнать слова в List as Integer, исползуя слово как tag и увеличивая значение на единичку каждый раз при повторной встрече слова.
    4. Обработать list

    Ограничения: не больше 32 тыщ слов в тексте :)
    Можно не юзать Split, а подумать что-нибудь со стримом, тогда пропадёт ограничение.
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    на хабре алгоритм пробегал
    про mapreduce цикл статей, в разделе алгоритмы
     
  4. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Кмк, лучше на яве. Возможно, даже готовые решения найдутся. На собаках памяти может не хватить, у ЛС массив может кончиться (хотя можно и списки использовать). А так навскидку, бежим по тексту, добавляем слова в словарь, подсчитываем вхождения, берём 10 наиболее частых. Кстати, а что подразумевается под словом? Форум и форумы — это одно слово или разные?.
     
  5. NetWood

    NetWood Lotus team
    Lotus team

    Регистрация:
    17 апр 2008
    Сообщения:
    308
    Симпатии:
    0
    На яве я точно не осилю.

    Подразумеваются слова простые. Без формул и пр. Назначение сей задачи - <meta name="keywords" content="слово1, слово2, слово3...
     
  6. NetWood

    NetWood Lotus team
    Lotus team

    Регистрация:
    17 апр 2008
    Сообщения:
    308
    Симпатии:
    0
    В общем собаковое решение тоже покатило :)
    Вот, накрапал. Памяти действительно не хватает на большом объеме текста.
    Код (Text):
    minkey := 4; rem {минимальное скока раз слово встречается};
    minword := 5; rem {минимальная длина слова};
    znakip := @NewLine:" ":",":":":"!":"-":"_":"<":">":"\"":"?":"(":")":"'":"=":"[":"]":".":"/"; rem {тут основные};
    zamena := "#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#":"#~#";
    temp := @LowerCase(@ReplaceSubstring(@Trim(@Text(Body));znakip;zamena));
    list := @Explode(temp;"#~#");
    listnum:="1":"2":"3":"4":"5":"6":"7":"8":"9":"0";
    narech := "только":"еще":"уже":"очень":"раз":"можно":"после":"сейчас":"тоже":"чтобы"; rem {тут можно добавить еще 1000 значений - Частотный список наречий и предикативов http://dict.ruslang.ru/freq.php?act=show&dic=freq_adv&title=%D7%E0%F1%F2%EE%F2%ED%FB%E9%20%F1%EF%E8%F1%EE%EA%20%ED%E0%F0%E5%F7%E8%E9%20%E8%20%EF%F0%E5%E4%E8%EA%E0%F2%E8%E2%EE%E2};
    keywords:=@Transform(list; "xn";@If((@Length(xn)<minword | @Contains(xn;listnum:narech) );@Nothing;xn)); rem {убить текст меньше 5 и все содерж числа};
    keywords := @Sort(keywords); rem {это не обязательно};
    ukeywords := @Unique(keywords); rem {посечь повторяющиеся, жаль что нет функции !@Unique};
    nu :=1; nk :=0;
    @DoWhile(
    name:=@Subset(@Subset(ukeywords;nu);-1);
    key := @Elements(@Keywords( name; keywords ));
    @If( key => minkey; @Do(tag := tag : (@Text(key)+"#~#"+name); nk := nk+1); @Nothing);
    nu := nu + 1;
    nu <= @Elements(ukeywords)
    );
    tag := @Sort(@Explode(@Implode(tag));[DESCENDING]); REM {убить лишнее пустое вначале tag, сортировать с максимума key, 10 считает < 9};

    kw :=@Implode(@Right(tag;"#~#");", ");
    kw+" | "+@Text(nk)+" из "+@Text(nu)
    A user is a person who uses a computer or Internet service. A user may have a user account that identifies the user by a username (also user name), screen name (also screenname), or "handle", which is derived from the identical Citizen's Band radio term. To log in to an account, a user is typically required to authenticate himself/herself/itself with a password or other credentials for the purposes of accounting, security, logging, and resource management. For a discussion of user satisfaction, see Computer user satisfaction.
    Users are also widely characterized as the class of people that use a system without complete technical expertise required to fully understand the system. In most hacker-related contexts, they are also divided into lusers and power users. Both are terms of degradation, but the latter connotes a "know-it-all" attitude. See also End-user and Nomadic User.
    [edit] Semantics
    A user account allows one to authenticate to system services. It also generally provides one with the opportunity to be authorized to access them. However, authentication does not automatically imply authorization. Once the user has logged on, the operating system will often use an identifier such as an integer to refer to them, rather than their username. On Unix systems this is called the user identifier or user id.
    Computer systems are divided into two groups based on what kind of users they have:
    single-user systems do not have a concept of several user accounts
    multi-user systems have such a concept, and require users to identify themselves before using the system. | всего 112

    <meta name="keywords" content="system, users, systems, computer, account, username, satisfaction, required, identifier, divided, concept, authenticate">
    | 12 из 92 для minkey := 2 и слов не менее 5 знаков
     
  7. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    NetWood
    цикл сильно смущает, я бы от него отказался, да и зачем цикл пробигается по всем когда тебе нужно только 10 первых слов?
     
  8. NetWood

    NetWood Lotus team
    Lotus team

    Регистрация:
    17 апр 2008
    Сообщения:
    308
    Симпатии:
    0
    По циклу - возможно. Но как по другому? Имеется ввиду массив из всех слов в поле, а не из первых 10. Сначала отрезаем все лишнее, потом проверяем частоту слова (key) в массиве.
    Проверял на длинных текстах - памяти не хватает, но и не страшно. В тех доках, что у меня, больших опусов не встречается.
     
  9. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Словоформы не различает (system и systems воспринимает как разные слова) — это нормально?
     
  10. NetWood

    NetWood Lotus team
    Lotus team

    Регистрация:
    17 апр 2008
    Сообщения:
    308
    Симпатии:
    0
    По словоформам - это отдельная песня. Конечно не различает. Там же 15 строкособак. Если допилите - будет здорово, но для поисковика это не сильно будет важно. Главное - в keywords есть слова которые ДЕЙСТВИТЕЛЬНО встречаются в тексте минимум трижды. Тогда роботы это любят...
     
Загрузка...

Поделиться этой страницей