Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 90

Нужно разобрать Python код и написать на C#

17.09.2018, 14:29. Показов 3117. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот пример реализации алгоритма шинглов на питоне : http://www.codeisart.ru/blog/p... algorithm/
Вот два куска с которыми нужна помощь. Первый :
Python
1
2
3
4
5
6
7
8
def genshingle(source):
    import binascii
    shingleLen = 10 #длина шингла
    out = [] 
    for i in range(len(source)-(shingleLen-1)):
        out.append (binascii.crc32(' '.join( [x for x in source[i:i+shingleLen]] ).encode('utf-8')))
 
    return out
Второй :
Python
1
2
3
4
5
6
7
def compaire (source1,source2):
    same = 0
    for i in range(len(source1)):
        if source1[i] in source2:
            same = same + 1
 
    return same*2/float(len(source1) + len(source2))*100
Все остальное уже есть. Заранее спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2018, 14:29
Ответы с готовыми решениями:

Разобрать код на Python 3 словами
Помогите разобрать код на Python 3 словами пожалуйста.Код ниже. a,b=map(int,input().split()) m=range(a,b) def isPrime(n): if n...

Нужно разобрать код
Никак не могу разобраться с кодом помогите пожалуйста $('.portfolio-ctrls-r').click(function(){ var $current =...

Нужно разобрать код
Всем привет, тут возникли некоторые вопросы не могу понять что за что отвечает. Что-то понимаю, что-то нет если можна распишите тут не...

22
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
17.09.2018, 17:04
Вам не проще словами, кратко но четко описать что вы хотите сделать?
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 90
17.09.2018, 17:08  [ТС]
V_Monomax, Конкретно и коротко : сравнение двух текстов с помощью алгоритма шинглов, и вывод на экран процентное соотношение их похожести.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
17.09.2018, 18:15
Лучший ответ Сообщение было отмечено Usaga как решение

Решение

Цитата Сообщение от Batch7992 Посмотреть сообщение
сравнение двух текстов с помощью алгоритма шинглов
C#
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
    /// <summary>
    /// Алгоритм Шинглов — поиск нечетких дубликатов текста
    /// </summary>
    public static class Shingles
    {
        static HashSet<string> stopWords = new HashSet<string> { "это", "как", "так", "и", "в", "над", "к", "до", "не", "на", "но", "за", "то", "с", "ли", "а", "во", "от", "со", "для", "о","же", "ну", "вы", "бы", "что", "кто", "он", "она" };
        
        /// <summary>
        /// Получение сигнатуры текста по шинглам
        /// </summary>
        public static HashSet<int> GetShingleHashes(string text, int shingleLen = 10)
        {
            var res = new HashSet<int>();
 
            var words = GetWordHashes(text).ToArray();
 
            if (words.Length < shingleLen)
            {
                res.Add(XOR(words, 0, words.Length));
            }
            else
            {
                for (int i = 0; i < words.Length - shingleLen + 1; i++)
                    res.Add(XOR(words, i, i + shingleLen));
            }
 
            return res;
        }
 
        /// <summary>
        /// Сравнение сигнатур.
        /// Возващает индекс похожести (0 - совсем не похож, 1 - полностью совпадает)
        /// </summary>
        public static float Compare(HashSet<int> signature1, HashSet<int> signature2)
        {
            //критерий Джаккардa (Jaccard Index)
            var same = 0;
            foreach(var hash in signature1)
                if (signature2.Contains(hash))
                    same++;
 
            return 1f * same / (signature1.Count + signature2.Count - same);
        }
 
        static IEnumerable<int> GetWordHashes(string text)
        {
            return Regex.Matches(text, @"\w+").OfType<Match>()
                .Select(m=>m.Value.ToLower())
                .Where(s=>!stopWords.Contains(s))
                .Select(s=>s.GetHashCode());
        }
 
        static int XOR(IList<int> vals, int from, int to)
        {
            var res = 0;
            to = Math.Min(vals.Count, to);
            for (int i = from; i < to; i++)
                res ^= vals[i];
 
            return res;
        }
    }
Вложения
Тип файла: zip ConsoleApplication232.zip (42.2 Кб, 18 просмотров)
2
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
17.09.2018, 19:16
Вроде по статье. Тоже не стал подключать библиотеку crc32, обошелся штатным хэш-кодом
C#
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
/// <summary>
/// http://www.codeisart.ru/blog/python-shingles-algorithm/
/// Алгоритм Шинглов — поиск нечетких дубликатов текста
/// </summary>
namespace Question2322101
{
    class Program
    {
        static void Main(string[] args)
        {
            var text1 = File.ReadAllText(@"C:\temp\input1.txt").ToLower(); // Текст 1 для сравнения
            var text2 = File.ReadAllText(@"C:\temp\input2.txt").ToLower(); // Текст 2 для сравнения
 
            var cmp1 = GenShingleHashcode(Canonize(text1));
            var cmp2 = GenShingleHashcode(Canonize(text2));
 
            Console.WriteLine(Compaire(cmp1,cmp2));
            //foreach (var item in result) // Проверка настоящих шинглов
            //{
            //    Console.WriteLine(item);
            //}
            Console.ReadKey();
        }
 
        static IEnumerable<string> Canonize(string source)
        {
            var stop_words = new List<string> {
                "это", "как", "так",
                "и", "в", "над",
                "к", "до", "не",
                "на", "но", "за",
                "то", "с", "ли",
                "а", "во", "от",
                "со", "для", "о",
                "же", "ну", "вы",
                "бы", "что", "кто",
                "он", "она"
            };
 
            var regex = new Regex(@"\p{IsCyrillic}+(-p{IsCyrillic}+)*");
            return regex.Matches(source).OfType<Match>()
                .Select(e => e.Value)
                .Where(e => !stop_words.Contains(e));
        }
 
        static List<int> GenShingleHashcode(IEnumerable<string> source)
        {
            int shingleLen = 10; // длина шингла
            var outList = new List<int>(shingleLen);
            var length = source.Count() - (shingleLen - 1);
 
            for (int i = 0; i < length; i++)
            {
                outList.Add(source.Skip(i).Take(shingleLen).Aggregate((a, b) => a + " " + b).GetHashCode());
            }
            return outList;
        }
 
        static double Compaire<T>(IList<T> source1, IList<T> source2)
        {
            double same = 0;
            for (int i = 0; i < source1.Count; i++)
            {
                if (source2.Contains(source1[i]))
                    ++same;
            }
            return same * 200 / (source1.Count + source2.Count);
        }
 
        // Тестирование. Вытаскивает настоящие шинглы
        static List<string> GenShingle(IEnumerable<string> source)
        {
            int shingleLen = 10; // длина шингла
            var outList = new List<string>(shingleLen);
            var length = source.Count() - (shingleLen - 1);
 
            for (int i = 0; i < length; i++)
            {
                outList.Add(source.Skip(i).Take(shingleLen).Aggregate((a, b) => a + " " + b));
            }
            return outList;
        }
    }
}
1
17.09.2018, 19:33

Не по теме:

Цитата Сообщение от amr-now Посмотреть сообщение
Вроде по статье
Хотите покритикую? :)
Неэффективно по памяти и по производительности. Есть ошибки (если длина текста меньше длины шингла). Формула в Compaire - взята с потолка. Не оформлено как класс. Длина шингла не настраивается через параметры.
И да, то что код совпадает с питоновским не значит что на питоне оно было написано правильно и хорошо.

0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 90
18.09.2018, 10:33  [ТС]
Storm23, Спасибо! А можно сделать именно в процентном соотношении? Не в десятичном?

Добавлено через 36 минут
amr-now, Ваш у меня не работает. Там вообще что-то странное. Оно мне выдает в консоли "не число"
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
18.09.2018, 10:56
Batch7992, покажите пример данных, на которых программа выдает ошибку.
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 90
18.09.2018, 11:00  [ТС]
amr-now, самый обычный текст из случайного генератора в инете в текстовом файле. Во втором файле этот же самый текст, только отредактированный.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
18.09.2018, 11:03
Batch7992, кодировка UTF-8 ? Прошу пример данных.

Storm23 правильно заметил - шингл на 10 слов. Если текст короче, то программу надо доделывать.
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 90
18.09.2018, 11:10  [ТС]
amr-now, Да, UTF-8
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
18.09.2018, 11:19
Первый текст:
Хотите покритикую?
Неэффективно по памяти и по производительности. Есть ошибки (если длина текста меньше длины шингла). Формула в Compaire - взята с потолка. Не оформлено как класс. Длина шингла не настраивается через параметры.
И да, то что код совпадает с питоновским не значит что на питоне оно было написано правильно и хорошо.
Второй текст:
Хотите покритикую?
Неэффективно с потолка. Не как класс. шингла не настраивается через параметры.
И да, то что код с не значит что на оно было написано правильно и хорошо.
Если делать множественные мелкие правки в разных частях текста, то согласно алгоритму шинглов - коэффициент быстро превращается в ноль.

Берутся же цепочки по 10 слов. А если их через каждое слово менять, то цепочки из 10 слов не будут никогда совпадать.
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 90
18.09.2018, 11:28  [ТС]
amr-now, Оно мне при любом тексте отображает "не число"
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
18.09.2018, 11:30
Batch7992, короче. Классический тупик. Программу не получится исправить. Мы не способны договориться.
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 90
18.09.2018, 13:07  [ТС]
amr-now, Все, спасибо, вопросов нет. Я уже фиксанул. У меня последний вопрос(если захотите отвечать) - можно ли изменить кодировку отдельного символа в слове? Например у нас есть стринговая "o", и мне нужно изменить ее на "o" в кодировке ASCII?
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
18.09.2018, 13:28
Цитата Сообщение от Batch7992 Посмотреть сообщение
Я уже фиксанул.
У Вас был измененный вариант программы? В чём причина то ошибки была?
Цитата Сообщение от Batch7992 Посмотреть сообщение
Например у нас есть стринговая "o", и мне нужно изменить ее на "o" в кодировке ASCII?
Непосредственно в программе string всегда хранит символы в кодировке UNICODE.

Можно извращаться с кодировками символов, хранящихся в программе, если хранить в виде обычных чисел. Например в int[]. Но формально в массиве здесь хранится число, а не символ.
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 90
18.09.2018, 13:47  [ТС]
amr-now,
Цитата Сообщение от amr-now Посмотреть сообщение
У Вас был измененный вариант программы? В чём причина то ошибки была?
Я, до начала всех операций, просто чтобы убедиться что текст считывается, вывел его в консоль. Там вместо него была какая-то жесть, типо : ??????? ???? ????????????? ?????
Это помогло :
C#
1
Console.OutputEncoding = Encoding.GetEncoding(1251);
Цитата Сообщение от amr-now Посмотреть сообщение
Непосредственно в программе string всегда хранит символы в кодировке UNICODE.
Можно извращаться с кодировками символов, хранящихся в программе, если хранить в виде обычных чисел. Например в int[]. Но формально в массиве здесь хранится число, а не символ.
Мне нужно изменить хэш слова, и при этом слово внешне не должно меняться. Я думал если заменить, допустим, в слове "небо" букву "о" в английской кодировке(ASCII), то изменится хэш.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
18.09.2018, 16:28
Batch7992, можно просто менять английскую букву о на русскую. У них разные коды в любой кодировке, а выглядят одинаково.
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 90
18.09.2018, 17:34  [ТС]
amr-now, В этом то вся проблема, менял - размер не поменялся.
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 90
19.09.2018, 11:28  [ТС]
amr-now, И еще такой вопрос, как переписать вашу формулу, чтобы показывался не процент схожести, а процент уникальности первого текста?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.09.2018, 11:28
Помогаю со студенческими работами здесь

Нужно разобрать код?
С JavaScript (знаю Java)не знаком вообще но худо бедно продвигаюсь и застопорился вот где: var _0x6d39x14=Math]*2*0.120; Зачем...

Нужно разобрать код
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; using namespace std; int main(){ int n; cin&gt;&gt;n; vector...

нужно код разобрать
помогите ламеру вот этот код разобрать ..... for($j=1;$j&lt;=sizeof($this-&gt;fields);$j++) { echo &quot;&lt;tr&gt;&lt;td align...

Нужно разобрать не большой код
Всем добрый день. Никак не могу разобрать не большой код в php, код footer.php. Большое спасибо. Что он вообще делает?? &lt;?php ...

Есть, код, половину написал сам, но до рабочего состояния довёл знакомый. Нужно разобрать часть кода.
Есть, код, половину написал сам, но до рабочего состояния довёл знакомый. Нужно разобрать часть кода. .model small .data _str db...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru