Страницы

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

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

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

Семантика html5, тег main

#html5 #семантика


Вопрос по HTML5 (семантика).

Есть тег main. Он размещён на главной странице новостного ресурса. В него входят
превью новостей. По клику превью разворачивается страница детального просмотра новости
(со своим main). 

Правильно ли я поступаю, что превью новостей на главной странице заключены в main?

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

P.S.: я не могу дать ссылку, потому как всё только на уровне начала вёрстки.
    


Ответы

Ответ 1



Ответ на первый вопрос: да, правильно. Давайте разберёмся: тег main - уникальное содержимое страницы, а Элементы не являющиеся контентом (из него исключаются) в aside Ваше глобальное использование этого тега семантически верное. Проще запомнить: использовать его один раз. Касательно, самих превью: в стандарте заложен тег section который допускает вложенность в себя собственные h1, header и footer. Рекомендую прересмотреть структуру тегов. Не зная структуру вашего сайта, сложно ответить, но предположим, что помимо n-нного количества превью на главной, вы предположим разместите сквозной блок - ленту из топ-5 статей, сходных по контенту (первый абзац, краткое описание....) - то такой вид контента считайте уже повторяющимся. Ответ на второй вопрос: В понятие уникальность, поисковики закладывают исключительно единожды размещённый материал. Но при этом не накладывают штрафы за таковые превью, при размещении рядом ссылки (кнопки) ведущей на страницу с полным текстом документа. Послесловие: несмотря на мою любовь к HTML5, применение его в production-проектах сопровождается с поддержкой динозавра всеми любимого Internet Explorer-а. Обратите на это внимание в процессе разработки.

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

В чем отличие & от && на примере конструктора копирования и конструктора переноса?

#cpp #cpp11 #конструктор #семантика


Допустим, у нас есть класс с обычным конструктором:

   class SomeClass { 
    int size; 
    int *element; 
   public: 
    SomeClass(int i) { //обычный конструктор
     size = i; 
     element = new int[size]; 
     } 
    }; 


И предположим, что я добавил туда конструктор копирования и конструктор перемещения
(переноса):

SomeClass( SomeClass &&other ) { //конструктор перемещения
 size = other.size; 
 element = other.element; 
 other.size = 0; 
 other.element = nullptr; 
} 

SomeClass( SomeClass &other ) { //конструктор копирования
 size = other.size; 
 element = other.element; 
 other.size = 0; 
 other.element = nullptr; 
} 

int main()  {
 SomeClass a1(5);
 SomeClass a2(a1); //вызов конструктора копирования
 SomeClass a3 = move(a1); //вызов конструктора переноса
}


Здесь один нюанс: конструктор копирования не будет копировать, он тоже будет выполнять
перенос.

В чем тогда отличие? Если фактически происходит одно и тоже. Code::Blocks выдает
разницу в секунду. Думаю, тогда вопрос встает между использованием & и &&.

Я знаю, что второе - это ссылка на r-value, и что она позволяет обратиться к ресурсам
объекта. Но ведь в обоих случая создается новый объект. В чем тогда профит?
    


Ответы

Ответ 1



Конструктор перемещения это чисто конвенциональная конструкция(так же как и конструктор копирования, собственно), поэтому никто не мешает делать в любом конструкторе всё, что заблагорассудится. Другое дело, что программист, использующий Ваш класс, будет ожидать перемещения от конструктора перемещения и никак не будет ожидать такого подвоха от конструктора копирования. В том числе и поэтому, конструктор копирования всегда объявляется с константным аргументом, а не как у Вас. Ещё раз, конструкторы имеют свои названия исходя из того, что они делают по умолчанию(т.е. тогда, когда их генерирует компилятор). Соответственно, программист тоже должен делать так, как делается по умолчанию, а не придумывать реализацию, которая больше похожа на саботаж, чем на что-либо другое. Исходя из всего вышесказанного: Ваш вопрос не имеет смысла. Отличным примером перемещающего конструктора копирования является std::auto_ptr. Все мы знаем его судьбу.

Ответ 2



Существует несколько категорий выражений, наболее известные - это "rvalue" и "lvalue". Переменная с типом T&& может принимать только r-value выражение, переменная с типом T& может принимать только не константные l-value выражения. Совершенно не важно, что это за переменная - агрумент конструктора или нет. Соответственно разница между SomeClass( SomeClass &&other ) и SomeClass( SomeClass &other ) - только в том, что первый будет вызываться только для r-value выражений, а второй - только для неконстантных l-value выражений. При этом ни один из них не может принимать const SomeClass &. Что именно делают конструкторы - никому не важно, то что у них одинаковый код - это тоже не важно. Единственное отличие - это категории выражений, которые они могут принимать.

Ответ 3



Ваш конструктор копирования изменяет состояние объекта, с которого делается копия. Соответственно, такую операцию уже нельзя в полной мере назвать копированием. Правильная сигнатура конструктора копирования такая: SomeClass( const SomeClass &other )

Ответ 4



В чем тогда профит? Rvalue ссылки позволяют программистам избегать логически ненужного копирования и обеспечивать возможность идеальной передачи (perfect forwarding). Прежде всего они предназначены для использования в высоко производительных проектах и библиотеках.

вторник, 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] })); Вроде сюда можно добавить любую желаемую логику.

понедельник, 25 ноября 2019 г.

Посчитать количество предложений в тексте


Здравствуйте! Подскажите пожалуйста решение моей проблемы.  Я пытаюсь сделать так
что из текста, который считывается с файла, я получаю количество предложений. Это 
моем коде работает. Но! я не понимаю как расширить программу, чтобы учесть, что точка не всегда обозначает окончание предложения. Точка также может использоваться в качестве сокращений, например и.о.(исполняющий обязаности).

package ir_ub2;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.ReadOnlyFileSystemException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class TextCounts {

    public static void main(String[] args) throws IOException {
        // datei lesen
        FileReader fileName = new FileReader("C:\\Users\\Olga\\Desktop\\ub_2\\inputDE.txt");

        // wrap a BufferedReader around FileReader
        BufferedReader reader = new BufferedReader(fileName);
        int sentenceCount = 0;
        String line;
        String terminalSymbol = ".?!";

    while ((line = reader.readLine()) != null) { // Continue reading until end 
 of file is reached
    for (int i = 0; i < line.length(); i++) {
        if (terminalSymbol.indexOf(line.charAt(i)) != -1) { // If the delimiter
string contains the character
            sentenceCount++;
            }
        }
    }


    reader.close();
    System.out.println("The number of sentences is " + sentenceCount);
    }
}

    


Ответы

Ответ 1



Рискуя навлечь на себя гнев всей ленты все таки напишу: А вы, друзья, как ни садитесь, Все в музыканты не годитесь Ну если серьезно, то не надо кустарщину, а надо решить задачу по правильному. Я вижу 2 возможных способа: Либо засунуть ваш текст в NLP сеть и обучить ее. Для начала можно взять OpenNLP и попробовать обучить ее. Взять Apache Lucene и попробовать SentenceTokenizer - который разобьет текст на предложения Lucene, насколько я понимаю, поддерживает русский язык, есть кстати и внешние расширители Lucene для русской морфологии Как то так.

Ответ 2



с такими, различного рода, сокращениями (и.о., т.н., И.С. Тургенев ...). Стоит учитыват количество символов, между точками, либо количество символов до точки. Таких коротких предложений не бывает, следовательно их можно не учитывать. Также можно заложиться на предложения вроде: "Да.", "Нет." Не думаю что таких коротких очень много наберется. В любом случае, задача бесполезная, имхо.

Ответ 3



Навскидку несколько моментов, которые казалось бы простую задачу превращают в нерешаемую: Парцелляция - не понятно, это одно предложение или все-таки несколько: Он тоже пошёл. В магазин. Купить сигарет. (Шукшин) Предложения с прямой речью: Игнат прошептал: "Да ну эту задачу к черту," - и нервно засмеялся. Ошибки сканирования, опечатки, отсутствие знаков препинания как в типичном интернет-общении. При включенном капсе границы предложения не маркированны никак. ВЕДЬ ВСЕ БЫЛО ТАК ПРОСТО ЕЩЕ ПЯТЬ МИНУТ НАЗАД НЕНАВИЖУ Вкрапления кода: Для вывода имени пользователя наберите echo $name . ' ' . $surname.

Ответ 4



Это открытая научная задача. Тут, например люди пытаются ее как-то решить. Есть библиотека для Питона, которая с этой задачей неплохо справляется(как минимум для английского). Если использовать Яву все-таки очень нужно, см. Jython.

Ответ 5



Можно использовать regex: Matcher m = Pattern.compile("\\.\s*[A-ZА-Я]").matcher(yourText); //Вместо yourText должна быть переменная с текстом, в котором нужно посчитать предложения int count = 1; while(m.find()) count++; //Будут сосчитаны все предложения начинающиеся с большой буквы

Ответ 6



Вот написал, по моему получилось интересно. Данный код понимает такой вид тестовых предложений. Привет тест. T..... a Тестирование 34. WHAT??? Вывод Предложений по моему мнению:4 Также есть дебаг фитчи для теста, он после каждого предложения выводит само предложение. Их можно удалить, а можно использовать. package javaapplication3; import java.io.ByteArrayOutputStream; public class JavaApplication3 { public static void main(String[] args) { String str = "Привет тест. T..... a Тестирование 34. WHAT???"; byte[] bytes = str.getBytes(); byte tocka = '.'; //заставляем интерпретатор из символа точки получить байт(можно цифру, но так понятнее вам будет) byte vopr = '?'; byte voscl = '!'; int count = 0; //храним количество int max = bytes.length; if(max>0){ int i = 0; //сдвиг byte a; //активный байт //ДЕБАГ, В СЛУЧАЕ ИСПОЛЬЗОВАНИЯ СКРИПТА БЕЗ ДЕБАГА ЗАКОМЕНТИТЬ ОТ И ДО ByteArrayOutputStream out = new ByteArrayOutputStream(); //буфе для предложений //дебаг режим выводит уже предложения //РАЗБИРАЕМ while(i

Ответ 7



Cвой вопрос мне удалось решить. Для тех, кому интерессно вот мой ответ. Стоит отметить что задание было для текстов немецкого языка и случаи с сокращением инициалов имени (напр.А.С. Пушкин) учитывать мне не нужно было. package ir_ub2; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class TextCounts { public static void main(String[] args) throws IOException { FileReader file = new FileReader("inputDE.txt"); // datei lesen BufferedReader reader = new BufferedReader(file); int sentenceCount = 0; String line; String delimiter = ".?!"; String[] singlePointExceptions = { "19. Jahrhundert", "allg.", "bzw.", "bspw.", "etc.", "evtl.", "geb.", "ggf.", "n.Chr", "od.", "s.", "u.", "usw.", "vgl." }; String[] doublePointExceptions = { "b.w.", "d.h.", "d.i", "n.Chr.", "s.a.", "s.o.", "s.u.", "u.a.", "u.Ä.", "u.U.", "u.z.", "v.a.", "v.Chr.", "z.B.", "z.T.", "z.Zt." }; while ((line = reader.readLine()) != null) { // Continue reading until end of file is reached int countQuestionsAndExclamations = countMatchesOfSpecialCharacters(line, "?", "!"); int countSingles = countMatchesOfSpecialCharacters(line, singlePointExceptions); int countDoubles = countMatchesOfSpecialCharacters(line, doublePointExceptions); int countPoints = countMatchesOfSpecialCharacters(line, "."); sentenceCount += (countQuestionsAndExclamations + (countPoints - (countSingles + countDoubles))); } reader.close(); file.close(); System.out.println("# of founded Sentences: " + sentenceCount); } private static int countMatchesOfSpecialCharacters(final String str, final String...specialCharacters) { if (null == str || str.isEmpty()) { return 0; } if (null == specialCharacters || specialCharacters.length == 0) { return 0; } int count = 0; int index = 0; for (int i = 0; i < specialCharacters.length; i++) { String special = specialCharacters[i]; index = 0; while ((index = str.indexOf(special, index)) != -1) { count++; index += special.length(); if (index >= str.length()) { break; } } } return count; } }

Ответ 8



Можешь воспользоваться функцией String.split("."); Функция вернёт массив предложений, а с predlidzenja.length() можно получить длину массива.

среда, 27 марта 2019 г.

В чем отличие & от && на примере конструктора копирования и конструктора переноса?

Допустим, у нас есть класс с обычным конструктором:
class SomeClass { int size; int *element; public: SomeClass(int i) { //обычный конструктор size = i; element = new int[size]; } };
И предположим, что я добавил туда конструктор копирования и конструктор перемещения (переноса):
SomeClass( SomeClass &&other ) { //конструктор перемещения size = other.size; element = other.element; other.size = 0; other.element = nullptr; }
SomeClass( SomeClass &other ) { //конструктор копирования size = other.size; element = other.element; other.size = 0; other.element = nullptr; }
int main() { SomeClass a1(5); SomeClass a2(a1); //вызов конструктора копирования SomeClass a3 = move(a1); //вызов конструктора переноса }
Здесь один нюанс: конструктор копирования не будет копировать, он тоже будет выполнять перенос.
В чем тогда отличие? Если фактически происходит одно и тоже. Code::Blocks выдает разницу в секунду. Думаю, тогда вопрос встает между использованием & и &&
Я знаю, что второе - это ссылка на r-value, и что она позволяет обратиться к ресурсам объекта. Но ведь в обоих случая создается новый объект. В чем тогда профит?


Ответ

Конструктор перемещения это чисто конвенциональная конструкция(так же как и конструктор копирования, собственно), поэтому никто не мешает делать в любом конструкторе всё, что заблагорассудится. Другое дело, что программист, использующий Ваш класс, будет ожидать перемещения от конструктора перемещения и никак не будет ожидать такого подвоха от конструктора копирования.
В том числе и поэтому, конструктор копирования всегда объявляется с константным аргументом, а не как у Вас. Ещё раз, конструкторы имеют свои названия исходя из того, что они делают по умолчанию(т.е. тогда, когда их генерирует компилятор). Соответственно, программист тоже должен делать так, как делается по умолчанию, а не придумывать реализацию, которая больше похожа на саботаж, чем на что-либо другое.
Исходя из всего вышесказанного: Ваш вопрос не имеет смысла.

Отличным примером перемещающего конструктора копирования является std::auto_ptr. Все мы знаем его судьбу.