GithubHelp home page GithubHelp logo

ahmetaa / zemberek-nlp Goto Github PK

View Code? Open in Web Editor NEW
1.1K 109.0 208.0 53.24 MB

NLP tools for Turkish.

License: Other

Java 99.12% ANTLR 0.24% Python 0.49% Shell 0.01% Go 0.14%
morphology language nlp zemberek-nlp turkish

zemberek-nlp's Introduction

Zemberek-NLP

This project is now in slow maintenance mode.

Zemberek-NLP provides Natural Language Processing tools for Turkish.

Latest version is 0.17.1 (July 23th 2019). Change Log

Please read the FAQ for common questions.

Modules

Module Maven Id
Core zemberek-core Special Collections, Hash functions and helpers.
Morphology zemberek-morphology Turkish morphological analysis, disambiguation and word generation.
Tokenization zemberek-tokenization Turkish Tokenization and sentence boundary detection.
Normalization zemberek-normalization Basic spell checker, word suggestion. Noisy text normalization.
NER zemberek-ner Turkish Named Entity Recognition.
Classification zemberek-classification Text classification based on Java port of fastText project.
Language Identification zemberek-lang-id Fast identification of text language.
Language Modeling zemberek-lm Provides a language model compression algorithm.
Applications zemberek-apps Console applications
gRPC Server zemberek-grpc gRPC server for access from other languages.
Examples zemberek-examples Usage examples.

Usage

Maven

Add this to pom.xml file

    <repositories>
        <repository>
            <id>zemberek-repo</id>
            <name>zemberek Maven Repo on Github</name>
            <url>https://raw.github.com/ahmetaa/maven-repo/master</url>
        </repository>
    </repositories>

And dependencies (For example morphology):

    <dependencies>
        <dependency>
            <groupId>zemberek-nlp</groupId>
            <artifactId>zemberek-morphology</artifactId>
            <version>0.17.1</version>
        </dependency>
    </dependencies>

Jar distributions

Google drive page contains jar files for different versions.

[zemberek-full.jar] is a single jar that contains all modules and dependencies. When it is run directly with

  java -jar zemberek-full.jar

It will list available console applications.

For Developers

Here information about how to compile the code and generate jar files from the project is explained.

Examples

There is an examples module in the code for usage examples.

Also, there is a separate project with same examples that uses Zemberek-NLP as maven modules: Turkish-nlp-examples

Known Issues and Limitations

  • NER module does not provide a model yet.
  • Library is not well-tested for multi-threaded usage.

Please see issues section for further issues and feel free to create new ones.

License

Code is licensed under Apache License, Version 2.0

Citing

If you use this project in an academic publication, please refer to this site.

Acknowledgements

Please refer to contributors.txt file.

zemberek-nlp's People

Contributors

adursun avatar ahmetaa avatar aliok avatar buyalsky avatar celebisait avatar dependabot[bot] avatar elifkus avatar emreeulusoy avatar ilhanyumer avatar iorixxx avatar mdakin avatar otuncelli avatar ozturkberkay 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  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

zemberek-nlp's Issues

Capitalized foreign letters cause unhandled exception at UnidentifiedTokenParser

When TurkishSentenceParser encounters an unidentified letter, the exception below is thrown:

Sample input:
TOMÙ

java.lang.IllegalStateException: Letter sequence is empty
    at zemberek.core.turkish.TurkicSeq.lastLetter(TurkicSeq.java:103)
    at zemberek.morphology.lexicon.tr.StemNodeGenerator.calculateAttributes(StemNodeGenerator.java:95)
    at zemberek.morphology.lexicon.tr.StemNodeGenerator.calculateAttributes(StemNodeGenerator.java:79)
    at zemberek.morphology.lexicon.tr.StemNodeGenerator.generate(StemNodeGenerator.java:57)
    at zemberek.morphology.lexicon.graph.DynamicLexiconGraph.addDictionaryItem(DynamicLexiconGraph.java:55)
    at zemberek.morphology.apps.UnidentifiedTokenParser.parse(UnidentifiedTokenParser.java:61)
    at zemberek.morphology.apps.TurkishSentenceParser.parse(TurkishSentenceParser.java:73)
    at morphology.DisambiguateSentences.parseAndDisambiguate(DisambiguateSentences.java:21)

This is abnormal since TurkishSentenceParser doesn't expect this exception from UnidentifiedTokenParser.

Cannot parse the word: birbirleri

Even though birbiri can be parsed as:

[(birbiri:birbiri) (Pron,Quant;A3sg+Pnon+Nom)]

birbirleri, which could have been parsed as:

Pron birbirleri Pron+Quant+A3pl+P3pl+Nom

remains unknown by the parser.

zemberek.core.logging.Log class ının içinde java.util.logging e ait root logger ın handler ları değiştiriliyor.

zemberek.core.logging.Log:33 te
static {
Handler[] handlers = globalLogger.getHandlers();
for (Handler handler : handlers) {
globalLogger.removeHandler(handler);
}
ConsoleHandler ch = new ConsoleHandler();
ch.setFormatter(new CUSTOM_FORMAT());
ch.setLevel(currentLevel);
globalLogger.addHandler(ch);
Thread.setDefaultUncaughtExceptionHandler(EXCEPTION_HANDLER);
}

Global logger daki handler lar remove edilip custom format ile console handler eklenince, projenin ve içerdiği diğer tüm jarların log ları bu formata göre basılıyor artık.

Postp->Noun conversion usually does not make sense

Postp->Noun conversion usually does not make sense and causes unnecessary ambiguity and false positives. Examples:

ilem
[(ile:ile) (Postp)(Noun;A3sg+P1sg:m+Nom)]

temsilci
[(temsil:temsil) (Noun;A3sg+Pnon+Nom)(Noun;Agt:ci+A3sg+Pnon+Nom)]
[(temsil:temsil) (Postp)(Noun;A3sg+Pnon+Nom)(Noun;Agt:ci+A3sg+Pnon+Nom)]

(via mugesevinc)

sözlüğe özel isim eklemek

Merhaba,
Buradaki örnekte, sözlükte olan bir sözcüğün özel isim halini ekleyemedim. Örneğin "Meydan" sözcüğü:
new DictionaryItem("Meydan", "meydan", "meydan", PrimaryPos.Noun, SecondaryPos.ProperNoun)
şeklinde özel isim olarak eklenemiyor. Nasıl çözülebilir acaba?

Dokümantasyon eksikleri

  1. Deponun (repo) resmi Zemberek deposu olduğunu belirtmeniz çok yerinde olur. İlk bakışta anlaşılmıyor.
  2. Google aramaları bu sayfayı çokça gösteriyor: http://code.google.com/p/zemberek/ Burada ne 3. sürüme bir link var ne de bu github deposuna. "Bir de githubta aratayım" demeseydim bu depoyu bulamayacaktım. Ordan buraya bir link vermeniz, projenin ölü olmadığının göstergesi olacaktır.

Çalışmalarınız için teşekkürler.

Wiki

Bir kaç wiki sayfası hazırlasan ne güzel olur, proje ne durumda eski zemberek kütüphanesine ne oldu, Lucene, Solr, Elasticsearch ile birlikte kullanabiliyormuyuz yoksa snowball'dan mı devam edeceğiz, sistem kütüphanelerimizi yenileyelim mi? libreoffice vb. uygulamaların zemberek köprüleri güncellensin mi? Neden eski kod ile bu yeni kod birbirinden bu kadar uzak?

Bunları biraz anlatsan ne güzel olur

GCJ ile derleme mümkün mü?

Makine kodu daha hızlı çalışıyor GCJ ile derlemeyi destekliyor musunuz veya desteklemeyi düşünüyor musunuz?

TurkishSentenceParser.preProcess splits string at foreign character

TurkishLexer provides ends a token when it encounters a foreign character. For a foreign string, this makes it yield multiple tokens for a simple foreign string (simple: containing no separators).

This might not be considered bad behavior at Lexer level.

However, TurkishSentenceParser.preProcess joins these tokens by printing space between them. This leads to such examples:

André -> [Andr, é]
Bjørn -> [Bj, ø, rn]

etc. after preprocessing

Cannot parse "soyadları"

Reason is hard to explain, but easy to fix.
"soyadlari" is compouns with "soy-ad" But there are two "ad" in lexicon. System is getting the wrong "ad". For fixing, it sorts the matching items by index value and uses the first one. Better way is to label the correct item in meta data of "soyadi".
So, if the "ad" with index 1 needs to be used, item can be defined as
soyadı [A:CompoundP3sg; Roots:soy-ad_1]
For now it will assume all are using the first item with index 0.

Project compiles with 1.8 but throws an exception at runtime

I have Apache Solr plugin project with the following dependency:

zemberek-nlp core 0.9.0

On Intellij selecting both 1.7 and 1.8 works with no problem. However with Solr for JDK 1.8,
it throws the following exception:

Note: Solr also works on the same 1.8 JVM

"trace": "java.lang.RuntimeException: java.lang.NoClassDefFoundError: zemberek/core/DoubleValueSet\r\n\tat org.apache.solr.servlet.SolrDispatchFilter.sendError(SolrDispatchFilter.java:724)\r\n\tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:434)\r\n\tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:197)\r\n\tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)\r\n\tat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)\r\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)\r\n\tat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)\r\n\tat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)\r\n\tat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)\r\n\tat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)\r\n\tat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)\r\n\tat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)\r\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)\r\n\tat org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)\r\n\tat org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)\r\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)\r\n\tat org.eclipse.jetty.server.Server.handle(Server.java:368)\r\n\tat org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)\r\n\tat org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53)\r\n\tat org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:942)\r\n\tat org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1004)\r\n\tat org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640)\r\n\tat org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)\r\n\tat org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72)\r\n\tat org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264)\r\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)\r\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)\r\n\tat java.lang.Thread.run(Unknown Source)\r\nCaused by: java.lang.NoClassDefFoundError: zemberek/core/DoubleValueSet\r\n\tat tr.gov.bilgem.damla.solr.plugin.suggesters.SingleWordSpellChecker.decode(SingleWordSpellChecker.java:330)\r\n\tat tr.gov.bilgem.damla.solr.plugin.suggesters.DamlaSuggester.spellcheck(DamlaSuggester.java:279)\r\n\tat tr.gov.bilgem.damla.solr.plugin.suggesters.DamlaSuggester.correctToken(DamlaSuggester.java:299)\r\n\tat tr.gov.bilgem.damla.solr.plugin.suggesters.DamlaSuggester.getSuggestions(DamlaSuggester.java:196)\r\n\tat org.apache.solr.handler.component.SpellCheckComponent.process(SpellCheckComponent.java:189)\r\n\tat org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:208)\r\n\tat org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)\r\n\tat org.apache.solr.core.SolrCore.execute(SolrCore.java:1859)\r\n\tat org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:710)\r\n\tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:413)\r\n\t... 26 more\r\n",

Tireleme fonksiyonu

Merhaba hyph_tr_TR.dic isimli tireleme dosyasını nerede bulabilirim? Sanırım openoffice eklentisi içinde olmalı imiş ama baktığımda içinde bulamadım. Yardımcı olursanız sevinirim, Kolay gelsin.

Cannot parse the word: resime

Even though the word resim (picture) can be parsed as:

[(resim:resim) (Noun;A3sg+Pnon+Nom)]

resime, which should have been parsed as:

[(resim:resim) (Noun;A3sg+Pnon+Dat:e)]

cannot be parsed, resulting in:

[(UNK:resime) (Unk,Unk;Unkown)]

Weird case of disambiguation: kadarıyla

This might lead us to a more general error.
Submit these queries to disambiguator in this order.

Query: kadarıyla

kadarıyla
Sentence  = kadarıyla
Before disambiguation.
Word = kadarıyla
[(kadar:kadar) (Postp)(Noun;A3sg+P3sg:ı+Inst:yla)]

After disambiguation.
Word = kadarıyla
[(kadar:kadar) (Postp)(Noun;A3sg+P3sg:ı+Inst:yla)]

Query: KADARIYLA

Sentence  = KADARIYLA
Before disambiguation.
Word = KADARIYLA
[(kadar:kadar) (Postp)(Noun;A3sg+P3sg:ı+Inst:yla)]
[(Kadarıyla:kadarıyla) (Noun,Prop;A3sg+Pnon+Nom)]

After disambiguation.
Word = KADARIYLA
[(Kadarıyla:kadarıyla) (Noun,Prop;A3sg+Pnon+Nom)]
[(kadar:kadar) (Postp)(Noun;A3sg+P3sg:ı+Inst:yla)]

Query (again): kadarıyla

Sentence  = kadarıyla
Before disambiguation.
Word = kadarıyla
[(Kadarıyla:kadarıyla) (Noun,Prop;A3sg+Pnon+Nom)]
[(kadar:kadar) (Postp)(Noun;A3sg+P3sg:ı+Inst:yla)]

After disambiguation.
Word = kadarıyla
[(Kadarıyla:kadarıyla) (Noun,Prop;A3sg+Pnon+Nom)]
[(kadar:kadar) (Postp)(Noun;A3sg+P3sg:ı+Inst:yla)]

Properly sanitizing the input is a workaround for this case.
I didn't include full sentences in this bug report since the response stays the same for this word, demonstrating this behavior.

Garib bir tokenization and stem problemi

"Pirinç Kasım ayına göre 86, kuşbaşı et 9, beyazpeynir 16, yoğurt 11, bal 10 kuruş arttı."

Best parse uygulandığında sonuçta sadece stem'leri aldığımızda
86 --> 16 olarak çevrilmiş oluyor. Ancak aşağıdaki cümlede bir sorun yok

"86 lira harcardım."

Python usage

Hello,
I'd like to ask if it's possible to use zemberek-nlp in Python?

mvn package fails

Hi,
project does not compile. IntelliJ complans about antlr import org.antlr.v4.runtime.*;
Is this something known? I want to run StemmingAndLemmatization example. And it is not running either. This one fails because of : Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;

Project does not compile with Java 7

The project does not compile with Java 7 (because of one line of code).
I fixed the README in my own fork so that now it says Java 8 is required. Would you like me to send you a pull request with it?

Wrong start and stop indexes for abbreviation words on tokenization.

      ANTLRInputStream inputStream = new ANTLRInputStream(allText);
      TurkishLexer lexer = new TurkishLexer(inputStream);

      CommonTokenStream tokenStream = new CommonTokenStream(lexer);
      tokenStream.fill();
      List<Token> tokens = tokenStream.getTokens();
      for (Token t : tokens){
          System.out.println(t.getStartIndex())
      }

gives wrong index for abbreviation words.

Zemberek cümle analizi

İyi günler. Zemberek kütüphanesini kullanarak cümle analizi yapmaya çalışıyorum. Bununla ilgili bir kod denemem oldu fakat şöyle bir sorun oluştu ki kod derlendikten sonra cümledeki kelimelerin, boşlukların ve noktalama işaretlerinin ayrımını yapıyor fakat kelimelerin detaylı açıklamasını çıktı olarak vermeyip hafızadaki adreslerini döndürüyor.
Kelimelerin içeriğini istediğim kod parçası şu şekildedir:

for (int i = 0; i < analizDizisi.size(); i++) {
if (analizDizisi.get(i).tip == YaziBirimiTipi.KELIME) {
System.out.println(zemberek.kelimeCozumle(analizDizisi.get(i).icerik));
}
Bu konuda yardımınızı talep ediyorum.

resource test-lexicon-nouns.txt not found

TurkishDictionaryLoaderTest fails with "resource test-lexicon-nouns.txt not found". I couldn't find the file in the repo either.

Did you forget to commit it or is this done on purpose?

This is the test:

@Test
    public void loadNounsFromFileTest() throws IOException {
        TurkishDictionaryLoader loader = new TurkishDictionaryLoader(suffixProvider);
        RootLexicon items = loader.load(new File(Resources.getResource("test-lexicon-nouns.txt").getFile()));

        Assert.assertFalse(items.isEmpty());
        for (DictionaryItem item : items) {
            Assert.assertTrue(item.primaryPos == Noun);
        }
    }

This is the error:
`java.lang.IllegalArgumentException: resource test-lexicon-nouns.txt not found.

at com.google.common.base.Preconditions.checkArgument(Preconditions.java:120)
at com.google.common.io.Resources.getResource(Resources.java:222)
at zemberek.morphology.lexicon.TurkishDictionaryLoaderTest.loadNounsFromFileTest(TurkishDictionaryLoaderTest.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:24)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

`

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.