Страницы

Поиск по вопросам

Показаны сообщения с ярлыком текст. Показать все сообщения
Показаны сообщения с ярлыком текст. Показать все сообщения

четверг, 9 апреля 2020 г.

Как осуществить поиск похожего текста в MySQL?

#mysql #база_данных #текст #выборка

                    
Дано: таблица с полями id и txt, где txt - небольшая статья, пост или комментарий,
содержащий HTML, примерный объем записи - 2-10 кб, всего записей 100к-1млн.

Нужно извлечь группы записей, в которых текст приблизительно похож, т.е. совпадать
процентов на 80-90, т.к. идентично равных строк в БД нет.

Позволяют ли существующие механизмы БД осуществить такую выборку, и как это сделать?

UPD: (очень близко) есть ли аналог пхп-шного similar_text() в mysql? Скорость выполнения
запроса не имеет значение.
    


Ответы

Ответ 1



Как было сказано выше, можно попробовать расстояние Левенштейна. Еще один пример реализации для mysql тут: http://www.artfulsoftware.com/infotree/qrytip.php?id=552 Можно сделать адаптированный вариант с этого примера: CREATE FUNCTION levenshtein( s1 text, s2 text ) RETURNS INT DETERMINISTIC BEGIN DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT; DECLARE s1_char CHAR; -- max strlen=255 DECLARE cv0, cv1 VARBINARY(10240); SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0; IF s1 = s2 THEN RETURN 0; ELSEIF s1_len = 0 THEN RETURN s2_len; ELSEIF s2_len = 0 THEN RETURN s1_len; ELSE WHILE j <= s2_len DO SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1; END WHILE; WHILE i <= s1_len DO SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1; WHILE j <= s2_len DO SET c = c + 1; IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF; SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost; IF c > c_temp THEN SET c = c_temp; END IF; SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1; IF c > c_temp THEN SET c = c_temp; END IF; SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1; END WHILE; SET cv1 = cv0, i = i + 1; END WHILE; END IF; RETURN c; END; CREATE FUNCTION levenshtein_ratio( s1 text, s2 text ) RETURNS INT DETERMINISTIC BEGIN DECLARE s1_len, s2_len, max_len INT; SET s1_len = LENGTH(s1), s2_len = LENGTH(s2); IF s1_len > s2_len THEN SET max_len = s1_len; ELSE SET max_len = s2_len; END IF; RETURN ROUND((1 - LEVENSHTEIN(s1, s2) / max_len) * 100); END; Выбрать попарно похожие строки так: select t1.id, t1.txt, t2.id, t2.txt from table1 t1 join table2 t2 on t2.id <> t1.id and levenshtein_ratio(t1.txt, t2.txt) > 80 Как разбить результат выборки на группы, придется подумать. По работе, если кратко, то алгоритм считает количество замен/добавлений символов в текст, чтобы получить полностью схожие записи. Но главная проблема - алгоритм осуществляет посимволный перебор, что является довольно затратным. А теперь если учесть, что длина текста 2-10 кб и до 1 млн. записей, то база будет просто умирать от такой "аналитики" (а не забывайте, что главная задача базы - осуществлять хранение и доступ к данным, но никак не реализовывать сложные вычислительные алгоритмы). Поэтому я бы рекомендовал, пока не поздно, подумать над тем, чтобы вынести реализацию за пределы базы. Можно найти множество "быстрых" реализации вычисления расстояния Левенштейна практически на всех языках. При реализации предложил бы делать какую-то предварительную фильтрацию, например по длине текста, т.е. если длина не совпадает на 80%, то сравнение даже не проводить, т.к. даже на производительных машинах сравнение таких объемов текста уже будет заниматься ощутимое время.

Ответ 2



Вы можете решить данную задачу с помощью использования хранимых процедур. Например так: CREATE PROCEDURE dbo.spSimil_FirstNameLastName @str1 nvarchar(max), @threshold float AS SET NOCOUNT ON SELECT * FROM (SELECT dbo.fnSimil(@str1, Person.Person.FirstName + N' ' + Person.Person.LastName) AS Simil, * FROM Person.Person) AS T WHERE T.Simil >= @threshold ORDER BY T.Simil DESC; Процедура вызывается следующим образом: EXEC dbo.spSimil_FirstNameLastName N'John Adams', 0.75 Подробнее можно узнать тут: http://www.accessmvp.com/tomvanstiphout/simil.htm Для решения вашей задачи можно попробовать прибегнуть к расстояние Левенштейна: ссылка на реализацию для mysql: https://github.com/ifsnop/damlev

воскресенье, 15 марта 2020 г.

Как прочитать очень большой текстовый файл?

#c_sharp #файлы #текст


Имеется текстовый файл содержащий всего одну строку, но размер файла 1 Гб. Каким
образом прочитать файл целиком? File.ReadAllLines, File.ReadLines, File.ReadAllText
завершаются с ошибкой о недостаточности памяти. На выходе нужно получить строку (объект
типа string) с содержимым из файла. Файл одно строчный, но строка очень длинная.
    


Ответы

Ответ 1



Нашел подробное описание причин этой ошибки вот здесь: ссылка. Всем спасибо за помощь, в данный момент использую такой код: char[] buffer = new char[104857600]; string text = ""; FileStream fstream = new FileStream("document.txt", FileMode.Open, FileAccess.Read); using (var sr = new StreamReader(fstream)) { int bytesRead = 0; while ((bytesRead = sr.Read(buffer, 0, buffer.Length)) > 0) { text = new string(buffer); // обработка текста } }

Ответ 2



Соберите приложение под AnyCPU и снимите в свойствах проекта чекбокс "Prefer 32 Bit". Пропишите в конфиге приложения Это снимет большую часть ограничений по памяти, и вашу строку можно будет спокойно прочитать целиком.

Ответ 3



Используй значит MemoryMappedFile.

понедельник, 9 марта 2020 г.

Python. Вывод текста по середине терминала

#python #python_3x #текст #форматирование #терминал


Как можно вывести текст в центре экрана терминала, используя shutil.get_terminal_size().columns
и shutil.get_terminal_size().lines?


    


Ответы

Ответ 1



Если текст уже разбит на строки, то достаточно просто отформатировать: >>> import shutil >>> lines = ['String right here', 'And here', 'Here', 'A-a-a-and here'] >>> width = shutil.get_terminal_size().columns >>> position = (width - max(map(len, lines))) // 2 >>> for line in lines: # left justtified ... print(' '*position + line) ... String right here And here Here A-a-a-and here >>> for line in lines: # right justified ... print(line.rjust(width // 2)) ... String right here And here Here A-a-a-and here >>> for line in lines: # center ... print(line.center(width)) ... String right here And here Here A-a-a-and here

Ответ 2



Если хочется в произвольном месте экрана в терминале печатать, то можно blessings модуль использовать: #!/usr/bin/env python from blessings import Terminal # $ pip install blessings lines = ['String right here', 'And here', 'Here', 'A-a-a-and here'] term = Terminal() with term.hidden_cursor(), term.fullscreen(): for i, line in enumerate(lines): x = (term.width - max(map(len, lines))) // 2 y = (term.height - len(lines)) // 2 + i with term.location(x, y): print(term.bold_white_on_black(line)) with term.location(0, term.height - 1): input('press to exit..') Терминал выглядит так: String right here And here Here A-a-a-and here press to exit.. В этом случае, содержимое терминала на время исполнения программы очищается—при выходе из программы терминал восстанавливается. Совместно с colorama модулем, некоторые возможности могут работать также и на Windows. Для забавы можно asciimatics модуль попробовать: #!/usr/bin/env python from asciimatics.effects import Print # $ pip install asciimatics from asciimatics.renderers import FigletText, SpeechBubble, Rainbow from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError def demo(screen): lines = ['String right here', 'And here', 'Here', 'A-a-a-and here'] renderers = [Rainbow(screen, FigletText(line, font='small')) for line in lines] x = (screen.width - max(r.max_width for r in renderers)) // 2 H = max(r.max_height for r in renderers) - 1 # text height effects = [Print(screen, renderer, y=(screen.height - H * len(renderers)) // 2 + i * H, x=x) for i, renderer in enumerate(renderers)] effects.append(Print(screen, SpeechBubble("Press X to exit"), screen.height - 5, speed=1, transparent=False, start_frame=100)) screen.play([Scene(effects, -1)], stop_on_resize=True) if __name__ == "__main__": while True: try: Screen.wrapper(demo) except ResizeScreenError: continue else: break На другие доступные эффекты можно в samples папке посмотреть.

понедельник, 2 марта 2020 г.

Как наложить текст на картинку в html?

#html #текст #img






   
    	Наука.ру - главная
    
    
        
        
    	

Космоинфо

Погрузись в космос вместе с нами!

Новости    Вопросы
  Основная

надо, чтобы и отображались прямо на картинке, а не под ней.


Ответы

Ответ 1



Наука.ру - главная

Космоинфо

Погрузись в космос вместе с нами!

Новости    Вопросы
  Основная



Ответ 2



Попробуй задать как фоновое изображение через CSS/SASS. В .sass: .image{ background: url('image/image1.png'); width: 320px; height: 280px; //размер условный } В HTML-документе:

Текст Текст Текст



Ответ 3



Вариант 1, с использованием position: absolute .container { position: relative; } .container img { position: absolute; } .container p{ color: #fff; position: relative; }

Lorem ipsum dolor sit, amet consectetur adipisicing elit. Itaque, nulla?

Вариант 2, с использованием background-image (нужно знать размеры блока) .bg { background: url('https://d626yq9e83zk1.cloudfront.net/files/2017/12/26-770x425.jpg') center center no-repeat; width: 300px; height: 300px; } .bg span { color: #fff; }
Lorem ipsum dolor sit amet consectetur adipisicing elit. Assumenda, rerum.


среда, 26 февраля 2020 г.

Как лучше задавать число пробелов в табе - в виде значения переменной или в виде именованной константы?

#c #текст #форматирование #задачи


Книга Язык программирования Си. Денис Ритчи упражнение 1.20:


  Напишите программу detab, заменяющую символы табуляции во вводимом
  тексте нужным числом пробелов (до следующего "стопа" табуляции).
  Предполагается, что "стопы" табуляции расставлены на фиксированном
  расстоянии друг от друга, скажем, через n позиций. Как лучше задавать
  n - в виде значения переменной или в виде именованной константы?


Вопрос: Правильно ли я понял задание?

В Википедии сказано, что табуляция это 8 знакомест. Как бы табуляция это константное
число знакомест. Или я чего-то не понимаю?

Я задание понял так: если введена табуляция, заменить ее на 8 пробелов. И мне не
понятно, зачем в задании указывать на каком расстоянии друг от друга стопы табуляции?

И что такое "стопы" табуляции? Стоп и символ табуляции это одно и то же?

Я смотрел другие решения в интернете, у других людей, почему-то, количество пробелов
заменяемых на табуляцию, в разных вводимых строках - разное...
    


Ответы

Ответ 1



Нет, вы неверно понимаете, что такое табуляция. Но проще пояснить на примере. Вот, например, имеем: Это текст с пробелами И еще один текст Все они выровнены Вы предлагаете: Это текст с пробелами И еще один текст Все они выровнены Правильно: 0 0 1 2 0 8 6 4 Это текст с пробелами И еще один текст Все они выровнены Так понятно? Табулятор вносит столько пробелов, чтоб новое слово шло с очередной позиции табуляции, в данном случае - кратной 8 (что не обязательно, и вряд ли в Википедии сказано, что это строго 8. Скорее что-то вроде "распространенное значение - 8").

воскресенье, 9 февраля 2020 г.

Как в tkinter регулировать размер, цвет, и шрифт текста?

#python #tkinter #текст


Как в tkinter регулировать размер, цвет, и шрифт текста?
    


Ответы

Ответ 1



tkinter.Text(root, font="Courier 20", bg="Black", fg=color) Так можно регулировать и бэкграунд, и шрифт, и цвет текста.

Ответ 2



При помощи font вы регулируете размер и стиль шрифта, а при помощи fg вы регулируете цвет шрифта. Подробнее можете посмотреть вот тут import tkinter root = tkinter.Tk() label = tkinter.Label(root, text='Hello word', font='Times 30', fg='#0F0').grid() root.mainloop()

суббота, 8 февраля 2020 г.

Как отредактировать повторяюшийся код в каждом из фаилов

#phpstorm #текст


Проблема в том что мне досталось поддерживать один сайт который отвратительно написан.
Есть порядка 40-50 фаилов где повторяется одну и тоже меню. Надо убрать пару пунктов
и изменить ссылки. Что подскажите? Нет ли специальных утилит в каком -нибудь PhpStorm?
Или же каких то сторонних     


Ответы

Ответ 1



Ctrl + Shift + R — Замена По заданному пути, хоть по всему проекту.

Ответ 2



Ну или найти и заменить. Хоть в файле, хоть по всему проекту)) Ctrl + H, Ctrl + F иногда встречается

среда, 5 февраля 2020 г.

Как выбрать текст из файла между двумя известными строками?

#python #строки #текст


Есть текстовый файл, необходимо выбрать из него некоторое кол-во строк, текст всегда
разный, но всегда есть заранее известных две строки, но текст до них, между ними и
после нет. Ну как пример:

Я вас любил: любовь еще, быть может,
В душе моей угасла не совсем;
Но пусть она вас больше не тревожит;
Я не хочу печалить вас ничем.
Я вас любил безмолвно, безнадежно,
То робостью, то ревностью томим;
Я вас любил так искренно, так нежно,
Как дай вам бог любимой быть другим. :)


и из этого допустим нам известны строки: "Но пусть она вас больше не тревожит;" и
"То робостью, то ревностью томим;".
Необходимо забрать их и то что между ними, остальное нам ненужно.
    


Ответы

Ответ 1



Если известные строки даны в start, end переменных, то чтобы получить срез состоящий из этих строк и всё что между ними: result = text[text.index(start):text.index(end)+len(end)] Предполагая, что end встречается в text только после start. К примеру: >>> text = '..abc..' >>> start = 'a' >>> end = 'c' >>> text[text.index(start):text.index(end)+len(end)] 'abc' Можно регулярные выражения использовать: >>> import re >>> re.search('{}.*?{}'.format(*map(re.escape, [start, end])), text, re.M).group() 'abc' Чтобы не загружать весь файл в память, можно использовать mmap и байты. См. Поиск паттерна (последовательность байт) в файле (несколько Гб) в Питоне 2 Python multi-line pattern matching

Ответ 2



# если имеются виду строки разделенные '\n', можно не читать файл целиком def get_inside_lines(file: iter, start_line: str, end_line: str) -> iter: for line in file: if line == start_line: yield line for line in file: yield line if line == end_line: return r = ''.join(get_inside_lines(open('111.txt', encoding='utf-8'), 'Но пусть она вас больше не тревожит;\n', 'То робостью, то ревностью томим;\n'))

Какое сочетание цветов более удобно?

#html #текст #веб_дизайн






   
    	Космоинфо
    
    
        
        
    	

Космоинфо

Погрузись в космос вместе с нами!

Новости   Вопросы   Основная   Статьи   Астрофото   Видео

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


Ответы

Ответ 1



Более удобно подбирать палитру для сайта с помощью бесплатных сервисов: http://www.rehabcenter.marketing/tintui/index.html https://coolors.co/browser/latest/1 adobe http://colorhunt.co/

Ответ 2



Вопрос не очень то и ясен... но во всяком случае может быть вам стоит почитать эту и эту статью..

вторник, 28 января 2020 г.

Определение пола

#текст


Хочу как в ВК сделать автоматическое определение пола, но не могу понять как это
реализовать. Допустим, если ставить женский пол по окончанию имени(а и я), но есть
ведь имена: Любовь и другие + есть и мужские имена: Никита, Илья. Подскажите, пожалуйста,
что использовать для реализации идеи? 
    


Ответы

Ответ 1



Проще спросить. Не зря же все сайты спрашивают пол, вместо определения. Как ни крути, а универсального алгоритма нет. Можно, конечно, попробовать словарём, исключениями, анализировать сообщения на предмет определения пола автора (последнее, кстати, точно будет работать, но реализовать сложно), но везде есть вероятность ошибки. Плюс - некоторые вообще муть пишут типа ♥ ღКсюня♥ ღ ღВивенскаяღ (реальный ник выдрал из ВК), по ней точно ничего не определишь.

Ответ 2



Тривиальными средствами вроде проверки окончаний вы эту задачу вряд ли решите по вполне понятным причинам. Возможно, имеет смысл сделать словарь возможных имен - если речь идет о более-менее традиционных русских именах, то это может помочь - как правило в русском языке мужские и женские имена не пересекаются - возможно, я что-то забыл, но я не помню в русском языке ни одного имени, звучащего одинаково для мужчин и для женщин(за исключением уменьшительных форм типа Саша или Женя). С другой стороны, это тоже не панацея. Во-первых, подобный словарь должен быть достаточно большим (причем 95% его содержимого не будет использоваться вообще, либо будет, но редко. Скажем, вряд ли среди ваших пользователей будет много Никандров или Ратиборов) Во-вторых, если в вашей системе возможны уменьшительные имена, то довольно сложно сказать, является ли условный(ая) Саша мальчиком или девочкой. В-третьих, с иностранными именами тоже далеко не все гладко - скажем, в английском не редкость, что одно и то же имя может принадлежать мужчине или женщине. А уж если брать восточные имена (китайские например или хотя бы армянские), то там и вовсе черт ногу сломит. В-четвертых, ничто не мешает пользователю вместо имени ввести вообще что попало, или какой-то ник. Тут в некоторых случаях даже человеческий мозг будет бессилен. Хотя, с другой стороны, если в вашей системе не предполагается наличие пользователей из Кореи, и в сумеете их убедить писать исключительно имена, а не ники, то с более-менее успешно это может сработать (но все же не стоит забывать что и в этом случае никто ничего не гарантирует) Можно также попробовать анализировать не тоьлко имя, но и фамилию - женские фамилии часто заканчиваются на "а", но тут никакие словари не помогут - если имена еще как-то можно перечислить, то фамилии могут быть вообще какие угодно. Кроме того, есть куча несклоняемых фамилий типа Дуся Гвоздь или какой-нибудь Петя Иванчук, но все же анализ имени и фамилии одновременно может отсеять некоторые непонятности. А вот с отчествами все значительно проще - в подавляющем большинстве случаев мужское отчество заканчивается на "вич", а женское на "вна". С другой стороны, отчества может и не быть вовсе, если человек иностранец, либо его не всегда указывают при регистрации. А мораль этой истории такова: для определения пола используйте галки "М" и "Ж"

Ответ 3



Можно сделать несколько критериев, например как вы уже сказали по окончанию (на ь мужских имен мало, но есть - Олесь), плюс еще добавить словарь исключений (типа Никита, Илья). Можно просто словарь (русских имен не так уж много). Если иностранные имена, то тут все сложнее, так как иногда и человек по имени определить пол не сможет, не говоря уж об алгоритме.

воскресенье, 26 января 2020 г.

Почему консоль пикает? [закрыт]

#c_sharp #консоль #текст


        
             
                
                    
                        
                            Закрыт. Этот вопрос необходимо уточнить или дополнить
подробностями. Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Добавьте больше подробностей
и уточните проблему, отредактировав это сообщение.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
static void Main(string[] args)
{
    byte[] data = new byte[] { 8, 8, 3, 8, 5, 6, 7, 8 };
    Console.WriteLine(Encoding.UTF8.GetString(data));
    Console.ReadLine();
}


С чего бы это?
    


Ответы

Ответ 1



И правда, с чего бы ей пикать при выводе символа с кодом 7 - BEL (Bell, он же звонок)?

Поставить троеточие в не вместившейся в поле текст

#php #html #css #текст


На многих сайтах видно, что невместившейся текст обрезается, ставится троеточие и
ссылка "подробнее".

В CSS нашел свойство text-overflow, но оно обрезает сразу на первой строке.
Как добиться того, чтобы текст обрезался на 3 или 4 строке допустим?
    


Ответы

Ответ 1



с помощью PHP можно делать вот так к примеру: $text = "Допустим здесь ваш текст из 1000 символов"; $text = mb_substr($text,0,140, 'UTF-8'); //140 это кол. знаков echo $text.'...'; Это самый простой пример { $text1 = "Допустим здесь ваш текст из 1000 символов"; $text = mb_substr($text1,0,140, 'UTF-8'); //140 это кол. знаков $str_count = substr_count($text," "); // возвращает количество пробелов $text = explode(" ", $text1); //количество слов for($i=0;$i<$str_count; $i++){ echo $text[$i].' '; } echo "..."; }

Ответ 2



В PHP сколько функций для работы со строками, что вариантов можно скомбинировать множество. Например, мой такой: $raw = 'Строка на много символов...'; $string = substr($raw, 0, 140); // обрезаем первые 140 символов $end = strlen(strrchr($string, ' ')); // длина обрезка $string = substr($string, 0, -$end) . '...'; // убираем обрезок добавляем троеточие echo $string;

Ответ 3



Используйте этот код для PHP: mb_strimwidth("Hello World", 0, 10, "..."); Функция выведет Hello W...

Ответ 4



Это можно легко сделать средствами css. Если правильно ими воспользоваться) Держите

Ответ 5



Это делается скриптом php, где указывается количество видимых символов, а дальше троеточие

Ответ 6



text-overflow обрезает на первой строке т.к. у вас не указана высота блока в котором находится текст, попробуйте что-то вроде:
много много текста
Ну а правильнее и проще конечно сделать на php с помощью substr

Ответ 7



Вы просто разрушили все велосипеды... Функция mb_strimwidth режет "по живому". А функция выше на этой странице, режет по словам. Обернул в функцию, пример: $text1 = "Ассоциация участников рынка лакокрасочных материалов в поддержку качества краски– «Подходы к формированию рынка качественных и безопасных лакокрасочных материалов строительного назначения»"; function textTrim($str, $len) { $text = mb_substr($str,0, $len, 'UTF-8'); //140 это кол. знаков $str_count = substr_count($text," "); // возвращает количество пробелов $text = explode(" ", $str); //количество слов $out = ''; for($i=0;$i<$str_count; $i++){ $out .= $text[$i].' '; } $out .= "..."; return $out; } echo textTrim($text1, 70)."\n"; //Выведет: Ассоциация участников рынка лакокрасочных материалов в поддержку ... echo mb_strimwidth( $text1, 0, 70, "..."); //Выведет: Ассоциация участников рынка лакокрасочных материалов в поддержку ка...

пятница, 24 января 2020 г.

Найти повторяющуюся последовательность в подстроке

#python #регулярные_выражения #текст #подстрока


Всем привет. Задача такова - найти самую длинную повторяющуюся последовательность
в исходной подстроке.
Задач элементарно решается перебором. Но хочется одолеть её регулярными выражениями.
Текущий код:

import re

def repeat_inside(text):
    m = re.findall(r'((\w+)\2+)', text)
    print('исходный текст = {}, результат поиска = {}'.format(text, m[0][0]))
    return m[0][0]

if __name__ == '__main__':
    assert repeat_inside('aabbff') == 'aa'
    assert repeat_inside('aaaaa') == 'aaaaa'
    assert repeat_inside('aababcc') == 'abab'
    assert repeat_inside('abc') == ''
    assert repeat_inside('abcabcabab') == 'abcabc'


Результат выполнения:

исходный текст = aabbff, результат поиска = aa
исходный текст = aaaaa, результат поиска = aaaaa
исходный текст = aababcc, результат поиска = aa
Traceback (most recent call last):
  File "C:/Users/.../main.py", line 12, in 
    assert repeat_inside('aababcc') == 'abab'
AssertionError


Пробовал менять регулярное выражение на \w?((\w+)\2+). Это решает проблему с aababcc.
Но ломает другие тесты. Есть ли у кого-то идеи? Можно без ответа, просто подскажите,
пожалуйста, в какую сторону рыть.
    


Ответы

Ответ 1



Нашёл решение. Необходимо было использовать lookahead assertion (?=...). Итоговое регулярное выражение: re.findall(r'(?=((.+?)\2+))', text) Итоговый код: import re def repeat_inside(text): match = re.findall(r'(?=((.+?)\2+))', text) return max((x[0] for x in match), key=len, default='') if __name__ == '__main__': assert repeat_inside('aaaaa') == 'aaaaa', "First" assert repeat_inside('aabbff') == 'aa', "Second" assert repeat_inside('aababcc') == 'abab', "Third" assert repeat_inside('abc') == '', "Forth" assert repeat_inside('abcabcabab') == 'abcabc', "Fifth"

понедельник, 6 января 2020 г.

Буквы и их размеры

#html #css #текст


Как добиться того, чтобы все буквы имели одинаковую ширину?
    


Ответы

Ответ 1



Моноширинный шрифт Можно тегами , , , можно в CSS универсальным семейством шрифтов monospace: .monospace-css { font-family: monospace; }

Обычный текст

WWWWWWWW
iiiiiiii

Моноширинный текст CSS

WWWWWWWW
iiiiiiii

Моноширинный текст CODE

WWWWWWWW
iiiiiiii

Моноширинный текст KBD

WWWWWWWW
iiiiiiii

Моноширинный текст SAMP

WWWWWWWW
iiiiiiii


воскресенье, 29 декабря 2019 г.

Прозрачный текст с белым бордером

#css #svg #текст


Каким образом достичь данного результата? 



Способы:

color: rgba(255,255,255,0.01)
background-clip
color: transparent + text-shadow


Не дали результатов
    


Ответы

Ответ 1



Можно с помощью svg: body { background: #b4e391; background: -moz-linear-gradient(-45deg, #b4e391 0%, #61c419 50%, #b4e391 100%); background: -webkit-linear-gradient(-45deg, #b4e391 0%, #61c419 50%, #b4e391 100%); background: linear-gradient(135deg, #b4e391 0%, #61c419 50%, #b4e391 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#b4e391', endColorstr='#b4e391', GradientType=1); } Ваш текст

Ответ 2



А как же старый добрый -webkit-text-stroke? Вроде уже и поддержка неплохая. Может я чего-то не понял, но в метках есть [CSS], а это он самый, в чистом виде и с минимумом кода: body { background: url(http://lorempixel.com/600/600/) no-repeat; font: bold 96px 'Arial Black'; text-align: center; } .txt-1 { color: rgba(255, 141, 0, 0.0); -webkit-text-stroke: 1px white; } .txt-2 { color: rgba(255, 141, 0, 0.38); -webkit-text-stroke: 1px black; } .txt-3 { color: rgba(128, 255, 0, 0.38); -webkit-text-stroke: 4px red; } SYSTEM
SYSTEM
SYSTEM

Ответ 3



Используйте значение rgba() для свойства color div { font-family: Arial Black, Arial Bold, Gadget, sans-serif; color: rgba(255, 255, 255, 0.4); font-size: 80px; margin-left: 25px; text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; }
Некоторый текст
Или вы можете использовать :pseudo-element. div { position: relative; font-family: Arial Black, Arial Bold, Gadget, sans-serif; font-size: 80px; margin-left: 25px; text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; } div:after { position: absolute; top: 0; left:0; content: 'Некоторый текст'; width: 100%; height: 100%; font-family: Arial Black, Arial Bold, Gadget, sans-serif; color: white; opacity: 0.4; font-size: 80px; z-index: 1; pointer-events: none; }
Некоторый текст
Или вы можете использовать SVG. body, html { height: 100%; margin: 0; background: url(http://lorempixel.com/500/200/) no-repeat; } Некоторый текст Перевод ответа со Stack Overflow на английском

Ответ 4



Попробуй с помощью псевдо элементов: div { position: relative; font-family: Arial Black, Arial Bold, Gadget, sans-serif; font-size: 80px; margin-left: 25px; text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; } div:after { position: absolute; top: 0; left:0; content: 'Some text'; width: 100%; height: 100%; font-family: Arial Black, Arial Bold, Gadget, sans-serif; color: white; opacity: 0.4; font-size: 80px; z-index: 1; pointer-events: none; } Источник с другими решениями

Вычесть из строки подстроку

#cpp #qt #текст


Есть строка QString DDF1 с n элементами (устройства USB)

Есть строка QString DDF2 с n+1 элементами (добавили флешку)

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

Пример:

Ввод:
/dev/sda  /dev/sda1  /dev/sdc  /dev/sdc1
/dev/sda  /dev/sda1  /dev/sdb  /dev/sdb1 /dev/sdc  /dev/sdc1
Вывод:
/dev/sdb  /dev/sdb1

    


Ответы

Ответ 1



Что-то вроде того: QString str1{"/dev/sda /dev/sda1 /dev/sdc /dev/sdc1"}; QString str2 { "/dev/sda /dev/sda1 /dev/sdb /dev/sdb1 /dev/sdc /dev/sdc1" } auto list1 = str1.split(" "); auto list2 = str2.split(" "); list1.sort(); list2.sort(); QStringList retval{}; auto secondIter = list1.begin(); for (auto i = list2.begin(); i != list2.end;) { if (secondIter == list1.end()) { retval.push_back(*i); ++i; } else { if (*i != *secondIter) { retval.push_back(*secondIter); ++secondIter; } } } for (; secondIter != list1.end(); ++secondIter) { retval.push_back(*secondIter); } Код не проверял, но, думаю, направление вы уловите.

Ответ 2



Вот предлагаю по-оптимизировать. Использовать класс QStringRef чтобы лишний раз не копировать строки, и сравнивать хэши: #include #include template using Hashes = QVector>; template Hashes HashItems(const QVector & items) { Hashes result; result.reserve(std::size(items)); for(const auto & i: items) { result.emplace_back(QHash::qHash(i), i); } return result; } QVector diff(const QString & str1, const QString & str2) { auto tokens1 = HashItems(str1.splitRef(" ")); auto tokens2 = HashItems(str2.splitRef(" ")); // оптимизация, из короткого удалять дешевле const auto & large = std::size(tokens1) > std::size(tokens2) ? tokens1 : tokens2; auto & small = std::size(tokens1) <= std::size(tokens2) ? tokens1 : tokens2; QVector result; for(const auto & l : large) { bool unique = true; for(auto s = std::begin(small); s != std::end(small);) { if(l.first != s->first) { ++s; } else { unique = false; s = small.erase(s); } } if(unique) { result.push_back(l.second); } } for(const auto & s: small) { result.push_back(s.second); } return result; }

Ответ 3



Предлагаю более простой вариант - воспользоваться QSet, контейнером, предоставляющим быстрый поиск и действия типа пересечения, сложения и вычитания: QStringList MainWindow::diff(const QString &str1, const QString &str2) { QStringList list1 = str1.split(" ", QString::SkipEmptyParts); QStringList list2 = str2.split(" ", QString::SkipEmptyParts); QSet set1 = QSet::fromList(list1); QSet set2 = QSet::fromList(list2); QSet d = set2.subtract(set1); return QStringList::fromSet(d); } На вашем примере qDebug()<

вторник, 17 декабря 2019 г.

Как мутировать текст?

#текст #разметка #семантика


Задача генерировать некое количество похожих по содержанию, но не совпадающих 1:1
коротких текстов – например, постов в соц. сети.

Предполагаю, что будет делаться шаблон с местами, куда подставляются либо формы слова
в зависимости от пола «автора», либо один из синонимов, случайно.

Псевдокод:

{gender:Решил|решила} {random:попробовать|испытать|потестить} 
{random:новый сервис|новую примочку} для моих задач.


Если усложнять, понадобятся кросс-связи для родов-падежей выбранных вариантов в разных
частях предложения. Глобальные и локальные переменные. Целый ЯП?

Вопрос: существует ли стандартный подход к такой задаче (как называется такая задача),
есть ли язык разметки, подходящий для описания таких шаблонов?



Upd. Если мечтать, идеально и «правильно» было бы просто подать единственный вариант
текста на вход. И иметь движок, способный адекватно оценить смысл, разложить на элементы
и самостоятельно предложить замены исходя из заданных допусков. Напр. пол фиксировать
параметром, упомянутые цвета не менять, упомянутые имена художников менять в рамках
одного художественного стиля и исторической эпохи (ладно, это уже высший пилотаж был бы : )
    


Ответы

Ответ 1



Никогда этим не занимался, но знаю что обычно для этого используют цепи Маркова. Информация для размышления. Второй источник пищи к размышлению. Описывается система перевода, общий принцип работы которой сводится к последовательности преобразований: язык 1->анализ->семантическое описание->генерация->язык 2. Как вы понимаете у вас на входе и на выходе должен быть один и тот же язык, плюс потребуется в семантическом описании подставлять синонимы в разных комбинациях. Можно сделать более простой вариант который содержал бы только второй этап - генерацию. Вообще к чему я это все, а к тому что стоит поискать переводчики с открытым кодом реализующими приведенный принцип. Кстати сам Сокирко со товарищи выложил свои наработки под GPL. Это не система перевода а система анализа, но главное там есть инструменты для работы с семантическими описаниями.

Ответ 2



Ну предположим, так (работает в Firefox актуальной версии): var processors = { gender(options, m, w) { return options.gender === 'm' ? m : w; }, random(options, ...a) { return a[Math.random() * a.length | 0]; } }; function generate(template, options) { return template.replace(/\{(\w+):(.*?)\}/g, function (match, key, str) { return processors[key] ? processors[key].apply(null, [options].concat(str.match(/(\\[{}|\\]|[^|])+/g))) : match; }); } var template = "{gender:Решил|Решила} {random:попробовать|испытать|потестить} \n\ {random:новый сервис|новую примочку} для моих задач." for (var q=0; q<10; ++q) console.log(generate(template, { gender: 'mw'[q&1] })); Вроде сюда можно добавить любую желаемую логику.

четверг, 12 декабря 2019 г.

Как отличить текст в файле с обычной кодировкой от Unicode?

#cpp #windows #unicode #текст


Нужно прочесть текстовый файл. Как узнать, закодирован таблицей символов (однобайтовых),
или в файле содержится текст в формате Unicode (16-ти битные символы)?
    


Ответы

Ответ 1



Файл всегда содержит байты. Иногда содержимое файла можно декодировать в текст, используя выбранную кодировку такую как cp1251, cp866, utf-8, или utf-16le. На Windows, файлы, закодированные в utf-16, к сожалению иногда называют Unicode (что вводит в заблуждение: Unicode—это не кодировка). utf-16 это всего лишь одна из многих кодировок, которую можно использовать, чтобы закодировать текст (Unicode) в байты: байты = юникод_текст.encode(кодировка) юникод_текст = байты.decode(кодировка) Файлы, содержащие текст, закодированный в utf-8, utf-16, utf-32 и других кодировках, могут содержать в начале специальную последовательность байт (U+FEFF символ BOM, закодированный в соответствующей кодировке), которая идентифицирует эти кодировки. Если файл следует этому соглашению, то достаточно несколько первых байт из файла (в двоичном режиме открытого) сравнить с вариантами BOM, чтобы определить соответствующую кодировку. В общем случае нет гарантированного на 100% способа определить кодировку файла (хотя некоторые кодировки могут быть более вероятны чем другие и может быть API, которое пытается угадать кодировку, такое как: IsTextUnicode() с IS_TEXT_UNICODE_STATISTICS). Пример: "Bush hid the facts" текст, закодированный в ascii кодировке, мог некоторыми приложениями интерпретироваться как текст в utf-16le кодировке, приводя к кракозябрам.

Ответ 2



Зависит от соглашения, в котором записан текстовый файл. Текстовый поток, записанный в формате Unicode может начитаться с BOM - Byte Order Mark, т.е. например с магических байтов FF, FE для UTF-16 Little Endian. А в отсутствие каких-либо соглашений - только анализ текста с элементами гадания на кофейной гуще.

Ответ 3



Простая на первый взгляд задача, но выполнить её оказывается не просто. С++ обладает достаточной гибкостью, как язык среднего уровня, поэтому требуется исчерпывающее знание вопроса для эффективной реализации задачи. Поделюсь тем что выяснил.Чтобы правильно прочесть файл нужно сначала посмотреть, есть ли в начале файла Маркер последовательности (тут точнее). Если есть маркер, его нужно определить. Если маркера нет, как выше уже было сказано, нужно искать другой алгоритм определения кодировки.Я тут целиком и полностью полагаюсь на IsTextUnicode, если маркера нет:BYTE *pBuf;size_t szRead, szBOM; // к-во прочитанных в файле байт и к-во байт маркераenum Unicode eUnicode;LPTSTR pszText;...// определяю, есть ли в тексте маркер (ручная работа)szBOM = IsUnicodeRaw(pBuf, szRead, &eUnicode);// вызов библиотечной ф-ции IsTextUnicode после собственной проверкиif(eUnicode != utf_16LE && ((szRead - szBOM) % 2 || !IsTextUnicode(pBuf + szBOM, (int) (szRead - szBOM), NULL))){ BYTE *pb = new BYTE[(szRead - szBOM + 1) * sizeof(wchar_t)]; unsigned int nCP = (eUnicode == utf_8) ? CP_UTF8 : (eUnicode == utf_7) ? CP_UTF7 : CP_ACP; if (!MultiByteToWideChar(nCP, (nCP == CP_ACP) ? MB_PRECOMPOSED : 0, (LPCSTR) (pBuf + szBOM), (int) (szRead - szBOM), (LPWSTR) pb, (int) (szRead - szBOM))) { // ошибка... } delete[] pBuf; pszText = (LPTSTR) (pszBuf = pb)}else pszText = (LPTSTR) (pszBuf + szBOM);После того как выяснил наличие маркера в ф-ции IsUnicodeRaw, обращаюсь к IsTextUnicode без маркера. Работает с UTF-8, с UTF-7 нужно разбираться - там последние 2 бита маркера являются частью следующего за маркером символа. ANSI-текст так же нормально кодирует в двухбайтовый.Wind'а предпочитает UTF-8 и UTF-16LE. Перед тем как записать текст, его нужно либо перекодировать в ANSI ф-цией WideCharToMultibyte, либо в начало файла записать маркер кодировки UTF-8 или UTF-16LE, чтобы потом также прочесть.

Ответ 4



Кажется, нашёл. Ф-ция IsTextUnicode из Advapi32.dll ответит на поставленный вопрос.

вторник, 10 декабря 2019 г.

Расстановка переносов в русских словах

#python #строки #текст


Недавно пробегала тема (автор ее почему-то удалил потом) с просьбой помочь в реализации
расстановки переносов в русских словах на Python. Условие данное им было таким:  

а) две идущие подряд гласные можно разделить, если первой из них предшествует согласная,
а за второй идет хотя бы одна буква (буква й при этом рассматривается с предшествующей
гласной как единое целое);
б) две идущие подряд согласные можно разделить, если первой из них предшествует гласная,
а в той части слова, которая идет за второй согласной, имеется хотя бы одна гласная
(буквы ь,ъ при этом рассматриваются как единое целое с предшествующей согласной);
в) если правила, указанные в пунктах (а) и (б) применить невозможно, то следует
попытаться разбить слово так, чтобы первая часть содержала более чем одну букву и
оканчивалась на гласную, а вторая содержала хотя бы одну гласную.  

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

Если работа скрипта устроит, пользуйтесь на здоровье, если кому нужно. Код в ответе.  
    


Ответы

Ответ 1



#!/usr/bin/env python3 # -*- encode: utf-8 -*- def w_wrap(word: str) -> str: def is_vow(let: str) -> bool: _vowels = ['а', 'о', 'и', 'е', 'ё', 'э', 'ы', 'у', 'ю', 'я', 'А', 'О', 'И', 'Е', 'Ё', 'Э', 'Ы', 'У', 'Ю', 'Я'] return let in _vowels def is_cons(let: str) -> bool: _consonants = ['б', 'в', 'г', 'д', 'ж', 'з', 'к', 'л', 'м', 'н', 'п', 'р', 'с', 'т', 'ф', 'х', 'ц', 'ч', 'щ', 'ш', 'Б', 'В', 'Г', 'Д', 'Ж', 'З', 'К', 'Л', 'М', 'Н', 'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ'] return let in _consonants def vow_inds(wrd: str): return [i for i in range(len(wrd) - 2) if is_vow(wrd[i])] vow_indices = vow_inds(word) if vow_indices and vow_indices[0] + 2 < len(word): for ind in vow_indices: sep = '-' ind += 1 if (is_cons(word[ind]) or word[ind] in 'йЙ') and not is_vow(word[ind + 1]): ind += 1 if len(word[:ind]) == 1: # не даем отделять единичные гласные sep = '' if len(word) > 3 and word[ind] in 'ьЬЪъ': if word[-1] in 'ьЬЪъ': sep = '' ind += 1 return word[:ind] + sep + w_wrap(word[ind:]) return word t_word = input('Введите слово: ') print('Варианты расстановки переносов слова "{}" - [ {} ]'.format(t_word, w_wrap(t_word))) Пример: print(w_wrap('собака')) # со-ба-ка print(w_wrap('обезьяна')) # обезь-яна print(w_wrap('программирование')) # прог-рам-ми-ро-ва-ние

суббота, 30 ноября 2019 г.

Как определить степень схожести двух текстов?

#алгоритм #сравнение #wavelet #текст


Допустим, взяли исходный текст, три абзаца. В его копии убрали полностью последнее
предложение, поменяли адрес ссылки где-то в тексте, заменили пару предлогов, и заменили
пару слов на синонимы.
Каков алгоритм, чтобы определить "эти тексты сходны на 65%. Скорее всего, общий первоисточник"?
Есть ли что-то вроде вэйвлет анализа для текстов?     


Ответы

Ответ 1



В биоинформатике подобные вопросы - определение схожести двух разных последовательностей нуклеиновых кислот или протеинов (читай - текстов) - составляют основную проблему. Решается она с помощью разных алгоритмов выравнивания. В вашем случае можно применить метод глобального выравнивания - самого простого из них. Подробнее о нем читай по указанной ссылке. Если будет непонятно, порекомендую литературу.

Ответ 2



Алгоритм шинглов. Алгоритм шинглов — алгоритм, разработанный для поиска копий и дубликатов рассматриваемого текста в веб-документе, мощный инструмент, призванный бороться с проявлениями плагиата в интернете.

Ответ 3



Скорее шутка и очень простой ответ. Подозреваю что автору не подойдет. Надо вычесть из единицы отношение длины вывода утилиты diff к сумме длин текстов. Конечно, diff сравнивает по строкам, но это можно обойти довольно просто, выводя каждое слово в отдельной строке.