Comments (19)
@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.
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 , 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:
- 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.
@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 , consegui fazer as funções
pp()
eparseExample()
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 testeigetparselist()
, 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çãoopen()
. 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âmetroencoding=utf-8
dentro doopen()
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.
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.
@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.
@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.
@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.
@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.
@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:
- Como numerar duas sentenças em nheengatu que Studart (1926) aponta como alternativas à resposta de uma pergunta?
- 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.
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.
@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:
- 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 usar489:2-1:346
e489: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 , 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 comonsbuj
ouobj
. 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.
@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 , 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.
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.
@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 , 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)
- verbo encaixado que rege "arama" como `mark`: `ccomp` ou `advcl` do verbo regente?
- alomorfes do prefixo histórico de imperativo da segunda pessoa do singular
- como tratar o morfema "mirĩ" seguido de "etá"? HOT 3
- dúvida de tradução que surgiu durante anotação HOT 3
- adicionar palavras no glossário HOT 1
- formas de imperativo com o alomorfe "kũi" do verbo "sú" HOT 2
- tratamento de compostos do tipo de "esá-pirera-rawa (r, s)" HOT 1
- "maã": pronome relativo livre em vez de partícula de condicional HOT 1
- verificar `Mood` de `ccomp` com `Person=2`
- regente de interrogação ou exclamação de oração encaixada na função de `ccomp`
- imperativo ou indicativo com partícula de futuro?
- revisar metadados de tradução de `Casasnovas2006:7:14:14` etc.
- `StandardForm` em vez de `ModernForm` em `Rodrigues1890:1-2-5:5:5` etc.
- variante "mukirimáu" do verbo "mukirimbawa" HOT 1
- o adjetivo "santá" como advérbio em `Casasnovas2006:4:8:43` HOT 1
- sentença de Casasnovas (2006) especialmente difícil
- "asuí": `CCONJ` ou `ADV` em `Casasnovas2006:5:2:50`?
- o termo "raméwera" (Casasnovas, 2006, p. 78): como lidar com palavras desconhecidas HOT 4
- `ccomp` em vez de `xcomp` em `Casasnovas2006:5:4:52`? HOT 1
- como lidar com sintagmas que Avila (2021) trata como compostos?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from nheengatu.