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

Z Wikisłownika – wolnego słownika wielojęzycznego
[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
wyzeruj licznik znaczen, jezeli danego jezyka nie ma w statystyka/dane (przypadek j. prasemickiego)
m propcount
(Nie pokazano 1 pośredniej wersji utworzonej przez tego samego użytkownika)
Linia 32: Linia 32:
elseif prop == 'meanings' then
elseif prop == 'meanings' then
propcount = options.z or 0
propcount = options.z or 0
if ( tostring( propcount ):find( '.', 0, true ) ) or propcount == 1 then
local pagecount = pagesInCategory( langname .. ' (indeks)', 'pages' )
propcount = propcount * pagecount
end
if op then
if op then
Linia 123: Linia 128:
local mcount = conf.z or 0
local mcount = conf.z or 0
if ( tostring( mcount ):find( '.', 0, true ) ) or mcount == 1 then
mcount = mcount * pagecount
end
mcounter = mcounter + mcount
mcounter = mcounter + mcount

Wersja z 03:24, 20 lut 2015

[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 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
		
	for position, langdata in ipairs( langs ) do
		local langname = langdata[ 1 ]
		local options  = langdata[ 2 ] or {}
		local propcount
		
		if prop == 'terms' then
			propcount = pagesInCategory( langname .. ' (' .. op .. ')', 'pages' )
			
			if not options.x then
				count = count + propcount
			end
		elseif prop == 'meanings' then
			propcount = options.z or 0
			
			if ( tostring( propcount ):find( '.', 0, true ) ) or propcount == 1 then
				local pagecount = pagesInCategory( langname .. ' (indeks)', 'pages' )
				propcount = propcount * pagecount
			end
			
			if op then
				if op == langname then
					return propcount
				else
					count = 0
				end
			else
				count = count + propcount
			end
		end
		
		if callback then
			callback{ position, langname, options, propcount }
		end
	end
	
	return count
end

p.WS_STAT = function( frame )
	local tcounter = 0
	local mcounter = 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 = {
			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.hbar:tag( 'div' ):css{
				[ 'width' ]            = ( pagecount / 150 ) .. 'px',
				[ 'background-color' ] = 'maroon'
			}
			:wikitext( '&nbsp;' )
	
		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
		
		if ( tostring( mcount ):find( '.', 0, true ) ) or mcount == 1 then
			mcount = mcount * pagecount
		end
		
		mcounter = mcounter + mcount
		
		columns.mcount:attr( 'align', 'right' )
			:wikitext( mcount > 999
				and formatNum( mcount )
				or  mcount
			)
		
		return columns
	end
	
	table.sort( langs, function( a, b )
			return a[ 1 ] < b[ 1 ]
		end )
	
	local header = mw.html.create( 'tr' )
	
	header:tag( 'th' ):css( 'text-align', 'center' ):wikitext( 'język' )
	header:tag( 'th' ):css( 'border-right-style', 'hidden' )
	header:tag( 'th' ):addClass( 'unsortable' ):wikitext( 'licznik&nbsp;haseł' )
	header:tag( 'th' ):css{
			[ 'width' ]             = '100px',
			[ 'white-space' ]       = 'nowrap',
			[ 'border-left-style' ] = 'hidden'
		}
	header:tag( 'th' ):css( 'white-space', 'nowrap' ):wikitext( 'licznik&nbsp;znaczeń' )
			:tag( 'small' ):wikitext(
				frame:extensionTag( 'ref', references[ 'licznikZnaczeń' ], { name = 'licznikZnaczeń' } )
			)
	
	local contents = mw.html.create( '' )
	local rows = {}
	
	tcounter = traverseIndexes( 'terms', 'indeks', function( args )
			table.insert( rows, makeRow( unpack( args ) ) )
		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 )
			: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'
		}
		: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