wcmc-its / reciter Goto Github PK
View Code? Open in Web Editor NEWReCiter: an enterprise open source author disambiguation system for academic institutions
License: Apache License 2.0
ReCiter: an enterprise open source author disambiguation system for academic institutions
License: Apache License 2.0
*** Scroll down for a description of this project ***
Delimited name variant list for full-time WCMC faculty will be based on name variants in WCMC systems of record. This list is in the table RC_identity_directory.
e.g. limit by top 5 most frequent words in their affiliation
see notes from meeting on 2-25-15 at #error
In phase 2 matching ReCiter selects one or more piles, and the resulting set of articles constitute ReCiter's final determination as to the articles that were written by the target author. In some cases ReCiter fails to include a pile that should be selected for a target author, resulting in errors of omission and reduced recall. One piece of evidence that ReCiter can use to make better decisions in phase 2 matching is co-authorship on grants. To be specific, if a given pile of articles includes a name that matches that of a person who has previously served as a co-author with the target author on a grant, this should increase the likelihood that the articles in the given pile were in fact written by the target author.
One example where this should work:
For every given CWID and PMID combination where a suggestion is positive or a user has provided feedback.
An integer that can be used to sort suggestions in the web interface.
+10 for email match
+2 for full exact name match (firstName, middle initial, lastName)
+1 for abbreviated name match (firstInitial, middle initial, lastName)
+1 for every other type of evidence... Count each instance of department, institutional affiliation, common collaborator, known relationship, etc. separately as an additional point.
This article was suggested for the following reasons:
The name [John Smith] is similar or identical to an author of this article: {J. S. Smith}.
[John Smith] is associated with: {Curt Cole (as a co-investigator)}.
-OR, if two relationships-
[John Smith] is associated with: {Charles Smith (as a co-investigator)} and {Rainu Kaushal (as a mentor/mentee)}.
-OR, if three or more relationships--
[John Smith] is associated with: {Curtis Cole (as a co-investigator)}, {Rainu Kaushal (as a mentor/mentee)}, and {J. Schmitz (as a person in the same organizational unit)}.
The affiliation of the matching author in the article is {affiliation string}. This is consistent with the following:
[John Smith] is listed on grant #[grantNumber], which matches a grant number listed in the article record: {funding statement in article}.
The article was published in {pubYear}, which is [#] years [before/after] [John Smith] received Bachelor's degree and [#] years [before/after] receiving a terminal degree.
The article was selected because it has the following in common with certain selected articles:
Currently, ReCiter only runs if users have a password to an internal WCMC database. We need to update the documentation at README.md with separate installation instructions for people internal to CUMC and external developers; and make any needed changes to the ReCiter code base so that ReCiter can be generalized to run outside of WCMC.
ReCiter output is currently written to a series of .csv files, one for each target author. The goal of this project is to write ReCiter output data to the ReCiter database (in addition to the .csv files). The table name is rc_results and the column headers are identical to the column headers in the .csv output files (current as of the 7-15-15 versions of the .csv files).
Please note: As mentioned above, writing output to the database is to be added as a secondary default behavior -- we wish to maintain ReCiter's current default behavior of writing the .csv output files (at least for now) because the files in effect filter the results and can be used in a nimble fashion for error analysis.
Author name disambiguation is a complex challenge in informatics and computer science. Every disambiguation system makes mistakes, and ReCiter is no exception -- we know that ReCiter sometimes does not properly assign articles to target authors. However, as of April 2015 we do not have a sufficiently detailed accounting of the reasons for the errors. A thorough, exhaustive, and iterative error analysis is needed, and we expect that in many cases the results will inform modifications to the system that will improve performance. Additional detail is available on the Wiki at https://github.com/wcmc-its/ReCiter/wiki/Error-Analysis
e.g. a script that allows Prakash to run a shell script from the server, or whatever format required by web developer
Given a list of known publications for a given author, determine the author's institutional affiliation at the time each article was published. Add the prior institutional affiliations and years to the database.
Example:
<author>
<author-url>http://api.elsevier.com/content/author/author_id:7005295324</author-url>
<authid>7005295324</authid>
<authname>Kaushal,R.</authname>
<surname>Kaushal</surname>
<given-name>Rainu</given-name>
<initials>R.</initials>
<afid>60007997</afid>
<afid>60007997</afid>
<afid>60007997</afid>
<afid>60018043</afid>
<afid>112593445</afid>
<afid>60007997</afid>
</author>
<affiliation>
<affiliation-url>http://api.elsevier.com/content/affiliation/affiliation_id:60007997</affiliation-url>
<afid>60007997</afid>
<affilname>Weill Cornell Medical College</affilname>
<name-variant>Weill Cornell Medical College</name-variant>
<name-variant>Weill Medical College of Cornell University</name-variant>
<name-variant>Cornell University</name-variant>
<name-variant>Cornell University Medical College</name-variant>
<affiliation-city>New York</affiliation-city>
<affiliation-country>United States</affiliation-country>
</affiliation>
Currently in ReCiter - Code Documentation at https://nexus.med.cornell.edu/display/vivo/ReCiter+-+Code+Documentation
Will be moved to this repo
Is a Phase One clustering improvement.
Jie added a parameter to config.properties
Prakash assigned
Notify Michael when this is ready so that he can begin error analysis
Background:
Phase One clustering:
Phase Two matching:
Possible approaches include:
Example:
Background: Paul downloaded five years of Medline records and their associated MeSH terms. Then, using Jie's workflow for the grant recommendation tool project, Paul calculated the "field scores" for each journal. Then, Paul used some basic (non-rigorous) arithmetic to calculate similarity between journals such that any two journals that had at least one MeSH term in the past five years (n = 2300) have a similarity score relative to each other.
Understanding the scores:
How can this be used?
I will provide a link to the similarity file (300 MB) outside of Git Hub.
Jie assessing the use of random forest classifier for this purpose (this issue previously pertained to phase two matching)
Primary and other department for WCMC faculty are available in the reciter_pubs database, available for download via Downloads and additional documentation.
Related to #79.
A data file (e.g., CSV or other common format) in which each row is an article. The first row has field names, which pertain to the following:
-All available article metadata, including title, author names, affiliations, etc., in separate fields
-Which cluster the article was assigned to
-An indication of the order in which the cluster was created as ReCiter ran down through the list of articles. (This could be accomplished by assigning an integer to the clusters, which corresponds to the order in which they were created; maybe you already have this in the code.)
-Evidence ReCiter used when assigning the article to the cluster, if applicable
-Indication of whether the assigned cluster was correct based on reference standard, if applicable
-Other data you think could be useful in examining the output in detail, if any
When matching a cluster to a person in Phase Two, include the matching score. This will allow us to see how certain the match is.
Implement code to accomplish the following: Given a list of known publications for a given author, determine the author's institutional affiliation at the time each article was published. Add the prior institutional affiliations and years to the database.
With this scoring strategy, we're trying to account for the extent to which affiliation of all authors affects the likelihood a given targetAuthor authored an article.
To do this, we need to ask and answer several questions.
There are currently 276,666 institutions in the Identity table, which represents 3,861 unique institutions. This comes from several sources, which use a controlled vocabulary.
We've looked up the Scopus Institution ID for the 1,786 institutions that are most often cited as being a current or historical affiliation. This collectively represents 273,006 affiliations. In other words, ~99% of the time we can predict what the Scopus Institution ID could be. Note that a given institution such as Weill Cornell might have multiple institution IDs.
targetAuthor-institutionalAffiliation-matchType-positiveMatch-individual-score: 3
targetAuthor-institutionalAffiliation-matchType-positiveMatch-institution-score: 1.5
targetAuthor-institutionalAffiliation-matchType-null-score: 0
targetAuthor-institutionalAffiliation-matchType-noMatch-score: -2
nonTargetAuthor-institutionalAffiliation-weight: 0.5
nonTargetAuthor-institutionalAffiliation-maxScore: 3
homeInstitution-scopusInstitutionIDs: 60007997, 60019868, 60000247, 60072750, 60109878
homeInstitution-keywords: weill|cornell, weill|medicine, cornell|medicine, cornell|medical, weill|medical, weill|bugando, weill|graduate, cornell|presbyterian, weill|presbyterian, 10065|cornell, 10065|presbyterian, 10021|cornell, 10021|presbyterian, weill|qatar, cornell|qatar, @med.cornell.edu, @qatar-med.cornell.edu
institutionStopwords: of, the, for, and, to
collaboratingInstitutions-scopusInstitutionIDs: 60010570, , 60025849, 60012732, 60018043, 60008981, 60022875, 60019970, 60025879, 60009343, 60009656, 60072743, 60072746, 60104769, 60012981, 60000764, 60004670, 60014933, 60022377, 60005705, 60003158, 60027954, 60003711, 60103484, 60029961, 60031841, 60005208, 60002388, 60024099, 60030304, 60029652, 60026273, 60024541, 60023247, 60007555, 60017027, 60002896, 60011605, 60027565
collaboratingInstitutions-keywords: new|york|presbyterian, HSS, hospital|special|surgery, North|Shore|hospital, Long|Island|Jewish, memorial|sloan, sloan|kettering, hamad, mount|sinai, methodist|houston, National|Institute|Mental|Health, beth israel, University|Pennsylvania|Medicine, Merck|Research, New|York|Medical|College, Medicine|Dentistry|New|Jersey, Montefiore, Lenox|Hill, Cold|Spring|Harbor, St|Luke|Roosevelt, New|York|University|Medicine, Langone, SUNY|Downstate, Albert|Einstein|Medicine, Yeshiva, UMDNJ, Icahn|Medicine, Mount|Sinai, columbia|medical, columbia|physicians
targetAuthor-institutionalAffiliation-matchType: positiveMatch-individual
targetAuthor-institutionalAffiliation-matchType: positiveMatch-institution
targetAuthor-institutionalAffiliation-matchType: null
targetAuthor-institutionalAffiliation-matchType: noMatch
targetAuthor-institutionalAffiliation-source: Scopus
targetAuthor-institutionalAffiliation-source: PubMed
nonTargetAuthor-institutionalAffiliation-source: Scopus
nonTargetAuthor-institutionalAffiliation-source: PubMed
targetAuthorAffiliation
Scopus
1
targetAuthor-institutionalAffiliation-matchType: positiveMatch-individual
targetAuthor-institutionalAffiliation-identity: "Weill Graduate School of Medical Sciences of Cornell University"
targetAuthor-institutionalAffiliation-source: Scopus
targetAuthor-institutionalAffiliation-article-scopusLabel: "Weill Cornell Medicine"
targetAuthor-institutionalAffiliation-article-scopusAffiliationID: "60007997"
targetAuthor-institutionalAffiliation-matchType-positiveMatch-individual-score: 3
2
targetAuthor-institutionalAffiliation-matchType: positiveMatch-institution
targetAuthor-institutionalAffiliation-source: Scopus
targetAuthor-institutionalAffiliation-identity: "Hospital for Special Surgery"
targetAuthor-institutionalAffiliation-article-scopusLabel: "Hospital for Special Surgery"
targetAuthor-institutionalAffiliation-article-scopusAffiliationID: "61492421"
targetAuthor-institutionalAffiliation-matchType-positiveMatch-individual-score: 1.5
3
targetAuthor-institutionalAffiliation-matchType: noMatch
targetAuthor-institutionalAffiliation-source: Scopus
targetAuthor-institutionalAffiliation-article-scopusLabel: "University of Adelaide"
targetAuthor-institutionalAffiliation-article-scopusAffiliationID: "6999421"
targetAuthor-institutionalAffiliation-matchType-noMatch-individual-score: -2
etc...
PubMed
targetAuthor-institutionalAffiliation-article-pubmedLabel: "Weill Cornell Medicine, New York, NY 10065"
Notes:
targetAuthorAffiliation
Scopus
1
targetAuthor-institutionalAffiliation-matchType: positiveMatch-individual
targetAuthor-institutionalAffiliation-identity: "Weill Graduate School of Medical Sciences of Cornell University"
targetAuthor-institutionalAffiliation-source: Scopus
targetAuthor-institutionalAffiliation-article-scopusLabel: "Weill Cornell Medicine"
targetAuthor-institutionalAffiliation-article-scopusAffiliationID: "60007997"
targetAuthor-institutionalAffiliation-matchType-positiveMatch-individual-score: 3
2
targetAuthor-institutionalAffiliation-matchType: noMatch
targetAuthor-institutionalAffiliation-source: Scopus
targetAuthor-institutionalAffiliation-article-scopusLabel: "University of Adelaide"
targetAuthor-institutionalAffiliation-article-scopusAffiliationID: "6999421"
targetAuthor-institutionalAffiliation-matchType-noMatch-individual-score: -2
targetAuthorAffiliation
PubMed
targetAuthor-institutionalAffiliation-source: PubMed
targetAuthor-institutionalAffiliation-article-pubmedLabel: "Weill Cornell Graduate School of Medical Sciences, New York, New York, USA."
targetAuthor-institutionalAffiliation-identity: "Weill Graduate School of Medical Sciences of Cornell University" /* example */
targetAuthor-institutionalAffiliation-matchType: positiveMatch-individual
targetAuthor-institutionalAffiliation-matchType-positiveMatch-individual-score: 2
nonTargetAuthorAffiliation
Scopus
nonTargetAuthor-institutionalAffiliation-source: Scopus
nonTargetAuthor-institutionalAffiliation-match-knownInstitution: Weill Cornell Medicine, 60007997, 3
nonTargetAuthor-institutionalAffiliation-match-knownInstitution: Weill Graduate School of Medical Sciences, 60000247, 2
nonTargetAuthor-institutionalAffiliation-match-CollaboratingInstitution: Methodist Hospital System, 60008981, 2
nonTargetAuthor-institutionalAffiliation-match-CollaboratingInstitution: The Burke Medical Research Institute, 60022377, 1
nonTargetAuthor-institutionalAffiliation-match-CollaboratingInstitution: The Burke Rehabilitation Hospital, 60005705, 1
nonTargetAuthor-institutionalAffiliation-matchType-match-score: 2.4 /* example */
Notes:
We don't consider this case.
We generally prefer to use Scopus if it's available. If it's not, we still need to provide the option to use PubMed alone.
targetAuthor-institutionalAffiliation-matchType: null
targetAuthor-institutionalAffiliation-matchType-null-score: 0
homeInstitution-scopusInstitutionIDs
from application.properties.Weill Graduate School of Medical Sciences of Cornell University
returns: "afids": [
"60007997",
"60019868",
"60000247",
"60072750",
"60026978",
"60025849",
"105533257"
]
If there's a positive match between article and identity, output the following:
targetAuthor-institutionalAffiliation-source: Scopus
For EACH positive match between article and identity, output the following:
targetAuthor-institutionalAffiliation-identity: "Weill Graduate School of Medical Sciences of Cornell University" /* example */
targetAuthor-institutionalAffiliation-article-scopusLabel: "Weill Cornell Graduate School of Medical Sciences" /* example */
targetAuthor-institutionalAffiliation-article-scopusAffiliationID: "60007997" /* example */
targetAuthor-institutionalAffiliation-matchType: positiveMatch-individual
targetAuthor-institutionalAffiliation-matchType-positiveMatch-individual-score: 2
/* value stored in application.properties */
If match, go to 7.
If no match, go to 5.
If there's any one positive match between article and identity, output the following for all matches:
targetAuthor-institutionalAffiliation-source: Scopus
targetAuthor-institutionalAffiliation-matchType: positiveMatch-institution
targetAuthor-institutionalAffiliation-matchType-positiveMatch-institution-score: 1
/* value stored in application.properties */
targetAuthor-institutionalAffiliation-article-scopusLabel: "Hospital for Special Surgery" /* example */
targetAuthor-institutionalAffiliation-article-scopusAffiliationID: "61492421" /* example */
While there can be multiple matches, the maximum score returned for this type of match should be 1.
If no match, go to 6.
targetAuthor-institutionalAffiliation-source: Scopus
targetAuthor-institutionalAffiliation-article-scopusLabel: "Hospital for Sick Children" /* example */
targetAuthor-institutionalAffiliation-matchType: noMatch
targetAuthor-institutionalAffiliation-matchType-noMatch-score: -2 /* value stored in application.properties */
Test case: meb7002 and 22667600
Go to 7.
targetAuthor-institutionalAffiliation-article-pubmedLabel: "Weill Cornell Medicine, New York, NY 10065"
Get list of stopwords from institution-Stopwords
field in application.properties.
Remove stopwords, commas, and dashes from article.affiliation and identity.institutions.
Ignore any words inside parentheses. These are typically countries and are not included in affiliation statements.
Here's how we do this match. Grab each affiliation and see if all the keywords are represented in a single affiliation. For example, suppose an author has a known affiliation in identity.institutions of "Weill Cornell Medical College". And, suppose the article affiliation is "Department of Pharmacology, Medical College of Weill Cornell." This would be a match because all the words in the identity affiliation are represented in the article affiliation.
If there's a match, output the following:
targetAuthor-institutionalAffiliation-source: PubMed
targetAuthor-institutionalAffiliation-article-pubmedLabel: "Weill Cornell Graduate School of Medical Sciences, New York, New York, USA." /* example */
targetAuthor-institutionalAffiliation-identity: "Weill Graduate School of Medical Sciences of Cornell University" /* example */
targetAuthor-institutionalAffiliation-matchType: positiveMatch-individual
targetAuthor-institutionalAffiliation-matchType-positiveMatch-individual-score: 2
/* value stored in application.properties */
Maximum of one match.
If there's no match, go to 5.
Get homeInstitution-keywords from application.properties.
Look for cases where homeInstitution keywords is present in affiliation string in any order. Here's how we do this. Take any groups of terms from homeInstitution, e.g., "weill|cornell". In order for this to be a match, both terms must be present in any order, with any case.
If there's a match, output the following:
targetAuthor-institutionalAffiliation-source: PubMed
targetAuthor-institutionalAffiliation-article-pubmedLabel: "Weill Cornell Graduate School of Medical Sciences, New York, New York, USA." /* example */
targetAuthor-institutionalAffiliation-identity: "Weill Graduate School of Medical Sciences of Cornell University" /* example */
targetAuthor-institutionalAffiliation-matchType: positiveMatch-individual
targetAuthor-institutionalAffiliation-matchType-positiveMatch-individual-score: 2
homeInstitution-Label: Weill Cornell Medicine / NewYork-Presbyterian Hospital
/* value stored in application.properties */
Maximum of one match.
If there's no match, go to 6.
If there's any one positive match between article and identity, output the following for all matches:
targetAuthor-institutionalAffiliation-source: PubMed
targetAuthor-institutionalAffiliation-matchType: positiveMatch-institution
targetAuthor-institutionalAffiliation-matchType-positiveMatch-institution-score: 1
/* value stored in application.properties */
targetAuthor-institutionalAffiliation-article-pubMedLabel: "Hospital for Special Surgery, New York, NY 10021" /* example */
While there can be multiple matches, the maximum score returned for this type of match should be 1.
targetAuthor-institutionalAffiliation-matchType: positiveMatch-institution
If there's no match, go to 7.
targetAuthor-institutionalAffiliation-source: PubMed
targetAuthor-institutionalAffiliation-article-pubMedLabel: "Hospital for Sick Children, Quebec City, Quebec, Canada YRV MX1" /* example */
targetAuthor-institutionalAffiliation-matchType: noMatch
targetAuthor-institutionalAffiliation-matchType-noMatch-score: -2 /* value stored in application.properties */
We generally prefer to use Scopus if it's available. If it's not, we still need to provide the option to use PubMed alone.
nonTargetAuthor-institutionalAffiliation-matchType: null
nonTargetAuthor-institutionalAffiliation-matchType-null-score: 0
A. Create scopusIDsNonTargetAuthor-Article
.
B. Create scopusIDsNonTargetAuthor-Identity-KnownInstitutions
.
C. Create scopusIDsNonTargetAuthor-Identity-CollaboratingInstitutions
Compute the following:
countScopusIDNonTargetAuthor-Affiliations
- non-unique count of all Scopus affiliation IDs for all authorscountScopusIDsNonTargetAuthor-Article-KnownInstitution
- count of cases where affiliation ID from scopusIDsNonTargetAuthor-Article is in scopusIDsNonTargetAuthor-Identity-KnownInstitutionscountScopusIDsNonTargetAuthor-Article-CollaboratingInstitution
- count of cases where affiliation IDfrom scopusIDsNonTargetAuthor-Article is in scopusIDsNonTargetAuthor-Identity-CollaboratingInstitutionscountScopusIDsNonTargetAuthor-Article-NoMatch
- count of cases in which none of the above are trueGet nonTargetAuthor-institutionalAffiliation-collaboratingInstitution-weight
and nonTargetAuthor-institutionalAffiliation-maxScore
from application.properties.
nonTargetAuthor-institutionalAffiliation-maxScore * (countScopusIDsNonTargetAuthor-Article-KnownInstitution + (countScopusIDsNonTargetAuthor-Article-CollaboratingInstitution * nonTargetAuthor-institutionalAffiliation-collaboratingInstitution-weight )) / countScopusIDNonTargetAuthor-Affiliations
nonTargetAuthor-institutionalAffiliation-source: Scopus
nonTargetAuthor-institutionalAffiliation-matchType-match-score: 2.4 /* example */
/* Here we're outputting Scopus institution labels, identifiers, and counts for all matching institutions. */
nonTargetAuthor-institutionalAffiliation-match-knownInstitution: Weill Cornell Medicine, 60007997, 3
nonTargetAuthor-institutionalAffiliation-match-knownInstitution: Weill Graduate School of Medical Sciences, 60000247, 2
nonTargetAuthor-institutionalAffiliation-match-CollaboratingInstitution: Methodist Hospital System, 60008981, 2
nonTargetAuthor-institutionalAffiliation-match-CollaboratingInstitution: The Burke Medical Research Institute, 60022377, 1
nonTargetAuthor-institutionalAffiliation-match-CollaboratingInstitution: The Burke Rehabilitation Hospital, 60005705, 1
At this time, we're not evaluating PubMed affiliation for nonTargetAuthors.
Michael to do with Steve.
Update 3-31-15 -- Steve is preparing data set.
This is a Phase One clustering improvement.
Jie notes that he tried http://stackoverflow.com/questions/1008802/converting-symbols-accent-letters-to-english-alphabet, but doesn't seem to remove, "Grün".
Prakash assigned
Jie, if you continue to have problems with the error message I can help reach out to the support team for eFetch. -MB
Test ReCiter performance for all faculty, for the main clustering algorithm, assuming correct cluster selection.
Michael and Drew to work on this.
First use case is running ReCiter for the first time, e.g. when a new faculty member joins. Second use case is determining whether a person did in fact write a publication that has been newly identified via an institution-based search.
When retrieving xml for a given cwid, sometimes the number of publications retrieved from query is not equal to the number of publications stored on disk.
The bug can be produced by querying
which currently PubMed returns 208 number of publications. But the number of publications stored on disk is only 206.
This is likely due to the values of retstart and retmax.
Michael and Paul to work on this
a. department
b. relationships
i. PI. See PrincipalInvestigators-PhDandMDPhDstudents.xlsx (available by request from Michael Bales, [email protected])
ii. Examples of co-authors: http://www.ncbi.nlm.nih.gov/pubmed/?term=Nimer+Hatlen
c. year of terminal degree
d. clinical expertise
i. list of ID's - https://pops.weillcornell.org/providerprofiles/ids.json
ii. sample provider profile - http://pops.weillcornell.org/providerprofiles/38.json
iii. equivalent on web site - http://weillcornell.org/patmarino
e. board certifications. See BoardCertifications.xls (available by request from Michael Bales, [email protected])
f. other fields?
In phase 2 matching ReCiter selects one or more piles, and the resulting set of articles constitute ReCiter's final determination as to the articles that were written by the target author. In some cases ReCiter fails to include a pile that should be selected for a target author, resulting in errors of omission and reduced recall. One piece of evidence that ReCiter can use to make better decisions in phase 2 matching is board certification data. To be specific, based on cosine similarity, if a given pile of articles includes words that match words in one or more of the target author's board certifications, this should increase the likelihood that the articles in the given pile were in fact written by the target author.
Board certifications for WCMC available here.
Linda Vahdat (ltv2001) has a board certification in Medical Oncology. These papers, which are currently false negatives, consistently use the oncology keyword.
As ReCiter is a greedy algorithm that does agglomerative clustering, we may assume that performance will improve if we provide one or more "seed" articles that are known to have written by an author. We wish to quantify the extent to which precision and recall improve in specific cases. This project involves running ReCiter several times for a set group of authors, in each case varying the number of "seed" articles provided. The results of this study could be written up and submitted to a journal.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.