LINUX.ORG.RU

Дублирующиеся теги

 


7

10

Некоторые, наверное, уже заметили, что я начал войну с ветряными мельницами дублирующимися тегами. Извините, если вам вдруг придёт десяток уведомлений по какому-нибудь невезучему тегу. Не хочу повторить историю с cetjs2.
Кидайте в эту тему дублирующиеся теги, которые нужно почистить.
Например, были теги «параноя», «паранойа», «паранойя», остался только «паранойя», «rubyonrails» -> «ruby on rails» и т.д.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

кастомизация, customizing ?

teod0r ★★★★★
()

аппаратное ускорение, hardware acceleration

teod0r ★★★★★
()

vm, виртуальная машина, виртуальные машины

teod0r ★★★★★
()

Поиск программы и поиск софта.

Dog ★★★
()
Ответ на: комментарий от teod0r

вроде как версионные теги отменили

Вот имхо зря. Зоопарк конечно, не нужен,но исключения надо сделать.Для примера, gtk2 и gtk4 сильно разные вещи, человек легко можешь знать одно,и не знать другое. qt то же самое.

Dog ★★★
()

astra linux, астра-линукс

teod0r ★★★★★
()

file manager, файловый менеджер

teod0r ★★★★★
()

костыли, костыль

CrX ★★★
()

gestures, жесты

CrX ★★★
()

video, видео
hdd, жёсткие диски (кстати почему последний внизу не в алфавитном порядке?)

teod0r ★★★★★
()
Ответ на: комментарий от teod0r

Готово. Что-то видимо не так с сортировкой и буквой «ё».

maxcom ★★★★★
()

телевизор, телевизоры

teod0r ★★★★★
()

keyboard, клава, клавиатура

teod0r ★★★★★
()

ubuntuphone, ubuntu phone
ещё есть какой-то uduntu. это кто-то ubuntu неправильно написал?

teod0r ★★★★★
()

unicode, юникод

teod0r ★★★★★
()

wpasupplicant, wpa supplicant, wpa-supplicant

teod0r ★★★★★
()

Присутствует тег telegam

serg002 ★★★
()

Не грамотнее ли будет ввести премодерацию тегов?

Beelzebul
()

astronomie, astronomy, астрономия

Werenter ★★★
()
Ответ на: комментарий от CYB3R

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

Например есть тег

  • TAG_A у него есть синонимы A B C D M

Есть ещё тег

  • TAG_B у него есть синонимы X Z P TAG_A F

Значит ли это что теперь все перечисленные теги

  • TAG_A TAG_B A B C D M X Z P F

Фигак и стали синонимами? Ведь вхождение TAG_A в синонимы TAG_B автоматически включает родство между ними всеми сразу.

Я фигульку написал которая ищет теги похожие типа

  • яблоко apple
  • поискатред поиска-тред поиска тред поиска.тред

И если раньше можно было просто быстро получить теги 12700+ их сейчас. То теперь надо ещё пройтись по всем синонимам ещё сотка тысяч запросов на сервер.

И уже учитывая синоним, глядеть оно дубликат, или синоним. Хотя дубликат это и есть синоним, но не всякий синоним это дубликат например эвент событие синонимы, но не дубликаты.

И как быть? Я про первый вопрос, нужно ли эмм делать слияние синонимов тегов, если они перекрёстно друг в друге оказались, ну или односторонне?

Или я запутался? Спасити, памагити.

LINUX-ORG-RU ★★★★★
()

Вопщем программа отработала, в результате больше ттысячи новых синонимов или дубликатов. Есть ложные срабатывания, но их надо выглядывать глазами и подчищать руками, например символьные различия 4.2 и 42 или логические ип,ip. Это не сложно, но долго. Качественных же и правильных срабатываний большая часть.

Суть, проход был по всем существующим тегам,

  • берётся один тег

  • берутся все его синонимы

  • затем идёт проход по всем тегам опять

  • тег переводится на русский и ведётся поиск его такого варианта

  • тег переводится на английский и ведётся поиск его такого варианта

  • теги сравниваются без разделителей

    • ‘.’
    • ’ ’
    • ‘-’
  • тоже самое ещё раз, но без разделителей в переведённых вариантах

  • теги с опечатками учитываются когда это возможно (на уровне переводчика)

Если для текущего тега нашёлся такой тег которого сейчас нет в синонимах
и/или теги совпадают на уровне перевода яблоко <-> apple и/или теги совпадают на уровне разделителя с/без учёта перевода

  • новый год
  • new year
  • новый-год
  • новыйгод
  • new-year
  • новогодний (если переводчик translate-shell исправит)

И так далее, то считается то найден тег который является новым синонимом или дубликатом. На деле часто так и есть. Было интересно писать программку. Но вот сомневаюсь что @CYB3R настолько псих что вручную отфильтрует ложные срабатывания и внесёт сотни правок, по удалению дубликатов и добавлению синонимов на сам ЛОР. Уж больно, дохрена. Но, что нарыл то нарыл.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Да, работа определённо большая, но что-то мне кажется, что нужно начинать с малого. Некоторые синонимы нужно просто снести, я считаю. А вот с переводами сложнее, возможны ведь разные варианты перевода. Возможны слова, у которых есть несколько значений, где одно переводится так, а другое сяк, потому при объединении тегов нужно это учитывать и рассматривать каждый случай в отдельности, смотреть, в каком значении автор использовал то или иное слово. Тут без нейросетки не обойтись (не важно, искусственной или естественной).

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

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

что нужно начинать с малого

Ага. Запустил обход по новой, но теперь исключаю переводы тегов и отфильтровываю варианты когда первый символ - и без него теги равны например -1 и 1, и если тег из 3 или менее символов и там есть точка например 4.2 и 42. Но даже без переводов ждать долго десятки тысяч запросов на ЛОР для получения текущих синонимов тегов делать нужно каждый раз иначе не актуально будет. Ну и таймауты стоят чтобы лор не дудосить. Попозжа выложу, может там список поадекватнее получится как по содержанию, выявить уж совсем дубли ляля, ля-ля, ля ля, так и по размеру сотню или пару сотен можно и подчистить. Хотя вот последнее ляля, ля-ля, ля ля наверное вообще надо отфильтровывать на уровне кода ЛОРа. Но это надо жаву учить. Лень.

Сам скрипт не выкладываю, так как уж больно он долбится в ЛОР часто, ладно я один долблю.
А если десяток других людей начнут просто на поглядеть то Максим расстроится наверное :)


По поводу переводов добавлю для однозначности, в списке первом это не новые в смысле вот слово, а вот новый его перевод, это в смысле вот тег, вот его перевод и в тегах есть уже такой же тег, но в переведённом варианте, типа linux и линукс. А не в смысле что нужно добавить переведённый вариант, а в смысле что он уже есть, просто чтобы его найти тег надо перевести. Но да, так как переводы делаются автоматически, там порой возникают проблемки как логические так и просто ошибки. И да, даже имея на руках просто два тега в разном переводе и головой ещё не всегда понятно надо ли что-то с ними двумя делать или нет, без всякой автоматики, так как и контекст и всё такое. Да даже с числами беда -7 это из треда про погоду или очередной ДВИМ/ШВИМ :D Бида. Но непонятные случаи можно просто не трогать, так как нет одного правильного варианта, они оба правильные, а вот поискатред поиска-тред поиска тред это уже понятно, просто и однозначно.

Хорошая такая борьба с мельницами, ага :D

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 4)
Ответ на: комментарий от CYB3R

Вот результат только с дубликатами тегов.
Без всяких переводов. И поиска синонимов

Например для тега iptv есть дубликат ip-tv, но дубликата нет в синонимах тега iptv и наоборот. Удалять ли один из них или делать синонимом другого, не знаю.

modrewrite,mod rewrite,
openvswitch,open vswitch,
oomkiller,oom-killer,
iptv,ip-tv,
heroes3,heroes 3,
warthunder,war thunder,
opensuse,open suse,
неготов,не готов,
minipc,mini-pc,
koi8r,koi8-r,
iproute,ip route,
codestyle,code style,
bruteforce,brute-force,
symfony2,symfony 2,
ohmyzsh,oh-my-zsh,
pcie,pci-e,
dualgraphics,dual graphics,
h264,h.264,
мопеднемой,мопед не мой,
unity2d,unity 2d,
msoffice,ms office,
handmade,hand-made,
email,e-mail,
ipcam,ip cam,ipcam,ip-cam,
emu,e-mu,
rs485,rs-485,
qtquick,qt quick,
steamdeck,steam deck,
filetransfer,file transfer,
япознаюмир,я познаю мир,
rubyonrails,ruby on rails,
libreoffice,libre office,
realtime,real time,
sweethome3d,sweet home 3d,
expressjs,express.js,
рентв,рен-тв,
opencascade,open cascade,
неосилил,не осилил,
ненужно,не нужно,
hyperv,hyper-v,
tvtuner,tv tuner,tvtuner,tv-tuner,
rstudio,r-studio,
xwindow,x window,
csharp,c sharp,
kdeconnect,kde connect,
macpro,mac pro,
blackscreen,black screen,
uboot,u-boot,
mail server,mailserver,
linuxformat,linux format,
deusex,deus ex,
raid1,raid 1,raid1,raid-1,
webserver,web server,webserver,web-server,
fibrechannel,fibre channel,
userfriendly,user friendly,userfriendly,user-friendly,
useragent,user-agent,
unity3d,unity 3d,
microsd,micro sd,
bigdata,big data,
ddwrt,dd-wrt,
tvbox,tv box,
synflood,syn flood,
mustdie,must die,
sailfishos,sailfish os,
postgrespro,postgres pro,
softwarefreedomday,software freedom day,
covid19,covid-19,
linuxgamepublishing,linux game publishing,
64bit,64-bit,
webmail,web mail,
неторт,не торт,
небылопечали,не было печали,
dlink,d-link,
filesharing,file sharing,
cpuburn,cpu burn,
appstore,app store,
oldschool,old school,
plan9,plan 9,
baytrail,bay trail,
partedmagic,parted magic,
googleearth,google earth,
mssql,ms sql,
pcspeaker,pc speaker,
scifi,sci-fi,
cdrom,cd-rom,
gma3600,gma 3600,
rs232,rs-232,
LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Спасибо. Разберу этот список через некоторое время.

maxcom ★★★★★
()

dependent types

зависимые типы

Werenter ★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Отличный список, я считаю, тут явно нужно объединять, а не плодить синонимы, почти во всех случаях.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Ой! А я дурак. Вот тут например

Я вместо синонимов собирал См. также: и по ним фильтровал вероятные другие синонимы…

И тут у меня вопрос, если с синонимами всё ясно, то что такое См. также:? В смысле как эти теги появляются на странице конкретного тега? Наверное глупый вопрос, или это можно тоже считать синонимами?

А вот тут

[10155] [free software] fsf
[10155] [free software] gnu
[10155] [free software] gpl
[10155] [free software] opensource
[10155] [free software] stallman
[10155] [free software] спо
[10155] [free software] fsf
[10155] [free software] opennet

Синонимов вообще нету. Но в См. также: они есть.
И уже есть смысл искать синонимы тега free software учитывая его См. также:, но это чревато, если есть тег в синонимах для opennet он логически танет синонимом для free software что логически не верно, но верно для спо… Поэтому автоматически кажется всё это никак не выявить. Пусть оно будет всё самотёком. Лишь явные дубли править и всё.

Всё переплетено. Чё так сложно :(

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от CYB3R

Короче выкинул я 80% кода где дохрена запросов и много лишней работы, переводы всякие и прочая фигня.
Оставил только поиск банальных дублей и всё. Такое можно и выложить, может пригодится.

----------------------------------------------------------------------------
--                        Поиск дубликатов тегов                          --
----------------------------------------------------------------------------
-- lua checktags.lua --tags tags.txt - сохранить теги в файл и сразу выйти
-- lua checktags.lua --dups dups.txt - найти и сохранить дубликаты тегов
-- lua checktags.lua                 - как с --dups но без сохраниния в файл
----------------------------------------------------------------------------
local https = require('ssl.https') -- Зависимость 'apt install lua-sec'
----------------------------------------------------------------------------
local config =
{
    https_success  = 200;
    root_tags_url = 'https://www.linux.org.ru/tags/';
    tags_url_list = {}; -- ссылки на группы тегов
    tags_tag_list = {}; -- все теги из групп тегов
    tags_dup_list = {}; -- все дублирующиеся теги
}
----------------------------------------------------------------------------
-- Поиск явных дубликатов тегов
----------------------------------------------------------------------------
local function is_duplicate(tag_a,tag_b)
      -- игнорируем полный дубликат
      if tag_a == tag_b then return false end
      -- исключить ложные срабатывания на 4.2 и 42 и подобного
      if (#tag_a <= 3 and tag_a:find('.',1,true)) or
         (#tag_b <= 3 and tag_b:find('.',1,true)) then
         return false;
      end
      -- исключить варианты с -42 и 42
      if (tag_a:sub(1,1) == '-' or tag_b:sub(1,1) == '-') and
         (tag_a:gsub('%-','') == tag_b:gsub('%-','')) then
         return false;
      end
      -- одинаковые теги различающиеся только разделителем
      if (tag_a:gsub('%.','') == tag_b:gsub('%.','')) then return true end;
      if (tag_a:gsub('-' ,'') == tag_b:gsub('-' ,'')) then return true end;
      if (tag_a:gsub(' ' ,'') == tag_b:gsub(' ' ,'')) then return true end;
      return false
end
----------------------------------------------------------------------------
-- Закодировать в hex (URL кодирование )
----------------------------------------------------------------------------
function encode_percent(raw_text)
    local encoded = '';
    for i=1,#raw_text do
        -- лор кидает 500 на "%2E"
        if raw_text:sub(i,i) == '.' then
           encoded = encoded .. '.';
        else
           encoded = encoded .."%".. string.format("%X",raw_text:byte(i))
        end
    end
    return encoded
end
----------------------------------------------------------------------------
-- Декодировать из hex (URL кодирование )
----------------------------------------------------------------------------
local function decode_percent(encoded_text)
    local out = encoded_text;
    if not encoded_text:find('%',1,true) then
       return out;
    end
    for symbol_code in encoded_text:gmatch('(%%%w%w)') do
        local hex_code = symbol_code:gsub('%%','');
        if type(tonumber('0x'..hex_code)) == 'number' then
           out = out:gsub('%'..symbol_code,string.char('0x'..hex_code))
        end
    end
    return out;
end
----------------------------------------------------------------------------
-- Получить HTML страничку
----------------------------------------------------------------------------
local function get_page(url)
    local page,code,headers,status = https.request(url);
    if code == config.https_success then
        return page;
    end
    return ''
end
----------------------------------------------------------------------------
-- Получить ссылки на группы тегов с главной тегов
----------------------------------------------------------------------------
for tag_group in get_page(config.root_tags_url):gmatch('"/tags/(%S+)"') do
    if tag_group ~= ' ' and tag_group ~= '.' then
       table.insert(config.tags_url_list,config.root_tags_url..encode_percent(tag_group));
    end
end
----------------------------------------------------------------------------
-- Извлечь сами теги из групп тегов
----------------------------------------------------------------------------
for id, tag_group_url in pairs(config.tags_url_list) do
    io.write('[Получение тегов из]: '..decode_percent(tag_group_url))
    local cnt = 0;
    for tag in get_page(tag_group_url):gmatch('"/tag/(%S+)"') do
        table.insert(config.tags_tag_list,decode_percent(tag));
        cnt = cnt + 1;
    end
    print(' ['..cnt..']');
end
print('[Всего тегов на LOR]: '..#config.tags_tag_list)
----------------------------------------------------------------------------
-- Сохранить список тегов как есть в файл и сразу выйти
----------------------------------------------------------------------------
local file_id   = nil;
local tags_file = nil;
for idx,val in ipairs({...}) do
    if val == '--tags' then file_id = idx+1; break; end
end
if file_id and arg[file_id] then
   print("[сохранение списка тегов]: "..arg[file_id])
   tags_file = io.open(arg[file_id],'w');
   assert(tags_file,'Ошибка открытия файла для сохранения списка всех тегов')
   for _,tag in ipairs(config.tags_tag_list) do
       tags_file:write(tag..'\n')
   end
   tags_file:close();
   print("[Сохранено тегов]: "..#config.tags_tag_list)
   print("[Выход]")
   os.exit(0)
end
----------------------------------------------------------------------------
-- Обойти теги и найти дубликаты
----------------------------------------------------------------------------
io.stdout:setvbuf('no')
local back_cnt = #config.tags_tag_list
for id_a,tag_a in pairs(config.tags_tag_list) do
    io.write('[Поиск дубликатов  ]: '..id_a..'\r')
    for id_b,tag_b in pairs(config.tags_tag_list) do
        if is_duplicate(tag_a,tag_b) then
           if config.tags_dup_list[tag_b] then
              for _,duptag in ipairs(config.tags_dup_list[tag_b]) do
                  if tag_a == duptag then
                     goto skip_tag;
                  end
              end
           end
           if not config.tags_dup_list[tag_a] then
              config.tags_dup_list[tag_a]={};
              table.insert(config.tags_dup_list[tag_a],tag_a);
           end
           table.insert(config.tags_dup_list[tag_a],tag_b);
        end
    end
    ::skip_tag::
    back_cnt = back_cnt - 1;
end
print(('-'):rep(21));
----------------------------------------------------------------------------
-- Вывести результат поиска дубликатов в виде 'тег1, тег2, тег3' и т.д.
----------------------------------------------------------------------------
local dup_file = nil;
local file_id  = nil;
for idx,val in ipairs({...}) do
    if val == '--dups' then file_id = idx+1; break; end
end
if file_id and arg[file_id ]then
   dup_file = io.open(arg[file_id],'w');
   assert(dup_file,'Ошибка открытия файла для сохранения списка дубликатов')
   print("[Сохранение дубликатов]: "..arg[file_id]..'\n')
end
for tag, duplicats in pairs(config.tags_dup_list) do
    for id,duplicat in ipairs(duplicats) do
        io.write(duplicat..',');
        if dup_file then dup_file:write(duplicat,', '); end
    end
    if dup_file then dup_file:write('\n'); end
    io.write('\n');
end
----------------------------------------------------------------------------

А более сложные варианты apple и яблоко или тян и девушка и girl уже глазками и ручками.

LINUX-ORG-RU ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.