Форум программистов, компьютерный форум, киберфорум
F# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 169

Определение автора по тексту

16.04.2019, 16:52. Показов 2563. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, подскажите пожалуйста, есть задача:
- необходимо загружать текст в программу (например книгу) и указывать ее автора
- затем когда небольшой запас был сформирован необходимо по стилю написания книги выявить ее автора (не просто выполнить функцию Contains, а по какому-то алгоритму определить наиболее вероятного автора)
- нужно реализовать именно на F#, но флп язык сильно непонятен после ооп на C#
- единственное, что придумал это отсортировать текст по словам, вычислить кол-во повторений этих слов и сопоставить в процентном соотношении от общего текста, но даже сгруппировать на F# не получается чтобы получить вид List<{Word: string; Count: int;}>

Подскажите куда двигаться, есть ли в интернете нечто похожее с реализацией ? Спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.04.2019, 16:52
Ответы с готовыми решениями:

Определение стоимости телеграммы по её тексту
составить программу для определения стоймости телеграммы по её тексту(запросить стоймость одного слова в телеграмме и комиссионный сбор за...

Ввести массив записей, который содержит Автора и название книги. Вывести на экран те записи, которые имеют одного автора.
1. Процедуры и функции: Найти значение переменной А по формуле: где С и В -одномерные массивы. Вот састряпал процедуру на...

Заданий рядок тексту. Визначити, скільки разів зустрічається цей рядок тексту в текстовому файлі
1. Створити або відкрити текстовий (типізований, нетипізований) файл. 2. Виконати над текстовим (типізованим, нетипізованим) файлом...

14
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
16.04.2019, 18:32
skew, привет!
Цитата Сообщение от skew Посмотреть сообщение
необходимо по стилю написания книги выявить ее автора
Может нейросеть использовать?
Цитата Сообщение от skew Посмотреть сообщение
сгруппировать на F# не получается чтобы получить вид List<{Word: string; Count: int;}>
Посмотри следующую конструкцию. Она даёт контейнер пар сколько раз то или иное слово включено в массив arr : string[].
F#
1
Array.countBy (fun world -> world) arr
Вот и сортировка по частоте вхождений слов.
F#
1
|>Array.sortByDescending (fun pair -> snd pair)
Делай конвейером.

Добавлено через 6 минут
Вот. У меня в хранилище по F# код такой есть, можешь от него отталкиваться. Он подсчитывает количество вхождений того или иного слова в указанном текстовом файле.
Кликните здесь для просмотра всего текста

F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
open System
open System.IO
 
[<EntryPoint>]
let main unit = 
    let symbols_split = " .,?!/*-+^:\"\\@#№$;%&()[]{}"
    let left_separator = symbols_split.[0].ToString()
    let split symbols_split (line : string) =
        symbols_split
        |>Seq.toArray
        |>line.Split
    
    let rec counting unit =
        try
            let res unit =
                printfn "Введите путь к файлу"
                Console.ReadLine()
                |>File.ReadLines
                |>Seq.filter             (fun lines -> lines |> String.IsNullOrWhiteSpace |> not)
                |>Seq.fold               (fun str_dump x -> str_dump + left_separator + x) left_separator
                |>split symbols_split
                |>Array.filter           (fun str -> str = "" |> not)
                |>Array.map              (fun str -> str.ToLower())
                |>Array.countBy          (fun str -> str)
                |>Array.sortByDescending (fun pair -> snd pair)
                |>Array.map              (fun pair -> printfn "%s -> %i" (fst pair) (snd pair); sprintf "%s -> %i" (fst pair) (snd pair))
            File.WriteAllLines("output.txt", res unit)
            0
        with
        | _ as ex ->
            printfn "Необработанная ситуация: %s Попробуйте операцию ещё раз" ex.Message;
            counting unit
 
    counting unit
1
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 169
16.04.2019, 18:58  [ТС]
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Может нейросеть использовать?
А не F# сильно сложно их реализовывать ?

Цитата Сообщение от SomniPhobia Посмотреть сообщение
Вот. У меня в хранилище по F# код такой есть, можешь от него отталкиваться
Окей, сейчас попробую разобраться
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
16.04.2019, 21:40
Цитата Сообщение от skew Посмотреть сообщение
А не F# сильно сложно их реализовывать ?
Не знаю. Не пробовал. Я F# недавно начал изучать, около недели.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
17.04.2019, 21:35
Цитата Сообщение от skew Посмотреть сообщение
А не F# сильно сложно их реализовывать ?
можно взять любую c# библиотеку и использовать ее в f#
0
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 169
24.04.2019, 16:06  [ТС]
Подскажите, а как можно в лямбда выражении сохранить промежуточное значение, мне вот нужно посчитать общее кол-во слов чтобы потом высчитать процент их использования от всего текста

F#
1
2
3
4
5
6
7
8
9
10
11
|>File.ReadLines
|>Seq.filter             (fun lines -> lines |> String.IsNullOrWhiteSpace |> not)
|>Seq.fold               (fun str_dump x -> str_dump + left_separator + x) left_separator
|>split symbols_split
|>Array.filter           (fun str -> str = "" |> not)
|>Array.map              (fun str -> str.ToLower())
|>Array.countBy          (fun str -> str)   
|>Array.sortByDescending (fun pair -> snd pair)
|>Array.sumBy            (fun pair -> snd pair) ///// вот тут как-то хочу получить кол-во записей чтобы потом в следующей строке занести в PercentUses
|>Array.map              (fun pair -> {Text = fst pair; Count = snd pair; PercentUses = 0.0})    
|>SaveBook author
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
26.04.2019, 20:26
примерно так
F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let foo src = 
    let xs = 
        src
        |> File.ReadLines
        |> Seq.filter             (String.IsNullOrWhiteSpace >> not)
        |> String.concat          left_separator
        |> split symbols_split
        |> Array.map              (fun str -> str.ToLower())
        |> Array.countBy          id
        |> Array.sortByDescending snd
    let total = 
        xs
        |> Array.sumBy snd 
    [| for a , b in xs -> { Text = a; Count = b; PercentUses = float b / float total } |]
    |> SaveBook author
1
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 169
29.04.2019, 15:46  [ТС]
Подскажите еще пожалуйста. А как получаемый результат лучше сравнить с уже имеющимися книгами, то есть я считал данные из папки
F#
1
2
3
4
5
let ReadBooks =
    Directory.GetFiles("books")
    File.ReadAllText
    JsonConvert.DeserializeObject
    Array.map (fun data -> data:Book);;
Теперь их как-то в процентном соотношении нужно сравнить с текстом, который ввожу, чтобы понять насколько он схож с одной из сохраненных книг
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
29.04.2019, 18:19
Цитата Сообщение от skew Посмотреть сообщение
Теперь их как-то в процентном соотношении нужно сравнить с текстом, который ввожу, чтобы понять насколько он схож с одной из сохраненных книг
для этого должны быть какие-то специальные алгоритмы оценки. к f# они прямого отношения не имеют - я их не знаю. если найдете - попробую помочь
0
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 169
08.05.2019, 15:41  [ТС]
pycture, не нашел я на просторах интернета простых решений по данному вопросу и решил самостоятельно продумать простой алгоритм, пришел к такому решению:

1) Берем текст, который необходимо отсканировать и получить его автора
2) Передаем его на обработку и получаем экземпляр Book (как указано выше)
3) Считываем все имеющиеся книги
4) Бежим по всем словам в книге, автора которой нужно найти
5) Каждое слово проверяем на наличие в других книгах
6) Если такое слово находим, то берем модуль двух чисел PercentUses и находим наименьшее из них, тем самым определяя наибольшую схожесть в кол-ве использований
7) После того как нашли найденной книге добавляем очко какого-нибудь WinRate и так пробегаем по всем словами
8) После того как все слова обработаны берем книгу с наибольшим рейтингом и выдаем ее автора


На C# я сделал бы примерно так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void GetAuthor()
        {
            Dictionary<Book, int> Rate = new Dictionary<Book, int>(); //Храним книги и ее рейтинг совпадений
            Rate = ReadAllBooksFromFiles(); //Изначально у всех книг числовое значение равно 0
            Book findingBook = JsonConver.Deserialize(GetArrayWordFromBook(Console.ReadLine())); // Конвертируем текст в книгу, как описывал выше в теме
            foreach (var word in Book.Words) //пробегаем по всем словам в книге
            {
                if(!Rate.Keys.Any(b => b.Text == word.Text)) //Если слово не найдено ни в одной из книги пропускаем его
                    continue;
                var betterResult = Rate.Keys.Min(b => Math.Abs(word.PercentUses - b.PercentUses)); //Находим минимальныую разницу в процентном соотношении
                Rate[betterResult]++; //инкрементируем на 1
            }
 
            var result = Rate.Min(rate => rate.Value); //Находим у кого из книг больше всего баллов
        }
0
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 169
13.05.2019, 13:58  [ТС]
Никто не знает как такое на сложном F# сделать? ))
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
13.05.2019, 14:26
Цитата Сообщение от skew Посмотреть сообщение
Никто не знает
Я думаю среди всех людей (на Земле и в космосе вообще) есть люди, кто знает, как это решить.
На форуме - вероятность меньше найти таких людей, так как форум - подмножество землян.
Может дело не в том, что не знают, а не хотят или ленятся показывать.

Цитата Сообщение от skew Посмотреть сообщение
на сложном F#
Он не сложный, на мой взгляд.
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
04.06.2019, 07:42
Цитата Сообщение от skew Посмотреть сообщение
не нашел я на просторах интернета простых решений по данному вопросу и решил самостоятельно продумать простой алгоритм, пришел к такому решению:
Реализовать подобное вполне себе можно, хотя, если книг много, то загрузка их всех в память может привести к неприятным неожиданностям. Но проблема тут даже не в этом. Можно сказать вполне определенно, что более менее точный анализ в этом направлении потребует использования систем искусственного интеллекта. Например может анализироваться частота использования автором причастных и деепричастных оборотов. Вполне понятно, что простыми операциями такого не подсчитать. Кроме того, даже простой подсчет слов в русском языке мало что даст в силу высокой флективности языка, поскольку одно и то же слово, употребленное в разных формах, будет распознано как разные слова.
Другим неприятным моментом является специфичность некоторых слов. Возьмем, к примеру, слово "шпрехшталмейстер". Слово в принципе употребляется крайне редко, у меня в браузере оно даже подчеркнуто спеллчекером, и большинство авторов его не употребляют вообще. Но если какой-то автор пишет о цирке, то есть ненулевая вероятность, что он упомянет это слово хотя бы несколько раз. Характеризует ли это его авторский стиль? Я думаю вряд ли и в произведениях на другую тему, он это слово не вспомнит, а вот другой автор, взявшись за ту же тему... ну ты понял.

Здесь из простых решений я вижу следующие. Во-первых, следует провести анализ служебных частей речи(предлоги, союзы и т. д.). Они используются всеми, повсеместно и независимо от тематики, и известно, что их употребление достаточно индивидуально, то есть даже простой подсчет количества предлогов на тысячу слов уже даст хорошие результаты. Мало того, известно даже, что когда авторы намеренно пытаются менять стиль, чтобы выдать себя за кого-то другого, по этому показателю они остаются верны себе, если, конечно, не учитывают этот фактор целенаправленно. Другое преимущество служебных частей речи в том, что они не меняют форму.

Другой подход - это учет слов, которые действительно используются нечасто и не всеми: анахронизмы, неологизмы, жаргонизмы, профессиональные термины, а также словечки типа кой, сей, нежели, отнюдь и т. д. Ну тут придется поработать и составить словарь таких слов, а также учесть, что они, в отличие от предлогов форму меняют.
0
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
04.06.2019, 23:22
Цитата Сообщение от skew Посмотреть сообщение
Определение автора по тексту
Во фрилансе дали интересную ссылку
http://www.rusf.ru/books/analy... 0win.htm#5
1
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
05.06.2019, 07:56
Цитата Сообщение от RunningMan Посмотреть сообщение
http://www.rusf.ru/books/analysis/vestnik2000win.htm#5
Да, интересная ссылка. Погуглил еще "авторский инвариант", оказывается есть статья в википедии
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.06.2019, 07:56
Помогаю со студенческими работами здесь

Вспомнить автора
Помогите вспомнить автора! Несколько лет назад прочитал рассказ, ни названия ни автора не помню. Коротко: есть планета на которой любая...

Страница Автора
Выводится список пользователей определенной роли, при клике на имя пользователя должно переходить по адресу: название сайта/author/имя...

Стиль автора
Доброго времени суток дорогие друзья, очень вас прошу о помощи. Известно, что одной из характеристик стиля автора является длина...

Дописать к тексту
Сори если ошибся разделом. В js вообще не разбираюсь, нужно сделать следующее: если в div больше чем 5 символов, то брало два первых...

Условия IF по тексту
Всем доброго дня. Подскажите как правильно написать условие в макросе. Есть две ячейки в одной cells(1,1) - значение ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru