GithubHelp home page GithubHelp logo

aonotas / deep-crf Goto Github PK

View Code? Open in Web Editor NEW
167.0 9.0 48.0 190 KB

An implementation of Conditional Random Fields (CRFs) with Deep Learning Method

Home Page: http://deep-crf.com

License: MIT License

Python 100.00%
crf deep-learning sequence-tagger neural-network

deep-crf's Introduction

DeepCRF: Neural Networks and CRFs for Sequence Labeling

A implementation of Conditional Random Fields (CRFs) with Deep Learning Method.

DeepCRF is a sequence labeling library that uses neural networks and CRFs in Python using Chainer, a flexible deep learning framework.

Which version of Python is supported?

  • Python 2.7
  • Python 3.4

Which version of Chainer is supported?

  • Chainer v1.24.0
  • Chainer v2.1.0

How to install?

# if you use Ubuntu
sudo apt install libhdf5-dev

git clone https://github.com/aonotas/deep-crf.git
cd deep-crf
python setup.py install

# if you want to use Chainer v1.24.0
pip install 'chainer==1.24.0'

# if you want to use Chainer v2.1.0
pip install 'chainer==2.1.0'
pip install cupy # if you want to use CUDA

How to train?

train Ma and Hovy (2016) model

$ deep-crf train input_file.txt --delimiter=' ' --dev_file input_file_dev.txt --save_dir save_model_dir --save_name bilstm-cnn-crf_adam --optimizer adam

Note that --dev_file means path of development file to use early stopping.

$ cat input_file.txt
Barack  B−PERSON 
Hussein I−PERSON 
Obama   E−PERSON
is      O 
a       O 
man     O 
.       O

Yuji   B−PERSON 
Matsumoto E−PERSON 
is     O 
a      O 
man    O 
.      O

Each line is word and gold tag. One line is represented by word [ ](space) gold tag. Note that you should put empty line (\n) between sentences. This format is called CoNLL format.

Deep BiLSTM-CNN-CRF model (three layers)

$ deep-crf train input_file.txt --delimiter=' ' --n_layer 3  --dev_file input_file_dev.txt --save_dir save_model_dir --save_name bilstm-cnn-crf_adam --optimizer adam

Deep BiLSTM-CNN-CRF model (three layers) with Multiple Input files

If input file is multiple due to large input files or many lines, please following commands. Please add this arg : --use_list_files 1

$ deep-crf train input_file_list.txt --delimiter=' ' --n_layer 3  --dev_file input_file_dev.txt --save_dir save_model_dir --save_name bilstm-cnn-crf_adam --optimizer adam --use_list_files 1
$ cat input_file_list.txt
./path_to_file/input_file_1.txt
./path_to_file/input_file_2.txt
./path_to_file/input_file_3.txt

set Pretrained Word Embeddings

$ deep-crf train input_file.txt --delimiter=' ' --n_layer 3 --word_emb_file ./glove.6B.100d.txt --word_emb_vocab_type replace_all --dev_file input_file_dev.txt

We prepare some vocab mode.

  • --word_emb_vocab_type: select from [replace_all, replace_only, additional]
  • replace_all : Replace training vocab by Glove embeddings's vocab.
  • replace_only : Replace word embedding exists in training vocab.
  • additional : Concatenate training vocab and Glove embeddings's vocab.

If you want to use word2vec embeddings, please convert Glove format.

$ head glove.6B.100d.txt
the -0.038194 -0.24487 0.72812 -0.39961 0.083172
dog -0.10767 0.11053 0.59812 -0.54361 0.67396
cat -0.33979 0.20941 0.46348 -0.64792 -0.38377
of -0.1529 -0.24279 0.89837 0.16996 0.53516
to -0.1897 0.050024 0.19084 -0.049184 -0.089737
and -0.071953 0.23127 0.023731 -0.50638 0.33923
in 0.085703 -0.22201 0.16569 0.13373 0.38239

Additional Feature Support

$ deep-crf train input_file_multi.txt --delimiter=' ' --input_idx 0,1 --output_idx 2 --dev_file input_file_dev.txt --save_dir save_model_dir --save_name bilstm-cnn-crf_adam_additional --optimizer adam
$ cat input_file_multi.txt
Barack  NN B−PERSON 
Hussein NN I−PERSON 
Obama   NN E−PERSON
is      VBZ O 
a       DT  O 
man     NN  O 
.       .   O

Yuji  NN B−PERSON 
Matsumoto NN E−PERSON 
is      VBZ O 
a       DT  O 
man     NN  O 
.       .   O

Note that --input_idx means that input features (but word feature must be 0-index) like this example.

Multi-Task Learning Support

(Now developing this multi-task learning mode...)

$ deep-crf train input_file_multi.txt --delimiter ' ' --model_name bilstm-cnn-crf --input idx 0 --output idx 1,2 

How to predict?

$ deep-crf predict input_raw_file.txt --delimiter=' ' --model_filename ./save_model_dir/bilstm-cnn-crf_adam_epoch3.model --save_dir save_model_dir --save_name bilstm-cnn-crf_adam  --predicted_output predicted.txt

Please use following format when predict.

$ cat input_raw_file.txt
Barack Hussein Obama is a man .
Yuji Matsumoto is a man .

Note that --model_filename means saved model file path. Please set same --save_name in training step.

How to predict? (Additional Feature)

$ deep-crf predict input_file_multi.txt --delimiter=' ' --input_idx 0,1 --output_idx 2 --model_filename ./save_model_dir/bilstm-cnn-crf_multi_epoch3.model --save_dir save_model_dir --save_name bilstm-cnn-crf_multi  --predicted_output predicted.txt

Note that you must prepare CoNLL format input file when you use additional feature mode in training step.

$ cat input_file_multi.txt
Barack  NN B−PERSON 
Hussein NN I−PERSON 
Obama   NN E−PERSON
is      VBZ O 
a       DT  O 
man     NN  O 
.       .   O

Yuji  NN B−PERSON 
Matsumoto NN E−PERSON 
is      VBZ O 
a       DT  O 
man     NN  O 
.       .   O

How to evaluate?

$ deep-crf eval gold.txt predicted.txt
$ head gold.txt
O
O
B-LOC
O
O

B-PERSON

How to update?

cd deep-crf
git pull
python setup.py install

Help (how to use)

deep-crf train --help

If CUDNN ERROR

if you got CUDNN ERROR, please let me know in issues.

You can cudnn-off mode with --use_cudnn=0

Features

DeepCRF provides following features.

  • Bi-LSTM / Bi-GRU / Bi-RNN
  • CNN for character-level representation
  • Pre-trained word embedding
  • Pre-trained character embedding
  • CRFs at output layer
  • CoNLL format input/output
  • Raw text data input/output
  • Training : Your variable files
  • Test : Raw text file at command-line
  • Evaluation : F-measure, Accuracy

Experiment

POS Tagging

Model Accuracy
CRFsuite 96.39
deep-crf 97.45
dos Santos and Zadrozny (2014) 97.32
Ma and Hovy (2016) 97.55

Named Entity Recognition (NER)

Model Prec. Recall F1
CRFsuite 84.43 83.60 84.01
deep-crf 90.82 91.11 90.96
Ma and Hovy (2016) 91.35 91.06 91.21

Chunking

Model Prec. Recall F1
CRFsuite 93.77 93.45 93.61
deep-crf 94.67 94.43 94.55
Huang et al. (2015) - - 94.46

deep-crf's People

Contributors

aonotas avatar massongit avatar unnonouno 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

deep-crf's Issues

--dev

what is the use of --dev?
what does early stopping mean?

ValueError: need more than 1 value to unpack

When I predicted with English test file, it worked.
But when I predicted with Japanese test file (and set pre-trained Japanese word embeddings file), I got the following error.

  File "build/bdist.linux-x86_64/egg/deepcrf/__init__.py", line 119, in predict
  File "build/bdist.linux-x86_64/egg/deepcrf/main.py", line 149, in run
  File "build/bdist.linux-x86_64/egg/deepcrf/util.py", line 65, in load_vocab
ValueError: need more than 1 value to unpack

My command is like:
deep-crf predict input_test_jp.txt --delimiter=" " --model_filename ./save_jpmodel_dir/bilstm-cnn-crf_adam_jp_epoch41.model --save_dir save_jpmodel_dir --save_name bilstm-cnn-crf_adam_jp --word_emb_file jp_word_emb300.txt --n_word_emb 300 --word_emb_vocab_type replace_only --predicted_output predicted41_jp.txt --gpu 0

Any ideas? Thank you.

Will it support Chainer v3.0.0?

I plan to use it for fine-tuning. However, L.NStepBiLSTM can be fine-tuning only in Chainer v 3.0.0 or later. This is because __init__ function of neural networks for fine tuning must have two parameters initialW and initial_bias. So I would like to ask if it supports Chainer v 3.0.0.

ValueError: Invalid input feature sizes

I used the following command:
deep-crf predict input_file_multi.txt --delimiter=' ' --input_idx 0,1 --output_idx 2 --model_filename ./save_model_dir/bilstm-cnn-crf_multi_epoch3.model --save_dir save_model_dir --save_name bilstm-cnn-crf_multi --predicted_output predicted.txt

and I am getting the following error:
ValueError: Invalid input feature sizes: "7". Please check at line [3]

The training and dev data files are in CoNLL format. Can anyone help?
Thanks in advance.

What is the required packages with version ?

I have tried to install it by instructed README file, but I always get error:
In file included from /tmp/easy_install-btbh8apr/h5py-2.7.1/h5py/defs.c:569:0:
/tmp/easy_install-btbh8apr/h5py-2.7.1/h5py/api_compat.h:27:18: fatal error: hdf5.h: No such file or directory
compilation terminated.
error: Setup script exited with error: command 'gcc' failed with exit status 1
Can anybody help me to out from this.

Simplify option of the predict command

I think that option of the prediction command should be imported from train_config file as much as possible because option of the train command and that of the prediction command has overlapping portions.

ValueError: not enough values to unpack (expected 2, got 0)

Hello,

I have the following issue. I have looked through all existing issues and it seems that it is a new issue. It happens when I try to train a model. The errors happen for both dummy data (I got on your README, and the delimiter is one space character, https://www.dropbox.com/s/e7lflyuuahox2ym/dummy_training.txt?dl=0) and my data. Could you give me insights into where the problem is?

deep-crf train dummy_training.txt --delimiter=' ' --dev_file input_file_dev.txt --save_dir . --save_name bilstm-cnn-crf_adam --optimizer adam
[2017-12-31 08:05:23,945] [INFO] start training... ([email protected]:417)
[2017-12-31 08:05:23,945] [INFO] epoch:0 ([email protected]:424)
[2017-12-31 08:05:23,945] [INFO]  [train] ([email protected]:425)
[2017-12-31 08:05:24,165] [INFO]   loss     :8.92536354065 ([email protected]:462)
[2017-12-31 08:05:24,165] [INFO]   accuracy :23.076923076923077 ([email protected]:463)
Traceback (most recent call last):
  File "/Users/longpham/anaconda/bin/deep-crf", line 11, in <module>
    load_entry_point('DeepCRF==1.0', 'console_scripts', 'deep-crf')()
  File "/Users/longpham/anaconda/lib/python3.6/site-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/Users/longpham/anaconda/lib/python3.6/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/Users/longpham/anaconda/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/Users/longpham/anaconda/lib/python3.6/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/longpham/anaconda/lib/python3.6/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/Users/longpham/anaconda/lib/python3.6/site-packages/DeepCRF-1.0-py3.6.egg/deepcrf/__init__.py", line 66, in train
  File "/Users/longpham/anaconda/lib/python3.6/site-packages/DeepCRF-1.0-py3.6.egg/deepcrf/main.py", line 467, in run
  File "/Users/longpham/anaconda/lib/python3.6/site-packages/DeepCRF-1.0-py3.6.egg/deepcrf/main.py", line 369, in eval_loop
ValueError: not enough values to unpack (expected 2, got 0)

TypeError: coercing to Unicode: need string or buffer, list found

When I run the following command to predict, I got this error.
$ deep-crf predict data/predict --delimiter=' ' --model_filename ./save_model_dir/bilstm-cnn-crf_adam_epoch43.model --save_dir save_model_dir/ --save_name bilstm-cnn-crf_adam --predicted_output predicted43.txt --gpu 0

data/predict is the following data format.

SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRISE DEFEAT .
Nadim Ladki
AL-AIN , United Arab Emirates 1996-12-06
Japan began the defence of their Asian Cup title with a lucky 2-1 win against Syria in a Group C championship match on Friday .
But China saw their luck desert them in the second match of the group , crashing to a surprise 2-0 defeat to newcomers Uzbekistan .

I have no idea to solve it.
Any ideas? Thank you.

Support for Chainer 2.0

There are issues running the current build, due to code-breaking changes introduced in Chainer version 2.0. We should specify the chainer version during the installtion process as 1.24.0 or make changes to the existing code to support v2.

@aonotas, Let me know if you need me to send a pull request.

Make stdin and stdout available for prediction

When we predict named entity tags using named entity tagger such as CRF ++, KyTea and KNP, stdin and stdout are used for inputting target data and outputting prediction results.
Therefore, it seems to be good to make stdin and stdout available for inputting target data and outputting prediction results when we predict those.

Enable combination of input data and prediction result

In this tool's prediction results, only predicted labels are displayed now.
However, I think that it is more convenient to be able to also display input data.

For Example (--enable_combined_input is option of combination of input data and prediction result):

$ cat predict input_file_multi.txt
Barack  NN
Hussein NN 
Obama   NN
is      VBZ
a       DT
man     NN 
.       . 

Yuji  NN B−PERSON 
Matsumoto NN E−PERSON 
is      VBZ O 
a       DT  O 
man     NN  O 
.       .   O
$ deep-crf predict input_file_multi.txt --delimiter=' ' --input_idx 0,1 --output_idx 2 --model_filename ./save_model_dir/bilstm-cnn-crf_multi_epoch3.model --save_dir save_model_dir --save_name bilstm-cnn-crf_multi  --predicted_output predicted.txt --enable_combined_input
$ cat predicted.txt
Barack  NN B−PERSON 
Hussein NN I−PERSON 
Obama   NN E−PERSON
is      VBZ O 
a       DT  O 
man     NN  O 
.       .   O

Yuji  NN B−PERSON 
Matsumoto NN E−PERSON 
is      VBZ O 
a       DT  O 
man     NN  O 
.       .   O

TypeError: object of type 'int' has no len()

When I trained with English train/dev files, it worked.
But when I trained with Japanese train/dev files (and set pre-trained Japanese word embeddings file), I got the following error.

  File "build/bdist.linux-x86_64/egg/deepcrf/__init__.py", line 66, in train
  File "build/bdist.linux-x86_64/egg/deepcrf/main.py", line 98, in run
  File "build/bdist.linux-x86_64/egg/deepcrf/util.py", line 102, in read_conll_file
TypeError: object of type 'int' has no len()

I want to set pre-trained Japanese char embeddings file, but it looks like there is not --char_emb_file option.
I am wondering if this is the cause of the error.
Does it support Japanese train/dev file (or --char_emb_file option) ?
Thank you.

ModuleNotFoundError: No module named 'deepcrf'

After installing getting this error:

C:\WINDOWS\system32>deep-crf train --help
Traceback (most recent call last):
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python37\Scripts\deep-crf-script.py", line 11, in <module>
    load_entry_point('DeepCRF==1.0', 'console_scripts', 'deep-crf')()
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python37\lib\site-packages\pkg_resources\__init__.py", line 480, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python37\lib\site-packages\pkg_resources\__init__.py", line 2693, in load_entry_point
    return ep.load()
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python37\lib\site-packages\pkg_resources\__init__.py", line 2324, in load
    return self.resolve()
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python37\lib\site-packages\pkg_resources\__init__.py", line 2330, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
ModuleNotFoundError: No module named 'deepcrf'

Installation output:

C:\WINDOWS\system32>python setup.py install
running install
running bdist_egg
running egg_info
writing DeepCRF.egg-info\PKG-INFO
writing dependency_links to DeepCRF.egg-info\dependency_links.txt
writing entry points to DeepCRF.egg-info\entry_points.txt
writing requirements to DeepCRF.egg-info\requires.txt
writing top-level names to DeepCRF.egg-info\top_level.txt
reading manifest file 'DeepCRF.egg-info\SOURCES.txt'
writing manifest file 'DeepCRF.egg-info\SOURCES.txt'
installing library code to build\bdist.win-amd64\egg
running install_lib
warning: install_lib: 'build\lib' does not exist -- no Python modules to install

creating build\bdist.win-amd64\egg
creating build\bdist.win-amd64\egg\EGG-INFO
copying DeepCRF.egg-info\PKG-INFO -> build\bdist.win-amd64\egg\EGG-INFO
copying DeepCRF.egg-info\SOURCES.txt -> build\bdist.win-amd64\egg\EGG-INFO
copying DeepCRF.egg-info\dependency_links.txt -> build\bdist.win-amd64\egg\EGG-INFO
copying DeepCRF.egg-info\entry_points.txt -> build\bdist.win-amd64\egg\EGG-INFO
copying DeepCRF.egg-info\requires.txt -> build\bdist.win-amd64\egg\EGG-INFO
copying DeepCRF.egg-info\top_level.txt -> build\bdist.win-amd64\egg\EGG-INFO
zip_safe flag not set; analyzing archive contents...
creating 'dist\DeepCRF-1.0-py3.7.egg' and adding 'build\bdist.win-amd64\egg' to it
removing 'build\bdist.win-amd64\egg' (and everything under it)
Processing DeepCRF-1.0-py3.7.egg
Removing c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages\DeepCRF-1.0-py3.7.egg
Copying DeepCRF-1.0-py3.7.egg to c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages
DeepCRF 1.0 is already the active version in easy-install.pth
Installing deep-crf-script.py script to C:\Users\UserName\AppData\Local\Programs\Python\Python37\Scripts
Installing deep-crf.exe script to C:\Users\UserName\AppData\Local\Programs\Python\Python37\Scripts

Installed c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages\deepcrf-1.0-py3.7.egg
Processing dependencies for DeepCRF==1.0
Searching for h5py==2.9.0
Best match: h5py 2.9.0
Adding h5py 2.9.0 to easy-install.pth file

Using c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages
Searching for Click==7.0
Best match: Click 7.0
Adding Click 7.0 to easy-install.pth file

Using c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages
Searching for numpy==1.16.2
Best match: numpy 1.16.2
Adding numpy 1.16.2 to easy-install.pth file
Installing f2py-script.py script to C:\Users\UserName\AppData\Local\Programs\Python\Python37\Scripts
Installing f2py.exe script to C:\Users\UserName\AppData\Local\Programs\Python\Python37\Scripts

Using c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages
Searching for six==1.12.0
Best match: six 1.12.0
Adding six 1.12.0 to easy-install.pth file

Using c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages
Finished processing dependencies for DeepCRF==1.0 

Chainer installation output:

C:\WINDOWS\system32>pip install chainer==2.1.0
Collecting chainer==2.1.0
  Downloading https://files.pythonhosted.org/packages/3a/67/35f757014d733e0193a1f9b2b466750754723f22a13c0c546810bf137590/chainer-2.1.0.tar.gz (324kB)
    100% |████████████████████████████████| 327kB 633kB/s
Requirement already satisfied: filelock in c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages (from chainer==2.1.0) (3.0.12)
Requirement already satisfied: mock in c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages (from chainer==2.1.0) (2.0.0)
Requirement already satisfied: nose in c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages (from chainer==2.1.0) (1.3.7)
Requirement already satisfied: numpy>=1.9.0 in c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages (from chainer==2.1.0) (1.16.2)
Requirement already satisfied: protobuf>=2.6.0 in c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages (from chainer==2.1.0) (3.7.1)
Requirement already satisfied: six>=1.9.0 in c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages (from chainer==2.1.0) (1.12.0)
Requirement already satisfied: pbr>=0.11 in c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages (from mock->chainer==2.1.0) (5.1.3)
Requirement already satisfied: setuptools in c:\users\UserName\appdata\local\programs\python\python37\lib\site-packages (from protobuf>=2.6.0->chainer==2.1.0) (39.0.1)
Building wheels for collected packages: chainer
  Running setup.py bdist_wheel for chainer ... done
  Stored in directory: C:\Users\UserName\AppData\Local\pip\Cache\wheels\a0\23\6e\9db9f23a5317e5c75b5a4b82f8b3a8db7f9feedbeac2877542
Successfully built chainer
Installing collected packages: chainer
  Found existing installation: chainer 1.24.0
    Uninstalling chainer-1.24.0:
      Successfully uninstalled chainer-1.24.0
Successfully installed chainer-2.1.0

Trained models

I will add trained models for POS tagging, Chunking, NER and Japanese sentence splitter.

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.