Giter VIP home page Giter VIP logo

Comments (19)

leoalenc avatar leoalenc commented on August 23, 2024 1

@heliolbs , do ponto de vista da validação de treebank de UD, pode-se escolher como sent_id qualquer string arbitrária. Apenas se exige que cada sent_id seja único. Para demonstrar que não precisamos gastar muito tempo com a numeração dos exemplos, anotei três sentenças de Studart (1926) neste commit. Veja que utilizei o número da página para construir os números. O importante é que, no caso de minidiálogo, possamos reconstruí-lo via script. Se me deparo com sentença Studart1926:3670:2:36551, automaticamente sei que existe Studart1926:3670:1:36551. 3670 é um dos minidiálogos de Studart. 3650 é outro.
Escolha as sentenças que você achar mais fáceis. Não precisamos anotar conforme a ordem com que aparecem no texto.

from nheengatu.

leoalenc avatar leoalenc commented on August 23, 2024 1

Xasika pisayé ana.

@leoalenc , de fato, pisayé consta do glossário e léxico do Yauti. Como esperado, a forma é analisada como substantivo:

>>> import Yauti
>>> Yauti.getparselist('pisayé')
[['pisayé', 'N+SG']]
>>> s='''Xasika pisayé ana.'''
>>> Yauti.pp(s)
1	Xasika	sika	VERB	V	Number=Sing|Person=1|Style=Arch|VerbForm=Fin	0	root	_	ModernForm=Asika|TokenRange=0:6
2	pisayé	pisayé	NOUN	N	Number=Sing	1	obj	_	TokenRange=7:13
3	ana	ana	PART	PFV	Aspect=Perf	1	advmod	_	SpaceAfter=No|TokenRange=14:17
4	.	.	PUNCT	PUNCT	_	1	punct	_	SpaceAfter=No|TokenRange=17:18


Também com a função parseExample o substantivo é analisado como esperado:

>>> example='''Xasika pisayé ana. (p. 36) Cheguei à meia-noite. - Xa cika peçaiê ana.'''
>>> Yauti.parseExample(example,'Studart1926',3650,2,36501)
# sent_id = Studart1926:3650:2:36501
# text = Xasika pisayé ana.
# text_eng = I arrived at midnight.
# text_por = Cheguei à meia-noite.
# text_source = p. 36
# text_orig = Xa cika peçaiê ana.
# text_annotator = Leonel Figueiredo de Alencar
1	Xasika	sika	VERB	V	Number=Sing|Person=1|Style=Arch|VerbForm=Fin	0	root	_	ModernForm=Asika|TokenRange=0:6
2	pisayé	pisayé	NOUN	N	Number=Sing	1	obj	_	TokenRange=7:13
3	ana	ana	PART	PFV	Aspect=Perf	1	advmod	_	SpaceAfter=No|TokenRange=14:17
4	.	.	PUNCT	PUNCT	_	1	punct	_	SpaceAfter=No|TokenRange=17:18

Veja que apenas incluímos número de sentença ou trecho quando existente no original. É instrutivo, a esse respeito, comparar os exemplos de Amorim e Casasnovas, por um lado, com os de Magalhães e Rodrigues, consultando tanto as obras originais quanto as sentenças das respectivas coleções no treebank. Além disso, a última casa numérica de sent_id nunca deve ser igual a de outra sentença do treebank. No caso de textos ou fragmentos contínuos, como, por exemplo, minidiálogos, incrementamos com 1 a numeração de cada segmento numa sequência.

from nheengatu.

leoalenc avatar leoalenc commented on August 23, 2024 1

@leoalenc , com relação ao minidiálogo a ser completado, disponibilizei uma anotação incompleta neste commit e no final deste comentário. Acabei não conseguindo resolver os dois seguintes problemas:

  1. Como numerar duas sentenças em nheengatu que Studart (1926) aponta como alternativas à resposta de uma pergunta?

@heliolbs , você tem um exemplo concreto disso? Se a pergunta de um texto ou fragmento 489 tem como três casas numéricas, por exemplo, 489:1:345, podemos usar 489:2-1:346 e 489:2-2:347 para as duas respostas.

from nheengatu.

leoalenc avatar leoalenc commented on August 23, 2024 1

@heliolbs , observe que o Yauti sistematicamente erra a análise de substantivos que, por constituírem expressões temporais, funcionam como obl . Dependendo da posição na sentença, o Yauti analisa esses substantivos como nsbuj ou obj. Algumas teorias sintáticas analisam esses casos em línguas como português como PPs com preposição vazia.
A propósito, seria uma ótima issue de documentação formular uma regra para orientar anotadores e revisores no tratamento desses casos. Também é um caso interessante para aprender a usar uma sintaxe de busca (query syntax) como a do Grew-match, udapi , CoNLL-U Parser etc. @heliolbs , toparia assumir esta tarefa?

from nheengatu.

leoalenc avatar leoalenc commented on August 23, 2024 1

@leoalenc , consegui fazer as funções pp() e parseExample() se comportarem como os seus snippets mostram, mas foi necessário um ajuste de minha parte no código, pois estou usando Windows. Eu havia testado as duas há pouco, e o vocábulo continuou não sendo corretamente anotado. Quando testei getparselist(), recebi isto como retorno:

>>> Yauti.getparselist('pisayé')
[['pisayé', 'None']]

Isso significava que o código estava se comportando de modo diferente mesmo o meu clone local estando atualizado com o commit atual do Yauti. Ao inspecionar, a definição dessa função, vi que ela invoca loadLexicon(), que, por sua fez, usa a função open(). Lembrei da sessão de duas horas e meia de programação em par de semanas atrás em que @juliana-gurgel me indicou ocorrências desse tipo em que era necessário inserir o parâmetro encoding=utf-8 dentro do open() para ela funcionar corretamente no Windows. Fiz isso, e funcionou. Futuramente, vou pesquisar uma solução mais definitiva para isso.

@heliolbs , não recomendo uso desse sistema operacional. Não conheço ninguém que faça pesquisa de ponta em linguística computacional e ciência da computação, especialmente NLP, que o use. A base é Linux e Unix (MAC OS é de base Unix). Mas vou incluir esse parâmetro em open. Você vai sempre se deparar com dificuldades usando Windows, nào terá pleno acesso ao vasto mundo do software livre. Muitas bibliotecas essenciais, por usarem código aberto, são incompatíveis com Windows.

from nheengatu.

leoalenc avatar leoalenc commented on August 23, 2024 1

A propósito, seria útil termos algo parecido com o Grew-Match para consultas (apenas nossas) no corpus ainda não lançado? Refiro-me a uma ferramenta interna que use a mesma sintaxe de busca do Grew-Match e um formato similar de visualização de resultados.

@heliolbs , não faz sentido reimplementar algo, sobretudo tão complexo como Grew-match. Acredito, porém, que talvez seja possível instalar uma cópia local para rodar esse sistema num treebank local. No entanto, qualquer busca pode ser feita com udapi, CoNLL-U Parser etc. Ver página de UD com links para tools.

from nheengatu.

leoalenc avatar leoalenc commented on August 23, 2024 1

@heliolbs , executei o validador sobre as sentenças do seu arquivo conllu deste commit. Veja os erros gerados abaixo. É uma excelente oportunidade de aprendizado interpretar essas mensagens de erro e resolvê-las. Qualquer dúvida, acho que @dominickmaia e @juliana-gurgel poderão ajud-alo.

python3 validate.py --lang=yrl --max-err=0 ~/helio/nheengatu/corpus/studart-1926/studart1926.conllu 
[Line 85 Sent Studart1926:3650:2-2:36502]: [L1 Format word-id-sequence] Words do not form a sequence. Got '1,2,2,3'. Expected '1,2,3,4'.
[Line 87 Sent Studart1926:3650:2-2:36502]: [L2 Metadata text-form-mismatch] Mismatch between the text attribute and the FORM field. Form[2] is 'ramé' but text is '....'
[Line 85 Sent Studart1926:3650:2-2:36502]: [L2 Format skipped-corrupt-tree] Skipping annotation tests because of corrupt tree structure.
[Line 102 Sent Studart1926:3660:1:36530]: [L2 Morpho invalid-upos] Invalid UPOS value '_'.
[Line 102 Sent Studart1926:3660:1:36530]: [L2 Syntax invalid-deprel] Invalid DEPREL value '_'.
[Line 102 Sent Studart1926:3660:1:36530]: [L2 Morpho unknown-upos] Unknown UPOS tag: '_'.
[Line 102 Sent Studart1926:3660:1:36530]: [L4 Syntax unknown-deprel] Unknown DEPREL label: '_'

The following 40 relations are currently permitted in language [yrl]:
acl, acl:relcl, advcl, advcl:relcl, advmod, amod, appos, aux, case, cc, ccomp, clf, compound, conj, cop, csubj, dep, det, discourse, dislocated, expl, fixed, flat, goeswith, iobj, list, mark, nmod, nmod:poss, nsubj, nummod, obj, obl, orphan, parataxis, punct, reparandum, root, vocative, xcomp
If a language needs a relation subtype that is not documented in the universal guidelines, the relation
must have a language-specific documentation page in a prescribed format.
See https://universaldependencies.org/contributing_language_specific.html for further guidelines.
Documented dependency relations can be specifically turned on/off for each language in which they are used.
See https://quest.ms.mff.cuni.cz/udvalidator/cgi-bin/unidep/langspec/specify_deprel.pl for details.

[Line 117 Sent Studart1926:3660:2:36531]: [L1 Format missing-empty-line] Missing empty line after the last sentence.
Format errors: 3
Metadata errors: 1
Morpho errors: 2
Syntax errors: 2
*** FAILED *** with 8 errors

from nheengatu.

leoalenc avatar leoalenc commented on August 23, 2024 1

@heliolbs , neste commit resolvi todos os erros de validação e corrigi outros erros de anotação não apontados pelo validador. É essencial verificar cada alteração do commit e procurar entender o porquê à luz do relatório acima do validador e do esquema de anotação do treebank, baseado, por sua vez, nas guidelines de UD.

from nheengatu.

leoalenc avatar leoalenc commented on August 23, 2024 1

@heliolbs , quando a sentença não forma minitexto com pelo menos uma outra sentença, as duas penúltimas casas numéricas recebem valor zero. Exemplo:

# sent_id = Studart1926:0:0:36100
# text = Maã taá reputari?
# text_eng = What you want?
# text_por = Que quer?
# text_source = p. 36
# text_orig = Ma há tá reputari?
# text_annotator = Hélio Leonam Barroso Silva
# text_orig_transcriber = Hélio Leonam Barroso Silva
# text_por_modernizer = Hélio Leonam Barroso Silva
# inputline = Maã/int taá reputari? (p. 36) Que quer? - Ma há tá reputari?
# reviewer1 = Leonel Figueiredo de Alencar
1	Maã	maã	PRON	INT	PronType=Int	3	obj	_	TokenRange=0:3
2	taá	taá	PART	CQ	PartType=Int	3	advmod	_	TokenRange=4:7
3	reputari	putari	VERB	V	Number=Sing|Person=2|VerbForm=Fin	0	root	_	SpaceAfter=No|TokenRange=8:16
4	?	?	PUNCT	PUNCT	_	3	punct	_	SpaceAfter=No|TokenRange=16:17

from nheengatu.

heliolbs avatar heliolbs commented on August 23, 2024

@leoalenc , era exatamente essa conexão que eu não estava conseguindo fazer. Achei, erroneamente, que era necessário manter esse paralelismo sequencial entre os valores das sent_id e a ordem de ocorrência dos exemplos nas obras. Por isso, eu estava demorando tanto para começar a anotá-las: queria um jeito de evitar ter de corrigir esses valores de acordo com o que decidíssimos incluir ou não no treebank. Anotarei as sentenças amanhã sem falta.

from nheengatu.

heliolbs avatar heliolbs commented on August 23, 2024

@leoalenc , com relação ao minidiálogo a ser completado, disponibilizei uma anotação incompleta neste commit e no final deste comentário. Acabei não conseguindo resolver os dois seguintes problemas:

  1. Como numerar duas sentenças em nheengatu que Studart (1926) aponta como alternativas à resposta de uma pergunta?
  2. Por que a função parseExample não atribui corretamente a etiqueta à palavra pisayé mesmo ela estando presente no léxico do Yauti? Tentei sufixar "/n" ao token "pisayé", mas não surtiu efeito.

(Amanhã retomo essa issue.)

# sent_id = Studart1926:3650:2:36500
# text = Xasika pisayé ana.
# text_eng = I arrived at midnight.
# text_por = Cheguei à meia-noite.
# text_por_orig = Cheguei á meia noite.
# text_source = p. 36, No. 36500
# text_orig = Xa cika peçaiê ana.
# text_annotator = Hélio Leonam Barroso Silva
# text_transcriber = Hélio Leonam Barroso Silva
# text_por_modernizer = Hélio Leonam Barroso Silva
# inputline = Xasika pisayé ana. (p. 36, No. 36500)  Cheguei à meia-noite. - Xa cika peçaiê ana.
1	Xasika	sika	VERB	V	Number=Sing|Person=1|Style=Arch|VerbForm=Fin	0	root	_	ModernForm=Asika|TokenRange=0:6
2	pisayé	pisayé	_	_	_	1	_	_	TokenRange=7:13
3	ana	ana	PART	PFV	Aspect=Perf	1	advmod	_	SpaceAfter=No|TokenRange=14:17
4	.	.	PUNCT	PUNCT	_	1	punct	_	SpaceAfter=No|TokenRange=17:18

# sent_id = Studart1926:3650:3:36500
# text = Pisayé ramé.
# text_eng = I arrived at midnight.
# text_por = À meia-noite.
# text_source = p. 36, No. 36500
# text_orig = peçaiê ana.
# text_annotator = Hélio Leonam Barroso Silva
# text_transcriber = Hélio Leonam Barroso Silva
# text_por_modernizer = Hélio Leonam Barroso Silva
# inputline = Pisayé ramé. (p. 36, No. 36500) À meia-noite. - peçaiê ramé.
1	Pisayé	pisayé	_	_	_	0	_	_	TokenRange=0:6
2	ramé	ramé	_	_	_	0	_	_	SpaceAfter=No|TokenRange=7:11
3	.	.	PUNCT	PUNCT	_	1	punct	_	SpaceAfter=No|TokenRange=11:12

from nheengatu.

heliolbs avatar heliolbs commented on August 23, 2024

Xasika pisayé ana.

@leoalenc , de fato, pisayé consta do glossário e léxico do Yauti. Como esperado, a forma é analisada como substantivo:

>>> import Yauti
>>> Yauti.getparselist('pisayé')
[['pisayé', 'N+SG']]
>>> s='''Xasika pisayé ana.'''
>>> Yauti.pp(s)
[...]

Também com a função parseExample o substantivo é analisado como esperado:

>>> example='''Xasika pisayé ana. (p. 36) Cheguei à meia-noite. - Xa cika peçaiê ana.'''
>>> Yauti.parseExample(example,'Studart1926',3650,2,36501)
[...]

@leoalenc , consegui fazer as funções pp() e parseExample() se comportarem como os seus snippets mostram, mas foi necessário um ajuste de minha parte no código, pois estou usando Windows. Eu havia testado as duas há pouco, e o vocábulo continuou não sendo corretamente anotado. Quando testei getparselist(), recebi isto como retorno:

>>> Yauti.getparselist('pisayé')
[['pisayé', 'None']]

Isso significava que o código estava se comportando de modo diferente mesmo o meu clone local estando atualizado com o commit atual do Yauti. Ao inspecionar, a definição dessa função, vi que ela invoca loadLexicon(), que, por sua fez, usa a função open(). Lembrei da sessão de duas horas e meia de programação em par de semanas atrás em que @juliana-gurgel me indicou ocorrências desse tipo em que era necessário inserir o parâmetro encoding=utf-8 dentro do open() para ela funcionar corretamente no Windows. Fiz isso, e funcionou. Futuramente, vou pesquisar uma solução mais definitiva para isso.

Veja que apenas incluímos número de sentença ou trecho quando existente no original.

Entendido 👍

É instrutivo, a esse respeito, comparar os exemplos de Amorim e Casasnovas, por um lado, com os de Magalhães e Rodrigues, consultando tanto as obras originais quanto as sentenças das respectivas coleções no treebank.

Tenho feito isso e descoberto muita coisa, mas, de vez em quando, algo me escapa. Vou continuar contrastando os exemplos, pois, de fato, é o melhor modo de ir me apropriando dos processos.

Além disso, a última casa numérica de sent_id nunca deve ser igual a de outra sentença do treebank. No caso de textos ou fragmentos contínuos, como, por exemplo, minidiálogos, incrementamos com 1 a numeração de cada segmento numa sequência.

Realmente, deixei passar o incremento dessa casa numérica.

from nheengatu.

heliolbs avatar heliolbs commented on August 23, 2024

@leoalenc , com relação ao minidiálogo a ser completado, disponibilizei uma anotação incompleta neste commit e no final deste comentário. Acabei não conseguindo resolver os dois seguintes problemas:

  1. Como numerar duas sentenças em nheengatu que Studart (1926) aponta como alternativas à resposta de uma pergunta?

@heliolbs , você tem um exemplo concreto disso? Se a pergunta de um texto ou fragmento 489 tem como três casas numéricas, por exemplo, 489:1:345, podemos usar 489:2-1:346 e 489:2-2:347 para as duas respostas.

Tenho sim, @leoalenc : é exatamente a resposta à primeira das três sentenças anotadas por você nesta issue e que foram inseridas neste commit.

# sent_id = Studart1926:3650:1:36500
# text = Mairamé resika?

Studart (1926, p. 36) dá duas possíveis respostas à sentença acima (segundo travessão):

Mairamê re cika? (Quando chegaste ou a que horas chegaste?). — Xa cika peçaiê ou peçaiê ramé (Cheguei á meia noite).

from nheengatu.

heliolbs avatar heliolbs commented on August 23, 2024

@heliolbs , observe que o Yauti sistematicamente erra a análise de substantivos que, por constituírem expressões temporais, funcionam como obl . Dependendo da posição na sentença, o Yauti analisa esses substantivos como nsbuj ou obj. Algumas teorias sintáticas analisam esses casos em línguas como português como PPs com preposição vazia. A propósito, seria uma ótima issue de documentação formular uma regra para orientar anotadores e revisores no tratamento desses casos. Também é um caso interessante para aprender a usar uma sintaxe de busca (query syntax) como a do Grew-match, udapi , CoNLL-U Parser etc. @heliolbs , toparia assumir esta tarefa?

Realmente, @leoalenc , seria muito útil ter algo nesse sentido. Topo sim. Vou criar a issue e me organizar para começar a montar o texto. Com relação à sintaxe de busca do Grew-Match, eu comecei a aprendê-la meses atrás por ocasião do grupo de estudos em UD que conduzi por algumas semanas. Achei extremamente útil para buscar exemplos pras minhas demonstrações.

A propósito, seria útil termos algo parecido com o Grew-Match para consultas (apenas nossas) no corpus ainda não lançado? Refiro-me a uma ferramenta interna que use a mesma sintaxe de busca do Grew-Match e um formato similar de visualização de resultados.

from nheengatu.

heliolbs avatar heliolbs commented on August 23, 2024

@leoalenc , incluí neste commit todas as correções e recomendações apontadas nos seus comentários acima. Reproduzo abaixo o resultado:

# sent_id = Studart1926:3650:2-1:36501
# text = Xasika pisayé ana.
# text_eng = I arrived at midnight.
# text_por = Cheguei à meia-noite.
# text_por_orig = Cheguei á meia noite.
# text_source = p. 36
# text_orig = Xa cika peçaiê ana.
# text_annotator = Hélio Leonam Barroso Silva
# text_transcriber = Hélio Leonam Barroso Silva
# text_por_modernizer = Hélio Leonam Barroso Silva
# inputline = Xasika pisayé ana. (p. 36)  Cheguei à meia-noite. - Xa cika peçaiê ana.
1	Xasika	sika	VERB	V	Number=Sing|Person=1|Style=Arch|VerbForm=Fin	0	root	_	ModernForm=Asika|TokenRange=0:6
2	pisayé	pisayé	NOUN	N	Number=Sing	1	obj	_	TokenRange=7:13
3	ana	ana	PART	PFV	Aspect=Perf	1	advmod	_	SpaceAfter=No|TokenRange=14:17
4	.	.	PUNCT	PUNCT	_	1	punct	_	SpaceAfter=No|TokenRange=17:18

# sent_id = Studart1926:3650:2-2:36502
# text = Pisayé ramé.
# text_eng = At midnight.
# text_por = À meia-noite.
# text_source = p. 36
# text_orig = peçaiê ana.
# text_annotator = Hélio Leonam Barroso Silva
# text_transcriber = Hélio Leonam Barroso Silva
# text_por_modernizer = Hélio Leonam Barroso Silva
# inputline = Pisayé ramé. (p. 36) À meia-noite. - peçaiê ramé.
1	Pisayé	pisayé	NOUN	N	Number=Sing	0	root	_	TokenRange=0:6
2	ramé	ramé	ADP	ADP	AdpType=Post	1	case	_	SpaceAfter=No|TokenRange=7:11
2	ramé	ramé	SCONJ	SCONJ	_	1	mark	_	SpaceAfter=No|TokenRange=7:11
3	.	.	PUNCT	PUNCT	_	1	punct	_	SpaceAfter=No|TokenRange=11:12

from nheengatu.

heliolbs avatar heliolbs commented on August 23, 2024

@heliolbs , não recomendo uso desse sistema operacional. Não conheço ninguém que faça pesquisa de ponta em linguística computacional e ciência da computação, especialmente NLP, que o use. A base é Linux e Unix (MAC OS é de base Unix). Mas vou incluir esse parâmetro em open. Você vai sempre se deparar com dificuldades usando Windows, nào terá pleno acesso ao vasto mundo do software livre. Muitas bibliotecas essenciais, por usarem código aberto, são incompatíveis com Windows.

Entendido, @leoalenc .

from nheengatu.

heliolbs avatar heliolbs commented on August 23, 2024

A propósito, seria útil termos algo parecido com o Grew-Match para consultas (apenas nossas) no corpus ainda não lançado? Refiro-me a uma ferramenta interna que use a mesma sintaxe de busca do Grew-Match e um formato similar de visualização de resultados.

@heliolbs , não faz sentido reimplementar algo, sobretudo tão complexo como Grew-match. Acredito, porém, que talvez seja possível instalar uma cópia local para rodar esse sistema num treebank local. No entanto, qualquer busca pode ser feita com udapi, CoNLL-U Parser etc. Ver página de UD com links para tools.

Entendido, @leoalenc . Vou experimentar instalar a cópia local e continuar me aprofundando na udapi.

from nheengatu.

heliolbs avatar heliolbs commented on August 23, 2024

@leoalenc , subi há pouco este commit no meu repositório privado com a anotação das seis sentenças aleatórias de Studart (1926, p. 36) relativas à terceira tarefa do topo desta issue. As seis que escolhi foram as quatro primeiras sentenças da página e o minidiálogo (pergunta e resposta) entre os dois minidiálogos já anotados no seu commit.

As oito sentenças, cujos valores de sent_id reproduzo abaixo, se encontram em studart1926.conllu:

Studart1926:3610:1:36100
Studart1926:3611:1:36101
Studart1926:3612:1:36102
Studart1926:3613:1:36103
Studart1926:3650:2-1:36501
Studart1926:3650:2-2:36502
Studart1926:3660:1:36530
Studart1926:3660:2:36531

from nheengatu.

heliolbs avatar heliolbs commented on August 23, 2024

@heliolbs , executei o validador sobre as sentenças do seu arquivo conllu deste commit. Veja os erros gerados abaixo. É uma excelente oportunidade de aprendizado interpretar essas mensagens de erro e resolvê-las. Qualquer dúvida, acho que @dominickmaia e @juliana-gurgel poderão ajud-alo.

[...]

@heliolbs , neste commit resolvi todos os erros de validação e corrigi outros erros de anotação não apontados pelo validador. É essencial verificar cada alteração do commit e procurar entender o porquê à luz do relatório acima do validador e do esquema de anotação do treebank, baseado, por sua vez, nas guidelines de UD.

@leoalenc , para efeito de registro, documentei nessa issue uma breve análise do log do validador e uma breve análise das suas correções na comparação entre os dois últimos commits.

@heliolbs , quando a sentença não forma minitexto com pelo menos uma outra sentença, as duas penúltimas casas numéricas recebem valor zero

Entendido 👍

from nheengatu.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.