Moduł:statystyka: Różnice pomiędzy wersjami

Z Wikisłownika – wolnego słownika wielojęzycznego
[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
szerokosc kolumn
m zapomnialem o jeszcze tych nawiasach
Linia 226: Linia 226:
return pagesInCategory( lang .. ' (' .. name .. ')', 'pages' )
return pagesInCategory( lang .. ' (' .. name .. ')', 'pages' )
else
else
return traverseIndexes( 'terms', name )
return ( traverseIndexes( 'terms', name ) )
end
end
end
end

Wersja z 02:25, 23 wrz 2019

[edytuj] [odśwież] Dokumentacja modułu

Użycie

Moduł obsługujący rankingi na stronie Wikisłownik:Statystyka oraz szablony liczników. Dane pochodzą ze zrzutów bazy danych ukazujących się dwa razy w miesiącu, analizowanych przez bota i kompilowanych w formacie JSON dla wykorzystania przez niniejszy moduł. Zestawienie uwzględnia wyłącznie wprowadzone języki (tj. z indeksem) z niezerową liczbą haseł w momencie wykonania zrzutu, natomiast zliczane hasła powinny być dostosowane do szablonu.

Schemat JSON

Schemat danych JSON:

  • currentDate, previousDate – odpowiednio data obecnego i poprzedniego zrzutu w formacie yyyyMMdd
  • overall – statystyki ogólne dla wszystkich języków
  • overallDiff – statystyki ogólne, porównanie względem poprzedniego zrzutu
  • languages – statystyki dla poszczególnych języków, kluczem jest nazwa krótka języka

Bot zbiera następujące informacje (dla każdego języka oraz w podsumowaniu ogólnym):

  • entries – całkowita liczba haseł
  • canonical – liczba haseł zawierających definicje
  • nonCanonical – liczba haseł zawierających formy fleksyjne
  • definitions – liczba definicji
  • withFiles – liczba haseł zawierających co najmniej jedną ilustrację pod nagłówkiem sekcji
  • withAudio – liczba haseł zawierających co najmniej jedno nagranie wymowy w polu „wymowa”
  • withReferences – liczba haseł zawierających co najmniej jeden przypis w formie <ref> gdziekolwiek w haśle oraz <references> w polu „źródła”
  • combinedLength – łączna suma długości haseł w znakach (zob. objaśnienie w WS:STAT#Długość haseł)

Jeżeli wykryje różnice względem poprzedniego zrzutu, odzwierciedla je w odpowiednich właściwościach o takiej samej nazwie z dodaniem przyrostka „Diff”. Przykładowo definitionsDiff ukazuje liczbę znaczeń dodanych lub usuniętych od poprzedniego zrzutu. Jeżeli ta liczba jest równa zeru, właściwość zostaje pominięta.

Opis funkcji

Sposób wywołania: {{#invoke:statystyka|<funkcja>|<parametry>}}.

mainRanking

Generuje tabelę z zestawieniem języków z największą liczbą haseł (WS:STAT#Języki). Dodatkowe kolumny: liczba znaczeń.

Parametry:

  • 1 (opcjonalny): liczba języków do wyświetlenia; jeżeli jest pusty, wyświetla wszystkie języki oraz podsumowanie w stopce tabeli

Przykłady:

  • {{#invoke:statystyka|mainRanking|50}} – tabela zestawiająca 50 języków z największą liczbą haseł
  • {{#invoke:statystyka|mainRanking}} – tabela zestawiająca wszystkie języki w projekce z podsumowaniem

combinedLengthRanking

Generuje tabelę z zestawieniem języków z największą sumą długości haseł (WS:STAT#Długość haseł). Dodatkowe kolumny: różnica sumy długości względem poprzedniego zrzutu, średnia długość hasła, różnica średniej długości hasła, liczba haseł.

Parametry:

  • 1 (opcjonalny): liczba języków do wyświetlenia; jeżeli jest pusty, wyświetla wszystkie języki oraz podsumowanie w stopce tabeli
  • 2 (opcjonalny): główny klucz sortowania (zob. #Schemat JSON); jeżeli dodano przyrostek Rate, kluczem będzie wynik dzielenia wskazanej właściwości (bez przyrostka) przez liczbę haseł; domyślnie suma długości haseł
  • 3 (opcjonalny): filtr minimalnej liczby haseł; domyślnie zero

Przykłady:

  • {{#invoke:statystyka|combinedLengthRanking}} – tabela zestawiająca wszystkie języki w projekcie z podsumowaniem
  • {{#invoke:statystyka|combinedLengthRanking|50}} – tabela zestawiająca 50 języków z największą sumą długości haseł
  • {{#invoke:statystyka|combinedLengthRanking|50|definitions}} – tabela zestawiająca 50 języków z największą sumą długości haseł, posortowana wg liczby znaczeń w kolejności malejącej
  • {{#invoke:statystyka|combinedLengthRanking|50|combinedLengthRate}} – tabela zestawiająca 50 języków z największą sumą długości haseł, posortowana wg średniej długości haseł w kolejności malejącej
  • {{#invoke:statystyka|combinedLengthRanking|50|combinedLengthRate|500}} – tabela zestawiająca 50 języków z największą sumą długości haseł, posortowana wg średniej długości haseł w kolejności malejącej, z ograniczeniem do języków liczących 500 haseł lub więcej

definitionsRanking

Generuje tabelę z zestawieniem języków z największą liczbą znaczeń (WS:STAT#Znaczenia). Dodatkowe kolumny: różnica liczby znaczeń względem poprzedniego zrzutu, średnia znaczeń na hasło, różnica średniej znaczeń, liczba haseł.

Parametry:

  • 1 (opcjonalny): liczba języków do wyświetlenia; jeżeli jest pusty, wyświetla wszystkie języki oraz podsumowanie w stopce tabeli
  • 2 (opcjonalny): główny klucz sortowania (zob. #Schemat JSON); jeżeli dodano przyrostek Rate, kluczem będzie wynik dzielenia wskazanej właściwości (bez przyrostka) przez liczbę haseł; domyślnie liczba znaczeń
  • 3 (opcjonalny): filtr minimalnej liczby haseł; domyślnie zero

Przykłady:

  • {{#invoke:statystyka|definitionsRanking}} – tabela zestawiająca wszystkie języki w projekcie z podsumowaniem
  • {{#invoke:statystyka|definitionsRanking|50}} – tabela zestawiająca 50 języków z największą liczbą znaczeń
  • {{#invoke:statystyka|definitionsRanking|50|combinedLength}} – tabela zestawiająca 50 języków z największą liczbą znaczeń, posortowana wg sumy długości haseł w kolejności malejącej
  • {{#invoke:statystyka|definitionsRanking|50|definitionsRate}} – tabela zestawiająca 50 języków z największą liczbą znaczeń, posortowana wg średniej liczby znaczeń na hasło w kolejności malejącej
  • {{#invoke:statystyka|definitionsRanking|50|definitionsRate|500}} – tabela zestawiająca 50 języków z największą liczbą znaczeń, posortowana wg średniej liczby znaczeń na hasło w kolejności malejącej, z ograniczeniem do języków liczących 500 haseł lub więcej

miscellaneaRanking

Generuje tabelę z zestawieniem haseł z ilustracjami, z nagraniem wymowy oraz ze źródłem dla języków z największą liczbą haseł (WS:STAT#Multimedia i źródła). Dodatkowe kolumny: stosunek haseł ze wskazaną właściwością do całkowitej liczby haseł, różnica względem poprzedniego zrzutu.

Parametry:

  • 1 (opcjonalny): liczba języków do wyświetlenia; jeżeli jest pusty, wyświetla wszystkie języki oraz podsumowanie w stopce tabeli
  • 2 (opcjonalny): główny klucz sortowania (zob. #Schemat JSON); jeżeli dodano przyrostek Rate, kluczem będzie wynik dzielenia wskazanej właściwości (bez przyrostka) przez liczbę haseł; domyślnie liczba haseł
  • 3 (opcjonalny): filtr minimalnej liczby haseł; domyślnie zero

Przykłady:

  • {{#invoke:statystyka|miscellaneaRanking}} – tabela zestawiająca wszystkie języki w projekcie z podsumowaniem
  • {{#invoke:statystyka|miscellaneaRanking|50}} – tabela zestawiająca 50 języków z największą liczbą haseł
  • {{#invoke:statystyka|miscellaneaRanking|50|definitions}} – tabela zestawiająca 50 języków z największą liczbą haseł, posortowana wg średniej liczby znaczeń w kolejności malejącej
  • {{#invoke:statystyka|miscellaneaRanking|50|definitionsRate}} – tabela zestawiająca 50 języków z największą liczbą haseł, posortowana wg średniej liczby znaczeń w kolejności malejącej
  • {{#invoke:statystyka|miscellaneaRanking|50|definitionsRate|500}} – tabela zestawiająca 50 języków z największą liczbą haseł, posortowana wg liczby znaczeń w kolejności malejącej, z ograniczeniem do języków liczących 500 haseł lub więcej

languageIndex

Generuje indeks języków na stronie głównej.

Parametry:

  • 1 (wymagany): lista najniższych niepodzielnych progów w kolejności rosnącej, oddzielonych przecinkiem; ostatnia wartość wyznacza wielokrotność kolejnych progów

Przykłady:

  • {{#invoke:statystyka|languageIndex|10000}} – grupuje języki w odstępach co 10 000 haseł
  • {{#invoke:statystyka|languageIndex|1000,2000,5000}} – generuje grupę języków z tysiącem haseł lub więcej, z dwoma tysiącami, z pięcioma tysiącami, a wyżej z wielokrotnością 5000 (ponad 10 000 haseł, ponad 15 000, ponad 20 000 itd.)

queryStorage

Wyłuskuje wartość pożądanej właściwości z tablicy danych JSON.

Parametry: zobacz #Schemat JSON.

Przykłady:

  • {{#invoke:statystyka|queryStorage|currentDate}} – data ostatniego zrzutu
  • {{#invoke:statystyka|queryStorage|overall|withReferences}} – suma wszystkich haseł z przypisami w projekcie
  • {{#invoke:statystyka|queryStorage|languages|hiszpański|withReferences}} – licznik hiszpańskich haseł z przypisami

canonicalCounter

Licznik haseł z definicją. Zwraca rozmiar kategorii [1] (indeks), jeżeli nie znaleziono wskazanego języka w tablicy danych JSON.

Parametry:

  • 1 (opcjonalny): krótka nazwa języka; jeżeli jest pusty, zwraca sumę liczników haseł dla wszystkich języków

Przykłady:

  • {{#invoke:statystyka|canonicalCounter|hiszpański}} – licznik hiszpańskich haseł z definicją
  • {{#invoke:statystyka|canonicalCounter}} – suma wszystkich haseł z definicją w projekcie

flexiveFormCounter

Licznik haseł bez definicji (jedyne znaczenia to formy fleksyjne). Zwraca rozmiar kategorii [1] (formy fleksyjne), jeżeli nie znaleziono wskazanego języka w tablicy danych JSON.

Parametry:

  • 1 (opcjonalny): krótka nazwa języka; jeżeli jest pusty, zwraca sumę liczników haseł dla wszystkich języków

Przykłady:

  • {{#invoke:statystyka|flexiveFormCounter|hiszpański}} – licznik hiszpańskich haseł bez definicji
  • {{#invoke:statystyka|flexiveFormCounter}} – suma wszystkich haseł bez definicji w projekcie

definitionCounter

Licznik znaczeń. Zwraca 0, jeżeli nie znaleziono wskazanego języka w tablicy danych JSON.

Parametry:

  • 1 (opcjonalny): krótka nazwa języka; jeżeli jest pusty, zwraca sumę liczników definicji dla wszystkich języków

Przykłady:

  • {{#invoke:statystyka|definitionCounter|hiszpański}} – licznik znaczeń w hiszpańskich hasłach
  • {{#invoke:statystyka|definitionCounter}} – suma znaczeń we wszystkich hasłach w projekcie

Zobacz też

local langs = require 'Moduł:statystyka/dane'
local bdate = langs.date or 'bd.'
local LIMIT = 495 -- było: 500

local p = {}

local pagesInCategory = mw.site.stats.pagesInCategory

-- http://lua-users.org/wiki/FormattingNumbers
local function formatNum( num )
	while true do
		num, k = string.gsub( num, "^(-?%d+)(%d%d%d)", '%1&nbsp;%2' )
		if k == 0 then break end
	end
	
	return num
end

local function traverseIndexes( prop, op, callback )
	local count = 0
	local maxterms = 0
	
	for position, langdata in ipairs( langs ) do
		local langname = langdata[ 1 ]
		local options  = langdata[ 2 ] or {}
		local propcount = 0
		
		if position > LIMIT then
			break
		end
		
		if prop == 'terms' then
			propcount = pagesInCategory( langname .. ' (' .. op .. ')', 'pages' )
			
			if not options.x then
				count = count + propcount
			end
		elseif prop == 'meanings' then
			if not op or op == langname then
				local pagecount = pagesInCategory( langname .. ' (indeks)', 'pages' )
				propcount = math.floor( ( options.z or 0 ) * pagecount )
				
				if not op then
					count = count + propcount
				else
					return propcount
				end
			else
				count = 0
			end
		end
		
		if callback then
			local terms = callback{ position, langname, options, propcount }
			
			if terms > maxterms then
				maxterms = terms
			end
		end
	end
	
	return count, maxterms
end

p.WS_STAT = function( frame )
	local tcounter = 0
	local mcounter = 0
	local maxtcount = 0
	
	local langobject = mw.language.new( 'pl' )
	
	local references = {
		[ 'licznikZnaczeń' ] = 'W jednym haśle może być więcej niż jedno znaczenie, są one oznaczane kolejnymi numerami, np. (1.1), (1.2), itd. Statystyki znaczeń są oszacowane na podstawie zrzutu bazy danych z dnia ' .. bdate .. ' (średnia liczba znaczeń na hasło z tego dnia pomnożona jest przez aktualną liczbę haseł). Pozostałe dane w tej tabeli są aktualizowane na bieżąco.',
		[ 'polski język migowy' ] = 'Wyjątkowo liczone są tu tłumaczenia na PJM – znaki migowe nie mają własnych sekcji.',
		[ 'użycie międzynarodowe' ] = 'Znaki i symbole stosowane niezależnie od języka.',
		[ 'znak chiński' ] = 'Wykorzystywane w kilku językach.'
	}
	
	local function makeRow( pos, lang, conf, pagecount )
		local columns = {
			key    = lang,
			lang   = mw.html.create( 'td' ),
			['%']  = mw.html.create( 'td' ),
			hbar   = mw.html.create( 'td' ),
			pcount = mw.html.create( 'td' ),
			mcount = mw.html.create( 'td' ),
			pagecount = pagecount
		}
		
		local langCSS = {
			[ 'background-color' ] = ( pagecount > ( conf.a or 500 ) )
				and 'yellow'
				or  conf.n
					and 'silver'
					or  nil,
			[ 'white-space' ] = 'nowrap'
		}
		
		local reference = ( conf.r or conf.r2 )
			and mw.html.create( 'small' )
				:wikitext( frame:extensionTag(
					'ref',
					references[ conf.r or conf.r2 ],
					{ name = conf.r or conf.r2 }
				) )
			or ''
		
		columns.lang:attr( 'align', 'center' ):css( langCSS )
			:tag( 'span' ):attr( 'id', 'sort name' ):css( 'display', 'none' )
				:wikitext( ( conf.s or '' ) .. lang ):done()
			:wikitext( '[[:Kategoria:' .. lang .. ' (indeks)|' .. lang .. ']]' )
			:node( conf.r and reference or '' )
			:wikitext(
				' ([[:Kategoria:' .. ( conf.w and langobject:ucfirst( lang ) or 'Język ' .. lang ) .. '|⌘]])' ..
				( conf.p
					and ' ([[:Portal:' .. langobject:ucfirst( lang ) .. '|P]])'
					or  ''
				)
			)
			
		columns['%']:attr( 'align', 'right' ):css( 'width', '30px' )
			:tag( 'span' ):attr( 'id', 'sort count' ):css( 'display', 'none' )
			:wikitext( pagecount )
		
		columns.pcount:attr( 'align', 'right' ):css( 'width', '200px' )
			:wikitext( pagecount > 999
				and formatNum( pagecount )
				or  pagecount
			)
			:node( conf.r2 and reference or '' )
		
		local mcount = ( conf.z or 0 ) * pagecount
		mcount = math.floor( mcount )
		mcounter = mcounter + mcount
		
		columns.mcount:attr( 'align', 'right' )
			:wikitext( mcount > 999
				and formatNum( mcount )
				or  mcount
			)
		
		return columns, pagecount
	end
	
	local header = mw.html.create( 'tr' )
	
	header:tag( 'th' ):css{
			[ 'text-align' ] = 'center',
			[ 'width' ]      = '10%'
		}:wikitext( 'język' )
	header:tag( 'th' ):css( 'border-right-style', 'hidden' )
	header:tag( 'th' ):addClass( 'unsortable' ):css( 'width', '66%' )
		:wikitext( 'licznik&nbsp;haseł' )
	header:tag( 'th' ):css{
			[ 'width' ]             = '10%',
			[ 'white-space' ]       = 'nowrap',
			[ 'border-left-style' ] = 'hidden'
		}
	header:tag( 'th' ):css{
			[ 'white-space' ] = 'nowrap',
			[ 'width' ]       = '10%'
		}:wikitext( 'licznik&nbsp;znaczeń' )
		:tag( 'small' ):wikitext(
			frame:extensionTag( 'ref', references[ 'licznikZnaczeń' ], { name = 'licznikZnaczeń' } )
		)
	
	local contents = mw.html.create( '' )
	local rows = {}
	
	tcounter, maxtcount = traverseIndexes( 'terms', 'indeks', function( args )
			local columns, terms = makeRow( unpack( args ) )
			table.insert( rows, columns )
			return terms
		end )
	
	table.sort( rows, function( a, b )
			return a.key < b.key
		end )
	
	for k, row in ipairs( rows ) do
		contents:tag( 'tr' )
			:node( row.lang )
			:node( row['%']:tag( 'small' ):wikitext( string.format(
					'%.3f',
					( row.pagecount / tcounter ) * 100 ) .. '%'
				):done() )
			:node( row.hbar:tag( 'div' ):css{
					[ 'width' ] = ( 100 * row.pagecount / maxtcount ) .. '%',
					[ 'background-color' ] = '#36c'
				}
				:wikitext( '&nbsp;' )
				:done() )
			:node( row.pcount )
			:node( row.mcount )
	end
	
	local footer = mw.html.create( 'tr' ):addClass( 'sortbottom' )
	
	footer:tag( 'td' ):attr( 'align', 'right' )
			:tag( 'b' ):wikitext( 'Razem:' )
	footer:tag( 'td' ):attr( 'align', 'right' )
			:tag( 'small' ):wikitext( '100%' )
	footer:tag( 'td' )
	footer:tag( 'td' ):attr( 'align', 'right' )
			:tag( 'b' ):wikitext( formatNum( tcounter ) )
	footer:tag( 'td' ):attr( 'align', 'right' )
			:tag( 'b' ):wikitext( formatNum( mcounter ) )
	
	return mw.html.create( 'table' )
		:addClass( 'wikitable sortable autonumber' )
		:css{
			[ 'margin' ]     = '0',
			[ 'text-align' ] = 'left',
			[ 'width' ]      = '100%'
		}
		:node( header )
		:node( contents )
		:node( footer )
end

p.licznik_hasel = function( frame )
	local lang = frame:getParent().args[ 1 ]
	local name = 'indeks'
	
	if lang then
		return pagesInCategory( lang .. ' (' .. name .. ')', 'pages' )
	else
		return ( traverseIndexes( 'terms', name ) )
	end
end

p.licznik_form_fleksyjnych = function( frame )
	local lang = frame:getParent().args[ 1 ]
	local name = 'formy fleksyjne'
	
	if lang then
		return pagesInCategory( lang .. ' (' .. name .. ')', 'pages' )
	else
		return ( traverseIndexes( 'terms', name ) )
	end
end

p.licznik_znaczen = function( frame )
	local lang = frame:getParent().args[ 1 ]
	return ( traverseIndexes( 'meanings', lang ) )
end

return p