Coder Social home page Coder Social logo

amazon-science / refined Goto Github PK

View Code? Open in Web Editor NEW
170.0 18.0 30.0 430 KB

ReFinED is an efficient and accurate entity linking (EL) system.

License: Other

Python 99.79% Shell 0.21%
entity-extraction entity-linking entity-resolution nlp pytorch

refined's Introduction

ReFinED

Quickstart

pip install https://github.com/amazon-science/ReFinED/archive/refs/tags/V1.zip
from refined.inference.processor import Refined
refined = Refined.from_pretrained(model_name='wikipedia_model_with_numbers',
                                  entity_set="wikipedia")
spans = refined.process_text("<add_text_here>")

Overview

ReFinED is an entity linking (EL) system which links entity mentions in documents to their corresponding entities in Wikipedia or Wikidata (over 30M entities). The combination of accuracy, speed, and scalability of ReFinED means the system is capable of being deployed to extract entities from web-scale datasets with higher accuracy and an order of magnitude lower cost than existing approaches.

News

  • (November 2022)
    • Code refactoring ๐Ÿ”จ
    • Increased inference speed by 2x (replicates results from our paper) ๐Ÿ’จ
    • Released aida_model (trained on news articles) and questions_model (trained on questions) to replicate the results from our paper โœ…
    • New features ๐Ÿš€
      • Entity linking evaluation code
      • Fine-tuning script (allows use of custom datasets)
      • Training script
      • Data generation script (includes adding additional entities).

Hardware Requirements

ReFinED has a low hardware requirement. For fast inference speed, a GPU should be used, but this is not a strict requirement.

Model Architecture

In summary, ReFinED uses a Transformer model to perform mention detection, entity typing, and entity disambiguation for all mentions in a document in a single forward pass. The model is trained on a dataset we generated dataset using Wikipedia hyperlinks, which consists of over 150M entity mentions. The model uses entity descriptions and fine-grained entity types to perform linking. Therefore, new entities can be added to the system without retraining.

ReFinED Paper

The ReFinED model architecture is described in the paper below (https://arxiv.org/abs/2207.04108):

@inproceedings{ayoola-etal-2022-refined,
    title = "{R}e{F}in{ED}: An Efficient Zero-shot-capable Approach to End-to-End Entity Linking",
    author = "Tom Ayoola, Shubhi Tyagi, Joseph Fisher, Christos Christodoulopoulos, Andrea Pierleoni",
    booktitle = "NAACL",
    year = "2022"
}

Incorporating Knowledge Base Information Paper

The following paper is an extension of ReFinED which incorporates Knowledge Base (KB) information into the ED model in a fully differentiable and scalable manner (https://arxiv.org/abs/2207.04106):

@inproceedings{ayoola-etal-2022-improving,
    title = "Improving Entity Disambiguation by Reasoning over a Knowledge Base",
    author = "Tom Ayoola, Joseph Fisher, Andrea Pierleoni",
    booktitle = "NAACL",
    year = "2022"
}

Examples

While classical NER systems, such as widely used spaCy, classify entities to high-level classes (e.g. PERSON, LOCATION, NUMBER, ...; 26 in total for spaCy), ReFinED supports over 1k low-level classes (e.g. Human, Football Team, Politician, Screenwriter, Association Football Player, Guitarist, ...). As an example, for the sentence "England qualified for the 1970 FIFA World Cup in Mexico as reigning champions.", ReFinED predicts "England" โ†’ {national football team} and "Mexico" โ†’ {country}; while spaCy maps both "England" and "Mexico" โ†’ {GPE - country}. Using fine-grained classes, the model is able to probabilistically narrow-down the set of possible candidates for "England" leading to correct disambiguation of the entity. Additionally, ReFinED uses textual descriptions of entities to perform disambiguation.

Library

Getting Started

The setup for ReFinED is very simple because the data files and datasets are downloaded automatically.

  1. Install the dependencies using the command below:
pip install -r requirments.txt

If the command above fails (which currently, happens on a Mac), run the commands below instead:

conda create -n refined38 -y python=3.8 && conda activate refined38
conda install -c conda-forge python-lmdb -y
pip install -r requirments.txt
  1. Add the src folder to your Python path. One way to do this is by running this command:
export PYTHONPATH=$PYTHONPATH:src
  1. Now you can use ReFinED is your code as follows:
from refined.inference.processor import Refined
refined = Refined.from_pretrained(...)

Importing ReFinED as a library

To import the ReFinED model into your existing code run the commands below (note that the conda commands are only needed on a Mac):

pip install https://github.com/amazon-science/ReFinED/archive/refs/tags/V1.zip

Alternatively, if the command above does not work, try the commands below which will install some dependencies using conda.

conda create -n refined38 -y python=3.8 && conda activate refined38
conda install -c conda-forge python-lmdb -y
git clone https://github.com/amazon-science/ReFinED.git
cd ReFinED
python setup.py bdist_wheel --universal
pip install dist/ReFinED-1.0-py2.py3-none-any.whl
cd ..

Inference - performing EL with a trained model

We have released several trained models that are ready to use. See the code below or example_scripts/refined_demo.py for a working example. Inference speed can be improved by setting use_precomputed_descriptions=True which increases disk usage.

from refined.inference.processor import Refined


refined = Refined.from_pretrained(model_name='wikipedia_model_with_numbers',
                                  entity_set="wikipedia")

spans = refined.process_text("England won the FIFA World Cup in 1966.")

print(spans)

Expected output:

[['England', Entity(wikidata_entity_id=Q47762, wikipedia_entity_title=England national football team), 'ORG'], ['FIFA World Cup', Entity(wikidata_entity_id=Q19317, wikipedia_entity_title=FIFA World Cup), 'EVENT'], ['1966', Entity(...), 'DATE']]

Note that str(span) only returns a few fields of the returned object for readability. Many other fields, such as top-k predictions and predicted fine-grained entity types, are also accessible from the returned Span.

Parameters

model_name: We provide four pretrained models

  1. 'wikipedia_model': This is the model which matches the setup described in the paper
  2. 'wikipedia_model_with_numbers': This model extends the above model, to also include detection of SpaCy numerical data types in the mention detection layer ("DATE", "CARDINAL", "MONEY", "PERCENT", "TIME", "ORDINAL", "QUANTITY"). The detected types are available at span.coarse_type. If the coarse_type is detected as "DATE", the date will be normalised to a standard format available at span.date. All non-numerical types will have a coarse_type of "MENTION", and will be passed through the entity disambiguation layer to attempt to resolve them to a wikidata entity.
  3. 'aida_model': This is the model which matches the setup described in the paper for fine-tuning the model on AIDA for entity linking. Note that this model is different to the model fine-tuned on AIDA for entity disambiguation only, which is also described in the paper.
  4. 'questions_model': This model is fine-tuned on short question text (lowercase text). The model was fine-tuned on the WebQSP EL dataset and the setup is described in our paper.

entity_set: Set to "wikidata" to resolve against all ~33M (after some filtering) entities in wikidata (requires more memory) or to "wikipedia" to limit to resolving against the ~6M entities which have a wikipedia page.

data_dir (optional): The local directory where the data/model files will be downloaded to/loaded from (defaults to ~/.cache/refined/).

download_files (optional): Set to True the first time the code is run, to automatically download the data/model files from S3 to your local directory. Files will not be downloaded if they already exist but network calls will still be made to compare timestamps.

use_precomputed_descriptions (optional): Set to True to use precomputed embeddings of all descriptions of entities in the knowledge base (speeds up inference).

device (optional): The device to load the model/run inference on.

Evaluation

Entity disambiguation

We provide the script replicate_results.py which replicates the results reported in our paper.

Entity disambiguation evaluation is run using the eval_all function:

from refined.inference.processor import Refined
from refined.evaluation.evaluation import eval_all

refined = Refined.from_pretrained(model_name='wikipedia_model',
                                  entity_set="wikipedia")

results_numbers = eval_all(refined=refined, el=False)

The script will automatically download the test dataset splits to ~/.cache/refined/. Please ensure you have the permission to use each dataset for your use case as defined by their independent licenses.

Expected results:

We show the expected results from the evaluation scripts below. The numbers for "wikipedia_model" with entity set "wikipedia" most closely match the numbers in the paper (they differ marginally as we have updated to a newer version of Wikipedia). For both models, performance on Wikidata entities is slightly lower, as all entities in the datasets are linked to Wikipedia entities (so adding Wikidata entities just adds a large quantity of entities that will never appear in the gold labels).

The performance of "wikipedia_model_with_numbers" is slightly lower, which is expected as the model is also trained to identify numerical types.

model_name entity_set AIDA MSNBC AQUAINT ACE2004 CWEB WIKI
wikipedia_model wikipedia 87.4 94.5 91.9 91.4 77.7 88.7
wikipedia_model wikidata 85.6 92.8 90.4 91.1 76.3 88.2
wikipedia_model_with_numbers wikipedia 85.1 93.5 90.3 91.7 76.4 89.4
wikipedia_model_with_numbers wikidata 84.9 93.6 90.0 91.2 75.8 88.9

Entity linking

Entity linking evaluation is run using the eval_all function with el=True:

from refined.inference.processor import Refined
from refined.evaluation.evaluation import eval_all

refined = Refined.from_pretrained(model_name='aida_model',
                                  entity_set="wikipedia")

results_numbers = eval_all(refined=refined, el=True)

The results below slightly differ from the ones reported in our paper (which were produced by the Gerbil framework using an older version of Wikipedia). The wikipedia_model is not trained on Wikipedia hyperlinks only. Whereas, the aida_model is fine-tuned on the AIDA training dataset (with the weights initialised from the wikipedia_model).

model_name entity_set AIDA MSNBC
aida_model wikipedia 85.0 75.1
wikipedia_model wikipedia 78.3 73.4

We observe that most EL errors on the AIDA dataset are actually dataset annotation errors. The AIDA dataset does not provide the entity label for every mention that can be linked to Wikipedia. Instead, many mentions are incorrectly labelled as NIL mentions, meaning no corresponding Wikipedia page was found for the mention (during annotation). This means that EL model predictions for these mentions will be unfairly considered as incorrect. To measure the impact, we added an option to filter out model predictions which exactly align with NIL mentions in the dataset:

eval_all(refined=refined, el=True, filter_nil_spans=True)

We report 90.2 F1 on the AIDA dataset when we set filter_nil_spans=True, when using our "aida_model".

Inference speed

We run the model over the AIDA dataset development split using our script, benchmark_on_aida.py.

Hardware Time taken to run EL on AIDA test dataset (231 news articles)
V100 GPU 6.5s
T4 GPU 7.4s
CPU 29.7s

The first time the model is loaded it will take longer because the data files need to be downloaded to disk.

Fine-tuning

See FINE_TUNING.md for instructions on how to fine-tune the model on standard and custom datasets.

Training

See TRAINING.md for instructions on how to train the model on our Wikipedia hyperlinks dataset.

Generating and updating the data files and training dataset

To regenerate all data files run the preprocess_all.py script. This script downloads the most recent Wikipedia and Wikidata dump and generates the data files and Wikipedia training dataset. Note that ReFinED is capable of zero-shot entity linking, which means the data files (which will include recently added entities) can be updated without having retraining the model.

Adding additional/custom entities

Additional entities (which are not in Wikidata) can be added to the entity set considered by ReFinED by running preprocess_all.py script with the argument --additional_entities_file <path_to_file>. The file must be a jsonlines file where each row is the JSON string for an AdditionalEntity. Ideally, the entity types provided should be Wikidata classes such as "Q5" for human.

Built With

  • PyTorch - PyTorch is an open source machine learning library based on the Torch library.
  • Transformers - Implementations of Transformer models.
  • Works with Python 3.8.10.

Security

See CONTRIBUTING for more information.

License

This library is licensed under the CC-BY-NC 4.0 License.

Contact us

If you have questions please open Github issues instead of sending us emails, as some of the listed email addresses are no longer active.

refined's People

Contributors

amazon-auto avatar tayoola 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

refined's Issues

Training dataset

Can you please share the processed wikipedia training dataset?

How to optimize GPU usage?

I am running the model on a batch of 500 articles and it takes around 10 to 15 GB of GPU memory.
Is there a way to optimize the GPU usage?

Missing Wikipedia_data folder after running preprocess_all?

When I ran preprocess_all, it completed successfully with what I think should have all the folders in the ./organised_data_dir

  • additional data
  • datasets
  • roberta-base
  • wikidata_data

However I don'y see the models or data files for the wikipedia data. Where are they stored/created or did something not process during the preprocess_all script?

Thank you!

Will you release the KBED source code?

Thanks for your awesome work named "Improving Entity Disambiguation by Reasoning over a Knowledge Base(KBED)", I am trying to reproduce the results, will you release the KBED source code?

Support for AWS inferentia

Hi team, thanks for sharing the great work here.

will there be an integration to AWS inferentia?

thanks!

Some questions about training dataset

Great work!

I executed the following command and obtained the data file named wikipedia_links_aligned_spans.json in the folder ~/.cache/refined/datasets.

python3 src/refined/training/train/train.py --experiment_name test

I have two questions regarding this file:

  • Is wikipedia_links_aligned_spans.json the training data?
  • If so, which fields are used for training? I found three fields in the wikipedia_links_aligned_spans.json, which are hyperlinks_clean, hyperlinks, and predicted_spans. I'm not familiar with this three fields and I'm unsure how to proceed with obtaining the training data.

Thanks !

Inefficient Process for Adding New Entities in ReFinED

When trying to add a dozen more entities by running preprocess_all.py, the process requires downloading over 100GB of data, which is highly inefficient for such a small addition.

This model cannot be considered to have zero-shot capabilities until there is a streamlined, bloat-free script for adding new entities into the system.

Steps to Reproduce:

  1. Clone the repository and set up the environment as per the documentation.
  2. Attempt to add a dozen new entities by running preprocess_all.py.
  3. Observe the data download requirements and inefficiency.

Expected Behavior:

There should be a lightweight and efficient process for adding new entities without requiring extensive data downloads.

Actual Behavior:

Adding new entities requires downloading over 100GB of data, making the process highly inefficient and cumbersome.

Environment:

Google Colab
Operating System: Linux
Python Version: 3.10

Severity:

High - This issue severely impacts the usability and efficiency of adding new entities to the system and needs immediate attention.

TypeError: cannot pickle 'Environment' object

Hi, I use python 3.12.2 and torch 2.2.2 on macOS 12.7.4.
The ReFinED version is 1.0.
When trying fine-tuning the following error happened.
( python src/refined/training/fine_tune/fine_tune.py --experiment_name test )

TypeError: cannot pickle 'Environment' object

Could you tell me what could be done to workaround this issue?

Thanks.

Upload Multilingual Model

Dear developers,
I was curious if you plan to upload the multilingual mrefined model for inference and finetuning.
Lookinig forward to your reply.

Best,
Cristian

cannot find the file "chosen_classes.txt"

I am trying to add additional entities without retraining. The script preprocess_all.py fails:
Ran out of 'useful' classes to select. So using number the 153 chosen classes. Note that this is not expected to happen. It likely indicates that the Wikidata dump or Wikipedia was dump was not downloaded and parsed correctly. Traceback (most recent call last): File "/mnt/nlu/users/yasser_hifny/gkqa/refined/ReFinED/src/refined/offline_data_generation/preprocess_all.py", line 364, in <module> main() File "/mnt/nlu/users/yasser_hifny/gkqa/refined/ReFinED/src/refined/offline_data_generation/preprocess_all.py", line 244, in main select_classes(resources_dir=OUTPUT_PATH, is_test=debug) File "/mnt/nlu/users/yasser_hifny/gkqa/refined/ReFinED/src/refined/offline_data_generation/class_selection.py", line 152, in select_classes os.rename(os.path.join(resources_dir, 'chosen_classes.txt.part'), FileNotFoundError: [Errno 2] No such file or directory: 'data/chosen_classes.txt.part' -> 'data/chosen_classes.txt'

I am not able to find the file "chosen_classes.txt" in the original data folder:

`additional_data:

datasets:

roberta-base:
config.json merges.txt pytorch_model.bin vocab.json

wikipedia_data:
class_to_idx.json descriptions_tns.pt nltk_sentence_splitter_english.pickle qcode_to_class_tns_6269457-138.np qcode_to_wiki.lmdb
class_to_label.json human_qcodes.json pem.lmdb qcode_to_idx.lmdb subclasses.lmdb

wikipedia_model:
config.json model.pt

wikipedia_model_with_numbers:
config.json model.pt
`

how can I find it and thanks in advance.

How do I add new entities to the EL system?

Thanks for the fantastic paper and this repository. The code certainly lives up to the claims made in the paper and quickly processes a piece of text!

Is there a way to add new entities to the EL system? Especially if one can't calculate the entity-mention prior?

Thanks!

Same wikipedia entity title for all top k candidates

Hello, I found what I believe is an issue with the method retrieving the top k candidate entities. When asking for top_k_predicted_entities from a span object, all candidates show the same wikipedia entity title (which is equal to the title of the selected, top-score entity), even if the wikidata ids actually point to different entities.

To show an example, when asking for top k predicted entities for "Barack Obama", I get:

[(Entity(wikidata_entity_id=Q76, wikipedia_entity_title=Barack Obama), 1.0),
 (Entity(wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q649593, wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q16847466, wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q4858115, wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q3526570, wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q50303833, wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q8564528, wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q2935433, wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q4858123, wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q4858105, wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q1379733, wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q45578, wikipedia_entity_title=Barack Obama), 0.0),
 (Entity(wikidata_entity_id=Q5842038, wikipedia_entity_title=Barack Obama), 0.0)]

even though, for example, id=Q16847466 corresponds to the wikipedia item "Efforts to impeach Barack Obama".

Am I missing something?

Early stopping in the preprocessing step

In class_selection.py (https://github.com/amazon-science/ReFinED/blob/main/src/refined/offline_data_generation/class_selection.py#L147), when there is no entity span in the article, the preprocessing step (https://github.com/amazon-science/ReFinED/blob/main/src/refined/offline_data_generation/preprocess_all.py#L244) will stop immediately instead of iterate all of your training data (wikipedia_links_aligned.json).
If this is the issue, feel free to tell me and I will send the PR with fixed codes.

Instructions for training a new model

Hi team, thanks for sharing your great work.
Could you please share your instructions for step-by-step preparing the Wikipedia dataset and training a new Wikipedia model.
Best,

Approach for limited labelled data

Is there a script or a road map that I can use to try zero-shot inference with new entities. I already have annotated data but not too much (around 3000 and unbalanced) I can maybe fine tune but training from scratch would not be possible for me given I don't have a big dataset. What approach should I follow?

Issue with loading Additional Entities

I have tried to load additional entities as per the README by running preprocess_all. Everything appears to run fine - however when I try and load the refined model afterwards with something like:

refined = Refined(
    model_file_or_model=data_dir+ "/wikipedia_model_with_numbers/model.pt",
    model_config_file_or_model_config=data_dir + "/wikipedia_model_with_numbers/config.json",
    entity_set="wikidata",
    data_dir=data_dir,
    use_precomputed_descriptions = False,
    download_files=False,
    preprocessor=preprocessor
)

I get an error like:

Traceback (most recent call last):
  File "/home/azureuser/Hafnia/email_ee/email_refined.py", line 91, in <module>
    refined = Refined(
  File "/home/azureuser/ReFinED/src/refined/inference/processor.py", line 100, in __init__
    self.model = RefinedModel.from_pretrained(
  File "/home/azureuser/ReFinED/src/refined/model_components/refined_model.py", line 643, in from_pretrained
    model.load_state_dict(checkpoint, strict=False)
  File "/home/azureuser/.pyenv/versions/venv3108/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1671, in load_state_dict
    raise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format(
RuntimeError: Error(s) in loading state_dict for RefinedModel:
        size mismatch for entity_typing.linear.weight: copying a param with shape torch.Size([1369, 768]) from checkpoint, the shape in current model is torch.Size([1447, 768]).
        size mismatch for entity_typing.linear.bias: copying a param with shape torch.Size([1369]) from checkpoint, the shape in current model is torch.Size([1447]).
        size mismatch for entity_disambiguation.classifier.weight: copying a param with shape torch.Size([1, 1372]) from checkpoint, the shape in current model is torch.Size([1, 1450]).

To the best of my understanding, this is because the number of classes in the wikidata dump has changed since the original model was trained. (Number of class_to_label.json now has 1446 entries.) Is there any way to accomodate this without completely retraining the model?

Weird runtime variations - are there any caching effects?

Dear Tom,

First of all thank you for publishing this awesome and easy to use entity linker.

I've been running experiments with ReFinED for a while but only started using it on GPU a few days ago. I noticed some weird variations in the runtime on GPU (maybe they were there on CPU as well, and I didn't pay close attention to the runtime before, but I think I would have noticed):
If I run ReFinED over a benchmark for the first time (or for the first time after linking over several other benchmarks), it takes quite a while (in fact at least as long as on my CPU-only machine: 76s for the Wiki-Fair benchmark). If I run it again immediately on the same benchmark it is lightning fast and links the whole thing in 4s.

Is there any caching used that might explain this behavior? If so, can I disable it to get comparable runtime measurements?

The loading of the model does not count towards my time measurement. The model is loaded before the measurement is started:

self.refined = Refined.from_pretrained(model_name=model_name, entity_set=entity_set)

I'm using ReFinED from inside the ELEVANT entity linking evaluation tool with the AIDA model and the 33M entity set.

Thanks in advance,
Natalie

Code for Entity_Linking

Hi, Congratulations on your work. I am interested to experiment with the entity_linking part of this paper. Any details on when can we expect the code for it?

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.