Git Product home page Git Product logo

mayabot / mynlp Goto Github PK

View Code? Open in Web Editor NEW
667.0 30.0 90.0 6.79 MB

一个生产级、高性能、模块化、可扩展的中文NLP工具包。(中文分词、平均感知机、fastText、拼音、新词发现、分词纠错、BM25、人名识别、命名实体、自定义词典)

Home Page: https://mynlp.mayabot.com/

License: Apache License 2.0

Java 63.10% Kotlin 36.87% Shell 0.03%
fasttext nlp segment starspace pinyin

mynlp's People

Contributors

imgbotapp avatar jimichan avatar saberwangcn avatar xswds123 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mynlp's Issues

压缩cpp模型后,java加载模型预测出错

cpp命令行结果
image
java 预测结果
image

java的预测代码

FastText model = FastText.loadCppModel(new File("E:\\Downloads\\model.ftz"));
//        Lexer lexer =Mynlp.instance().bigramLexer();
        long start = System.currentTimeMillis();
        String [] querys = new String[]{"北京大学在哪里","白羊座","金牛座"};
        for(int i=0;i <querys.length;i++){
            List<String> strings = Arrays.asList(querys[i].split(""));
            List<ScoreLabelPair> predict = model.predict(strings,1,0);
            System.out.println(predict.toString());
        }

        long end = System.currentTimeMillis();
        System.out.println("cost time:"+(end-start));

压缩用到的命令

fasttext quantize -input train.txt -output model -qnorm -retrain -epoch 5 -cutoff 100000

想请教下大佬的问题的所在。

分词输出结果拼接后和原始句子不一致

发现有个问题:分词输出结果拼接起来和原有的输入结果不一致,我看了一下,应该是归一化导致的,比如:“今年的2019年9月13日,中秋节快乐”中的中文逗号改成了英文逗号,“出现了一大批模糊主题”中的“糊”改成了“煳”,我感觉输出原始结果比较合适,或者如果用户想使用归一化或原始的结果,能否可以通过传入参数进行限定

fasttext修改loss

在调用fasttext的时候,由于数据的不均衡,想要对loss进行改写,调用focal loss。请问有开发这个接口吗?

java项目依赖mynlp,无法调用,找不到类和方法

<dependency>
            <groupId>com.mayabot.mynlp</groupId>
            <artifactId>mynlp</artifactId>
            <version>3.2.2</version>
</dependency>

这个整合的包,无法调用fasttext包下的方法

下面这个独立的包是可以的,要如何解决啊,下面这个不更新了,有的方法没有

<dependency>
            <groupId>com.mayabot.mynlp</groupId>
            <artifactId>fastText4j</artifactId>
            <version>3.1.7</version>
</dependency>

不要再发送垃圾邮件了!

不要再发送垃圾邮件!我已经连续收到两封了,如果真的要推广,可以去技术论坛发帖,掘金、CSDN 等各种技术论坛都行。你可以把这个库的功能、实现原理、使用方法等都发一遍,感兴趣的自然会 start。发送垃圾邮件就真的过分了,直接印象减分,反而起到反作用。

训练数据加载

仅支持从文件加载训练数据吗? 有什么办法可以从内存中加载吗?
我的需求是 label内容不是固定的。
如 [__label__积极 这个 商品 很 好 用] , 后续label可能变为 [__label__积极 这个 商品 很 好 用 便宜]

build fail

More than one file was found with OS independent path 'META-INF/DEPENDENCIES'

分词器可能会将一些词前的空格和换行符划分到词中

mynlp版本:3.3.0

Java复现方法:

static void test1(){
	Lexer lexer1 = Mynlp.instance().lexerBuilder().perceptron()
					.withPersonName().keepOriCharOutput().withPos()
					.withNer().withCustomDictionary().build();
	String testText1 = """
	  公安局党委的安保维稳工作已进入了决战决胜时刻。
	  公安局党委委员率治安支队、督察支队的相关同志一行来进行专项督察。
	督察组先后深入双峰县公安检查站,部分学校、宾馆、寄递物流、汽车站等重点行业与宣传发动等各项工作落实情况。
	公安局党委委员率治安支队、督察支队的相关同志一行来进行专项督察。
	""";
	lexer1.scan(testText1);
}

结果:

[  公安局党委/nt][的/u][安保/j][维稳/nr][工作/vn][已/d][进入/v][了/u][决战/v][决胜/v][时刻/d][。/w][
  公安局党委/nt][委员/n][率/k][治安/n][支队/n][、/w][督察/v][支队/n][的/u][相关/nr][同志/n][一行/mq][来/u][进行/v][专项/b][督察/n][。/w][
督察/v][组/n][先后/d][深入/a][双峰县/ns][公安/n][检查站/n][,/w][部分/n][学校/n][、/w][宾馆/n][、/w][寄递/vn][物流/n][、/w][汽车站/n][等/u][重点/n][行业/n][与/c][宣传/v][发动/v][等/u][各项/r][工作/vn][落实/v][情况/n][。/w][
公安局党委/nt][委员/n][率/k][治安/n][支队/n][、/w][督察/v][支队/n][的/u][相关/nr][同志/n][一行/mq][来/u][进行/v][专项/b][督察/n][。/w]

注意到词[  公安局党委/nt]携带了前面的2个空格(第二个携带了一个换行符), 第三行的第一个词[督察/v]携带了一个换行符。
在分词器不使用.withNer()时,词[  公安局党委/nt]不会携带空格或换行符,但词[督察/v]依然会携带一个换行符。

fasttext支持只有正例样本的训练分类

fasttext训练时需要指定至少两个分类标签,假如我只有正例,新来的样本判断是不是该分类 能不能支持 我试了一下 发现无论输入什么 单样本的训练出来的模型 预测都是100%

文档版本未同步

Mynlp技术参考手册中的示例还是3.2.1,这边截至目前已经更新到了4.0.0,似乎已经有些使用方法失效了,例如例子:

​KeywordSummary keywordSummary = new KeywordSummary();  
keywordSummary.keyword("text",10);

#IDEA会提示 "No value passed for parameter 'lexerReader'"
#这在3.2.1版本时是正常的

初始化失败

  • java: 1.8
  • mynlp: 3.0.2

简单的创建lexer

Lexers.perceptronBuilder().withPos().withPersonName().withNer().withCustomDictionary().build()

出现异常

java.lang.RuntimeException: class java.io.File has more Constructors
	at com.mayabot.nlp.injector.TargetClassFactory.<init>(Injector.kt:139)
	at com.mayabot.nlp.injector.InjectorImpl.makeAtomBeanFactory(Injector.kt:76)
	at com.mayabot.nlp.injector.InjectorImpl.getInstance(Injector.kt:52)
	at com.mayabot.nlp.injector.InjectorImpl.getInstance(Injector.kt:26)
	at com.mayabot.nlp.injector.TargetClassFactory.create2(Injector.kt:182)
	at com.mayabot.nlp.injector.TargetClassFactory.create(Injector.kt:155)
	at com.mayabot.nlp.injector.InjectorImpl.getInstance(Injector.kt:48)
	at com.mayabot.nlp.injector.InjectorImpl.getInstance(Injector.kt:26)
	at com.mayabot.nlp.injector.TargetClassFactory.create2(Injector.kt:182)
	at com.mayabot.nlp.injector.TargetClassFactory.create(Injector.kt:148)
	at com.mayabot.nlp.injector.InjectorImpl.getInstance(Injector.kt:48)
	at com.mayabot.nlp.injector.InjectorImpl.getInstance(Injector.kt:26)
	at com.mayabot.nlp.injector.TargetClassFactory.create2(Injector.kt:182)
	at com.mayabot.nlp.injector.TargetClassFactory.create(Injector.kt:155)
	at com.mayabot.nlp.injector.InjectorImpl.getInstance(Injector.kt:48)
	at com.mayabot.nlp.injector.InjectorImpl.getInstance(Injector.kt:26)
	at com.mayabot.nlp.Mynlp.getInstance(Mynlp.java:49)
	at com.mayabot.nlp.segment.pipeline.PipelineLexerBuilder.addWordSplitAlgorithm(PipelineLexerBuilder.java:326)
	at com.mayabot.nlp.segment.lexer.perceptron.CwsLexerPlugin.install(CwsLexerPlugin.java:15)
	at com.mayabot.nlp.segment.pipeline.PipelineLexerBuilder.install(PipelineLexerBuilder.java:104)
	at com.mayabot.nlp.segment.FluentLexerBuilder$BasicBlock.cws(FluentLexerBuilder.kt:152)
	at com.mayabot.nlp.segment.Lexers.perceptronBuilder(Lexers.java:50)

请问这可能是什么原因导致的呢?

人名识别被冒号影响

在做人名识别的时候,当遇到: 这类冒号,后面的词会默认识别为人名,如 职业:软件工程师. 这类歧义有办法消除吗

请问mynlp-classification 训练时文件大小有限制?训练文本较大的时候出现Illegal Capacity: -1异常

【问题描述如下】:

使用的训练文本有356795行,有150MB,运行时候出现一下异常?

Read file build dictionary ...
Read 6M words

Number of words: 95303
Number of labels: 0
Number of wordHash2Id: 127070
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.simontuffs.onejar.Boot.run(Boot.java:340)
at com.simontuffs.onejar.Boot.main(Boot.java:166)
Caused by: java.lang.IllegalArgumentException: Illegal Capacity: -1
at java.util.ArrayList.(ArrayList.java:157)
at com.mayabot.nlp.fasttext.loss.HierarchicalSoftmaxLoss.(HierarchicalSoftmaxLoss.kt:29)
at com.mayabot.nlp.fasttext.loss.LossKt.createLoss(Loss.kt:36)
at com.mayabot.nlp.fasttext.FastText$Companion.train(FastText.kt:509)
at com.mayabot.nlp.fasttext.FastText$Companion.train(FastText.kt:481)
at com.mayabot.nlp.fasttext.FastText$Companion.trainSupervised(FastText.kt:435)
at com.mayabot.nlp.fasttext.FastText.trainSupervised(FastText.kt)

请问mynlp-classification 训练时文件大小有限制导致吗?

java: 非法字符: '\u200b'

LexerReader lexerReader = Lexers.core().reader();
KeywordSummary keywordSummary = new KeywordSummary(lexerReader);
​ List keys = keywordSummary.keyword("2001年他还在纽约医学院工作时在英国学术刊物自然上发表一篇论文",1);
if(keys!=null){
for(String key:keys){
System.out.println("key="+key);
}
}

java预测结果与python预测结果不一致

使用python训练模型,然后功过mynlp库加载模型文件xx.bin。 对同一份数据进行预测, 有7%的数据与python预测结果不一致。人工检查,发现python的分类更准确。请问是什么原因?
mynlp版本使用 3.2.2

解析人姓名问题

你好,我使用这个接口获取人名,但是还有不准确的情况
PerceptronPersonNameService pps = Mynlps.instanceOf(PerceptronPersonNameService.class);
List names= pps.findName(content);
下面是我解析出来的,这里面有比较多的不是人的姓名。我想问下这种情况需要怎么解决呢?谢谢~

[刘玄., 袁绍攻公孙瓒, 陈震传, 刘备乃, 陈登传, 宽厚弘毅, 遣钟繇, 司徒许靖, 袁绍相, 袁绍连和, 何有旦, 刘备诸葛亮, 刘禅刘永刘, 曹魏孙, 张楚政, 谥昭烈, 曹仁龟, 王聚之, 刘彭廖李刘魏杨, 子禅, 何有汉, 黄李吕马王张, 贤矣昭烈, 陈曶音笏, 杨募兵, 刘禅二子, 迁昭文, 王毌丘诸葛, 魏书七·吕布, 安平哀王, 袁公路近, 曹军奔, 董承辞, 董承受汉, 裴注, 刘辟寇, 曹公东, 张纯反, 史沛国刘岱, 刘备惠陵, 田楷东, 刘玄生, 刘永之子, 荣恩, 刘备弘毅, 张鲁遁, 刘备依庞, 刘备宽仁, 刘蒋, 屯小沛, 璋增, 刘备子, 刘永之孙, 费亭侯, 张松令法, 畏曹, 袁绍袁, 庞统进, 波谦, 刘备雄, 刘备曹操, 韩暹寇, 刘禅六子, 吴懿之妹, 绸缪恩, 竺之妹, 白璋, 张宗杨, 安平王, 刘玄德弘, 刘永异, 东海昌, 吴遣, 刘备有雄, 魏书一·武帝, 吴班击, 曹公南, 张辽进, 桑树生, 备谓瑜, 徐之, 刘备增, 刘备依, 刘备士兵, 刘备军, 刘禅三子, 陈寿赞, 袁绍抗, 伯豫君荆, 张郃相, 曹公征, 董卓趁, 刘公雄, 曹公兵, 德芳, 刘琮代立, 刘理之孙, 卢马妨, 肖国隆, 夏六月, 本璋, 魏吴, 庞统皆, 刘马陈董吕, 曹丕篡汉建, 黄家德, 马跃檀, 东海昌豨, 安平殇, 袁绍离, 曹公军, 崔高孙, 曹公果, 刘备曾孙, 曹公厚, 刘备孙子, 许汜君, 刘备因, 史田楷, 彭漾又璋, 沛时纳, 刘协刚, 黄湘阳, 白绍]

1
2

RuntimeException

java.lang.RuntimeException: java.io.IOException: Unable to create parent directories of /.mynlp.data/caches

fastText的label有上限

这是打印读取train的结果

Number of words:  2148
Number of labels: 185898
Max threshold count: 2`
Number of wordHash2Id: 250728

可看到读取上限为185898,而train中我提供的label数为1300000+,为了排除数据问题,我将原本train以150000分割为9个文件,依次进行读取测试,结果均能正常返回label读取数,基本可排除是数据文件的问题
fastText是确定的设置了这个上限吗还是文件读取量有上限?原train文件有480MB大小,分割后最大为52MB

训练出来的模型能不能整合成一个文件?

训练出来的模型有4个文件:

args.bin
dict.bin
input.matrix
output.matrix

load 模型的时候,load 的是这4个文件所在的目录,这4个文件缺一不可。这样在单机使用的情况下没什么问题。
现在我想把这个模型放到一个 Map-Reduce job 中加载,这时就需要把4个模型整合成一个文件放到 distributed cache 中。
4个文件有没有办法整合成一个文件?
谢谢。

fastText加载C原版的压缩模型后,分类出错

com.mayabot.nlp.fasttext.TestCModelFTZKt
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1569793
	at com.mayabot.nlp.fasttext.blas.QuantMatrix.addRowToVector(QuantMatrix.kt:153)
	at com.mayabot.nlp.fasttext.blas.Matrix$DefaultImpls.addRowToVector$default(Matrix.kt:24)
	at com.mayabot.nlp.fasttext.Model.computeHidden(Model.kt:31)
	at com.mayabot.nlp.fasttext.Model.predict(Model.kt:63)
	at com.mayabot.nlp.fasttext.FastText.predict(FastText.kt:78)
	at com.mayabot.nlp.fasttext.FastText.predict(FastText.kt:62)
	at com.mayabot.nlp.fasttext.TestCModelFTZKt.main(TestCModelFTZ.kt:10)
	at com.mayabot.nlp.fasttext.TestCModelFTZKt.main(TestCModelFTZ.kt)

Cannot load pre-trained word vectors

I tried to load a pre-trained word vector, but receive the following error: Caused by: java.lang.IllegalArgumentException: Unknown LossName enum second :774911284

I load the model with:
val model = FastText.loadModelFromSingleFile(File("/Users/liefra/crawl-300d-2M.vec"))

Is this an issue, or just me doing it wrong?

关于FastText的使用

我按照FastText给定的样例在做自动分类测试时在训练的时候一直在报Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/UInt的问题,请教一下这是什么原因?
工程时maven工程,在工程上增加了FastText的引用,是否还需要增加kotlin的编译?
maven部分的引用

com.mayabot.mynlp
fastText4j
3.1.0

maven部分只增加这部分内容,其他未引入?是否还需引入其他的包或者还需要配置对kotlin的依赖(编译)
测试的java代码:
public static void testClassify() throws Exception {
//数据准备
long t1=System.currentTimeMillis(), t2=0;
String rootPath= "D:\template\libsvm-3.24\datas\jingjian";
System.out.println("正在准备格式化训练集,目录"+rootPath);
File root = new File(rootPath);
StringBuilder sb= new StringBuilder();
File[] menuPaths = root.listFiles();
for (File path : menuPaths) {
if (!path.isDirectory())
continue;
// 获取分类目录下的文件
File[] trainFiles = path.listFiles();
if (trainFiles.length <= 0)
continue;
sb.append("label"+path.getName());
for(File file: trainFiles) {
String splitStr=FeatureSplitter.splitToStr(file);
if(splitStr!=null && splitStr.length()>0)
sb.append(" ").append(splitStr);
}
sb.append("\n");//一行一个目录
}
//写入文件
String trainFilename=buildFileName(rootPath,"fast_train");
t2= System.currentTimeMillis();
System.out.println("格式化训练集完成,耗时"+formatTime(t2-t1)+",写入文件"+trainFilename);
t1=t2;
writeToFile(trainFilename,sb.toString());
t2= System.currentTimeMillis();
System.out.println("训练集写入完成,耗时"+formatTime(t2-t1)+"。");
t1=t2;

	//训练
	System.out.println("开始训练");
	File trainFile = new File(trainFilename);
	InputArgs inputArgs = new InputArgs();
	inputArgs.setLoss(LossName.softmax);
	inputArgs.setLr(0.1);
	inputArgs.setDim(100);
	inputArgs.setEpoch(20);

	FastText model = FastText.trainSupervised(trainFile, inputArgs);
	
	//保存模型

// String modelFileName=buildFileName(rootPath,"fastText_model");
t2= System.currentTimeMillis();
System.out.println("训练完成,耗时"+formatTime(t2-t1)+",准备保存模型到目录"+rootPath);
t1=t2;
model.saveModel(rootPath);
t2= System.currentTimeMillis();
System.out.println("保存模型到文件,耗时"+formatTime(t2-t1)+",");
t1=t2;

	//加载模型
	System.out.println("保存完成,重新加载模型文件");
	FastText readModel= FastText.Companion.loadModel(new File(rootPath), false);
	t2= System.currentTimeMillis(); 
	System.out.println("模型加载完成,耗时"+formatTime(t2-t1)+",测试训练结果");
	String text="对于美国海军驱逐舰近日在南海的活动情况,解放军南部战区在3月11日进行了回应。南部战区新闻发言人李华敏大校表示,3月10日,美军“麦克坎贝尔”号导弹驱逐舰擅自闯入**西沙领海。**人民解放军南部战区组织海空兵力全程对其跟踪监视、查证识别,并予以警告驱离。美方打着“航行自由”的幌子,一而再、再而三地在南海秀肌肉、挑衅滋事。这是违反国际法规则的霸权行径,是威胁南海地区和平稳定的祸乱之源。**对南海诸岛及其附近海域拥有无可争辩的主权,**军队时刻保持高度戒备,采取一切必要措施,坚决捍卫国家主权安全,坚决维护南海地区和平稳定。";
	String[] sText=FeatureSplitter.splitToArray(text);
	List<ScoreLabelPair> m= readModel.predict(Arrays.asList(sText), 5, 0);
	for(ScoreLabelPair slp: m) {
		System.out.println(slp.getLabel()+"\t"+slp.getScore());
	}
}

使用感知机分词,在线学习不生效

CwsService service = Mynlps.instanceOf(CwsService.class);
service.getPerceptron().learn("待签名 字符串");
lexer.scan("这串字符串便是待签名字符串。");

打开Ner后,部分场景会出现异常

Exception in thread "main" java.lang.IllegalStateException: row: 6358 len 42 select is null
at com.mayabot.nlp.segment.wordnet.Wordpath$1.computeNext(Wordpath.java:105)
at com.mayabot.nlp.segment.wordnet.Wordpath$1.computeNext(Wordpath.java:82)
at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
at com.mayabot.nlp.segment.plugins.collector.SentenceCollector.collect(SentenceCollector.kt:28)
at com.mayabot.nlp.segment.pipeline.PipelineLexer.scan(PipelineLexer.java:136)

压缩模型是否会导致指标变差?

FastText qmodel = model.quantize(2, false, false);

我试了一下,Precision 和 Recall 比不压缩的模型都差了一点。
另外,我没有观察过,这样压缩大概能减小百分之几十的内存占用呢?

预测标签概率和不等于1?

训练数据集为正面、负面数据。但是预测数据的结果:正面的得分(概率)与负面,得分(概率)之和不等于1?请问是什么原因。难道每个标签的得分是(0,1)区间吗?
正面,[[__label__pos,0.49219814],[__label__neg,0.11921292]],RT @abc: Fireworks greet Joe Biden and Kamala Harris following Biden's acceptance of the Democratic nomination for president. … Fireworks greet Joe Biden and Kamala Harris following Biden's acceptance of the Democratic nomination for president. #DemConvention
负面,[[__label__neg,0.28777784],[__label__pos,0.09808932]],RT @American_Bridge: The people who know Donald Trump best are sounding the alarm: our country cannot survive four more years of a Trump pr… The people who know Donald Trump best are sounding the alarm: our country cannot survive four more years of a Trump presidency.In our latest ad, a former member of his inner circle & fixer — @MichaelCohen212 — has a dire warning for us all. #RNC2020

新词发现 BUG

NewWordFindEngine 类中 finishFirst() 方法里调用 topWordCounter.clean() 方法后,topWordCounter.data 里的数据有可能为空,这时候的 treeMap 为空,在接下来的初始化 DoubleArrayTrieMap 时会报错。是这个类的构造函数里对 treeMap 进行了 forEach 操作,下标越界。

使用的版本是 3.3.0

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.