Python自然语言处理工具小结

作者:白宁超

2016年11月21日21:45:26

目录


【Python NLP】干货!详述Python NLTK下如何使用stanford NLP工具包(1)

【Python NLP】Python 自然语言处理工具小结(2)

【Python NLP】Python NLTK 走进大秦帝国(3)

【Python NLP】Python NLTK获取文本语料和词汇资源(4)

【Python NLP】Python NLTK处理原始文本(5)

1 Python 的几个自然语言处理工具

  1. NLTK:NLTK 在用 Python 处理自然语言的工具中处于领先的地位。它提供了 WordNet 这种方便处理词汇资源的借口,还有分类、分词、除茎、标注、语法分析、语义推理等类库。
  2. Pattern:Pattern 的自然语言处理工具有词性标注工具(Part-Of-Speech Tagger),N元搜索(n-gram search),情感分析(sentiment analysis),WordNet。支持机器学习的向量空间模型,聚类,向量机。
  3. TextBlob:TextBlob 是一个处理文本数据的 Python 库。提供了一些简单的api解决一些自然语言处理的任务,例如词性标注、名词短语抽取、情感分析、分类、翻译等等。

  4. Gensim:Gensim 提供了对大型语料库的主题建模、文件索引、相似度检索的功能。它可以处理大于RAM内存的数据。作者说它是“实现无干预从纯文本语义建模的最强大、最高效、最无障碍的软件。
  5. PyNLPI:它的全称是:Python自然语言处理库(Python Natural Language Processing Library,音发作: pineapple) 这是一个各种自然语言处理任务的集合,PyNLPI可以用来处理N元搜索,计算频率表和分布,建立语言模型。他还可以处理向优先队列这种更加复杂的数据结构,或者像 Beam 搜索这种更加复杂的算法。
  6. spaCy:这是一个商业的开源软件。结合Python和Cython,它的自然语言处理能力达到了工业强度。是速度最快,领域内最先进的自然语言处理工具。
  7. Polyglot:Polyglot 支持对海量文本和多语言的处理。它支持对165种语言的分词,对196中语言的辨识,40种语言的专有名词识别,16种语言的词性标注,136种语言的情感分析,137种语言的嵌入,135种语言的形态分析,以及69中语言的翻译。
  8. MontyLingua:MontyLingua 是一个自由的、训练有素的、端到端的英文处理工具。输入原始英文文本到 MontyLingua ,就会得到这段文本的语义解释。适合用来进行信息检索和提取,问题处理,回答问题等任务。从英文文本中,它能提取出主动宾元组,形容词、名词和动词短语,人名、地名、事件,日期和时间,等语义信息。
  9. BLLIP Parser:BLLIP Parser(也叫做Charniak-Johnson parser)是一个集成了产生成分分析和最大熵排序的统计自然语言工具。包括 命令行 和 python接口 。
  10. Quepy:Quepy是一个Python框架,提供将自然语言转换成为数据库查询语言。可以轻松地实现不同类型的自然语言和数据库查询语言的转化。所以,通过Quepy,仅仅修改几行代码,就可以实现你自己的自然语言查询数据库系统。GitHub:https://github.com/machinalis/quepy
  11. HanNLP:HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。不仅仅是分词,而是提供词法分析、句法分析、语义理解等完备的功能。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。文档使用操作说明:Python调用自然语言处理包HanLP 和 菜鸟如何调用HanNLP

OpenNLP:进行中文命名实体识别

OpenNLP是Apach下的Java自然语言处理API,功能齐全。如下给大家介绍一下使用OpenNLP进行中文语料命名实体识别的过程。

首先是预处理工作,分词去听用词等等的就不啰嗦了,其实将分词的结果中间加上空格隔开就可以了,OpenNLP可以将这样形式的的语料照处理英文的方式处理,有些关于字符处理的注意点在后面会提到。

其次我们要准备各个命名实体类别所对应的词库,词库被存在文本文档中,文档名即是命名实体类别的TypeName,下面两个function分别是载入某类命名实体词库中的词和载入命名实体的类别。

  1. /**
  2. * 载入词库中的命名实体
  3. *
  4. * @param nameListFile
  5. * @return
  6. * @throws Exception
  7. */
  8. public static List<String> loadNameWords(File nameListFile)
  9. throws Exception {
  10. List<String> nameWords = new ArrayList<String>();
  11.  
  12. if (!nameListFile.exists() || nameListFile.isDirectory()) {
  13. System.err.println("不存在那个文件");
  14. return null;
  15. }
  16.  
  17. BufferedReader br = new BufferedReader(new FileReader(nameListFile));
  18. String line = null;
  19. while ((line = br.readLine()) != null) {
  20. nameWords.add(line);
  21. }
  22.  
  23. br.close();
  24.  
  25. return nameWords;
  26. }
  27.  
  28. /**
  29. * 获取命名实体类型
  30. *
  31. * @param nameListFile
  32. * @return
  33. */
  34. public static String getNameType(File nameListFile) {
  35. String nameType = nameListFile.getName();
  36.  
  37. return nameType.substring(0, nameType.lastIndexOf("."));
  38. }

因为OpenNLP要求的训练语料是这样子的:

  1. XXXXXX<START:Person>????<END>XXXXXXXXX<START:Action>????<END>XXXXXXX

被标注的命名实体被放在<START><END>范围中,并标出了实体的类别。接下来是对命名实体识别模型的训练,先上代码:

  1. import java.io.File;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.StringReader;
  5. import java.util.Collections;
  6.  
  7. import opennlp.tools.namefind.NameFinderME;
  8. import opennlp.tools.namefind.NameSample;
  9. import opennlp.tools.namefind.NameSampleDataStream;
  10. import opennlp.tools.namefind.TokenNameFinderModel;
  11. import opennlp.tools.util.ObjectStream;
  12. import opennlp.tools.util.PlainTextByLineStream;
  13. import opennlp.tools.util.featuregen.AggregatedFeatureGenerator;
  14. import opennlp.tools.util.featuregen.PreviousMapFeatureGenerator;
  15. import opennlp.tools.util.featuregen.TokenClassFeatureGenerator;
  16. import opennlp.tools.util.featuregen.TokenFeatureGenerator;
  17. import opennlp.tools.util.featuregen.WindowFeatureGenerator;
  18.  
  19. /**
  20. * 中文命名实体识别模型训练组件
  21. *
  22. * @author ddlovehy
  23. *
  24. */
  25. public class NamedEntityMultiFindTrainer {
  26.  
  27. // 默认参数
  28. private int iterations = 80;
  29. private int cutoff = 5;
  30. private String langCode = "general";
  31. private String type = "default";
  32.  
  33. // 待设定的参数
  34. private String nameWordsPath; // 命名实体词库路径
  35. private String dataPath; // 训练集已分词语料路径
  36. private String modelPath; // 模型存储路径
  37.  
  38. public NamedEntityMultiFindTrainer() {
  39. super();
  40. // TODO Auto-generated constructor stub
  41. }
  42.  
  43. public NamedEntityMultiFindTrainer(String nameWordsPath, String dataPath,
  44. String modelPath) {
  45. super();
  46. this.nameWordsPath = nameWordsPath;
  47. this.dataPath = dataPath;
  48. this.modelPath = modelPath;
  49. }
  50.  
  51. public NamedEntityMultiFindTrainer(int iterations, int cutoff,
  52. String langCode, String type, String nameWordsPath,
  53. String dataPath, String modelPath) {
  54. super();
  55. this.iterations = iterations;
  56. this.cutoff = cutoff;
  57. this.langCode = langCode;
  58. this.type = type;
  59. this.nameWordsPath = nameWordsPath;
  60. this.dataPath = dataPath;
  61. this.modelPath = modelPath;
  62. }
  63.  
  64. /**
  65. * 生成定制特征
  66. *
  67. * @return
  68. */
  69. public AggregatedFeatureGenerator prodFeatureGenerators() {
  70. AggregatedFeatureGenerator featureGenerators = new AggregatedFeatureGenerator(
  71. new WindowFeatureGenerator(new TokenFeatureGenerator(), 2, 2),
  72. new WindowFeatureGenerator(new TokenClassFeatureGenerator(), 2,
  73. 2), new PreviousMapFeatureGenerator());
  74.  
  75. return featureGenerators;
  76. }
  77.  
  78. /**
  79. * 将模型写入磁盘
  80. *
  81. * @param model
  82. * @throws Exception
  83. */
  84. public void writeModelIntoDisk(TokenNameFinderModel model) throws Exception {
  85. File outModelFile = new File(this.getModelPath());
  86. FileOutputStream outModelStream = new FileOutputStream(outModelFile);
  87. model.serialize(outModelStream);
  88. }
  89.  
  90. /**
  91. * 读出标注的训练语料
  92. *
  93. * @return
  94. * @throws Exception
  95. */
  96. public String getTrainCorpusDataStr() throws Exception {
  97.  
  98. // TODO 考虑入持久化判断直接载入标注数据的情况 以及增量式训练
  99.  
  100. String trainDataStr = null;
  101. trainDataStr = NameEntityTextFactory.prodNameFindTrainText(
  102. this.getNameWordsPath(), this.getDataPath(), null);
  103.  
  104. return trainDataStr;
  105. }
  106.  
  107. /**
  108. * 训练模型
  109. *
  110. * @param trainDataStr
  111. * 已标注的训练数据整体字符串
  112. * @return
  113. * @throws Exception
  114. */
  115. public TokenNameFinderModel trainNameEntitySamples(String trainDataStr)
  116. throws Exception {
  117. ObjectStream<NameSample> nameEntitySample = new NameSampleDataStream(
  118. new PlainTextByLineStream(new StringReader(trainDataStr)));
  119.  
  120. System.out.println("**************************************");
  121. System.out.println(trainDataStr);
  122.  
  123. TokenNameFinderModel nameFinderModel = NameFinderME.train(
  124. this.getLangCode(), this.getType(), nameEntitySample,
  125. this.prodFeatureGenerators(),
  126. Collections.<String, Object> emptyMap(), this.getIterations(),
  127. this.getCutoff());
  128.  
  129. return nameFinderModel;
  130. }
  131.  
  132. /**
  133. * 训练组件总调用方法
  134. *
  135. * @return
  136. */
  137. public boolean execNameFindTrainer() {
  138.  
  139. try {
  140. String trainDataStr = this.getTrainCorpusDataStr();
  141. TokenNameFinderModel nameFinderModel = this
  142. .trainNameEntitySamples(trainDataStr);
  143. // System.out.println(nameFinderModel);
  144. this.writeModelIntoDisk(nameFinderModel);
  145.  
  146. return true;
  147. } catch (Exception e) {
  148. // TODO Auto-generated catch block
  149. e.printStackTrace();
  150.  
  151. return false;
  152. }
  153. }

注:

  • 参数:iterations是训练算法迭代的次数,太少了起不到训练的效果,太大了会造成过拟合,所以各位可以自己试试效果;
  • cutoff:语言模型扫描窗口的大小,一般设成5就可以了,当然越大效果越好,时间可能会受不了;
  • langCode:语种代码和type实体类别,因为没有专门针对中文的代码,设成“普通”的即可,实体的类别因为我们想训练成能识别多种实体的模型,于是设置为“默认”。

说明:

  • prodFeatureGenerators()方法用于生成个人订制的特征生成器,其意义在于选择什么样的n-gram语义模型,代码当中显示的是选择窗口大小为5,待测命名实体词前后各扫描两个词的范围计算特征(加上自己就是5个),或许有更深更准确的意义,请大家指正;
  • trainNameEntitySamples()方法,训练模型的核心,首先是将如上标注的训练语料字符串传入生成字符流,再通过NameFinderME的train()方法传入上面设定的各个参数,订制特征生成器等等,关于源实体映射对,就按默认传入空Map就好了。

源代码开源在:https://github.com/Ailab403/ailab-mltk4j,test包里面对应有完整的调用demo,以及file文件夹里面的测试语料和已经训练好的模型。

3 StanfordNLP:

Stanford NLP Group是斯坦福大学自然语言处理的团队,开发了多个NLP工具。其开发的工具包括以下内容:

  • Stanford CoreNLP : 采用Java编写的面向英文的处理工具,下载网址为:。主要功能包括分词、词性标注、命名实体识别、语法分析等。
  • Stanford Word Segmenter : 采用CRF(条件随机场)算法进行分词,也是基于Java开发的,同时可以支持中文和Arabic,官方要求Java版本1.6以上,推荐内存至少1G。

简单的示例程序:

  1. //设置分词器属性。
  2. Properties props = new Properties();
  3. //字典文件地址,可以用绝对路径,如d:/data
  4. props.setProperty("sighanCorporaDict", "data");
  5. //字典压缩包地址,可以用绝对路径
  6. props.setProperty("serDictionary","data/dict-chris6.ser.gz");
  7. //输入文字的编码;
  8. props.setProperty("inputEncoding", "UTF-8");
  9. props.setProperty("sighanPostProcessing", "true");
  10. //初始化分词器,
  11. CRFClassifier classifier = new CRFClassifier(props);
  12. //从持久化文件中加载分词器设置;
  13. classifier.loadClassifierNoExceptions("data/ctb.gz", props);
  14. // flags must be re-set after data is loaded
  15. classifier.flags.setProperties(props);
  16. //分词
  17. List words = classifier.segmentString("语句内容");

最后附上关于中文分词器性能比较的一篇文章:http://www.cnblogs.com/wgp13x/p/3748764.html

实现中文命名实体识别

1、分词介绍

斯坦福大学的分词器,该系统需要JDK 1.8+,从上面链接中下载stanford-segmenter-2014-10-26,解压之后,如下图所示
进入data目录,其中有两个gz压缩文件,分别是ctb.gz和pku.gz,其中CTB:宾州大学的中国树库训练资料 ,PKU:中国北京大学提供的训练资料。当然了,你也可以自己训练,一个训练的例子可以在这里面看到http://nlp.stanford.edu/software/trainSegmenter-20080521.tar.gz

2、NER介绍

斯坦福NER是采用Java实现,可以识别出(PERSON,ORGANIZATION,LOCATION),使用本软件发表的研究成果需引用下述论文:
下载地址在:http://nlp.stanford.edu/~manning/papers/gibbscrf3.pdf
在NER页面可以下载到两个压缩文件,分别是stanford-ner-2014-10-26和stanford-ner-2012-11-11-chinese
将两个文件解压可看到
默认NER可以用来处理英文,如果需要处理中文要另外处理。
3、分词和NER使用
在Eclipse中新建一个Java Project,将data目录拷贝到项目根路径下,再把stanford-ner-2012-11-11-chinese解压的内容全部拷贝到classifiers文件夹下,将stanford-segmenter-3.5.0加入到classpath之中,将classifiers文件夹拷贝到项目根目录,将stanford-ner-3.5.0.jar和stanford-ner.jar加入到classpath中。最后,去http://nlp.stanford.edu/software/corenlp.shtml下载stanford-corenlp-full-2014-10-31,将解压之后的stanford-corenlp-3.5.0也加入到classpath之中。最后的Eclipse中结构如下:
Chinese NER:这段说明,很清晰,需要将中文分词的结果作为NER的输入,然后才能识别出NER来。
同时便于测试,本Demo使用junit-4.10.jar,下面开始上代码
  1. import edu.stanford.nlp.ie.AbstractSequenceClassifier;
  2. import edu.stanford.nlp.ie.crf.CRFClassifier;
  3. import edu.stanford.nlp.ling.CoreLabel;
  4.  
  5. /**
  6. *
  7. * <p>
  8. * ClassName ExtractDemo
  9. * </p>
  10. * <p>
  11. * Description 加载NER模块
  12. *
  13. */
  14. public class ExtractDemo {
  15. private static AbstractSequenceClassifier<CoreLabel> ner;
  16. public ExtractDemo() {
  17. InitNer();
  18. }
  19. public void InitNer() {
  20. String serializedClassifier = "classifiers/chinese.misc.distsim.crf.ser.gz"; // chinese.misc.distsim.crf.ser.gz
  21. if (ner == null) {
  22. ner = CRFClassifier.getClassifierNoExceptions(serializedClassifier);
  23. }
  24. }
  25.  
  26. public String doNer(String sent) {
  27. return ner.classifyWithInlineXML(sent);
  28. }
  29.  
  30. public static void main(String args[]) {
  31. String str = "我 去 吃饭 , 告诉 李强 一声 。";
  32. ExtractDemo extractDemo = new ExtractDemo();
  33. System.out.println(extractDemo.doNer(str));
  34. System.out.println("Complete!");
  35. }
  36.  
  37. }
  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.util.Properties;
  4.  
  5. import org.apache.commons.io.FileUtils;
  6.  
  7. import edu.stanford.nlp.ie.crf.CRFClassifier;
  8. import edu.stanford.nlp.ling.CoreLabel;
  9.  
  10. /**
  11. *
  12. * <p>
  13. * Description 使用Stanford CoreNLP进行中文分词
  14. * </p>
  15. *
  16. */
  17. public class ZH_SegDemo {
  18. public static CRFClassifier<CoreLabel> segmenter;
  19. static {
  20. // 设置一些初始化参数
  21. Properties props = new Properties();
  22. props.setProperty("sighanCorporaDict", "data");
  23. props.setProperty("serDictionary", "data/dict-chris6.ser.gz");
  24. props.setProperty("inputEncoding", "UTF-8");
  25. props.setProperty("sighanPostProcessing", "true");
  26. segmenter = new CRFClassifier<CoreLabel>(props);
  27. segmenter.loadClassifierNoExceptions("data/ctb.gz", props);
  28. segmenter.flags.setProperties(props);
  29. }
  30.  
  31. public static String doSegment(String sent) {
  32. String[] strs = (String[]) segmenter.segmentString(sent).toArray();
  33. StringBuffer buf = new StringBuffer();
  34. for (String s : strs) {
  35. buf.append(s + " ");
  36. }
  37. System.out.println("segmented res: " + buf.toString());
  38. return buf.toString();
  39. }
  40.  
  41. public static void main(String[] args) {
  42. try {
  43. String readFileToString = FileUtils.readFileToString(new File("澳门141人食物中毒与进食“问题生蚝”有关.txt"));
  44. String doSegment = doSegment(readFileToString);
  45. System.out.println(doSegment);
  46.  
  47. ExtractDemo extractDemo = new ExtractDemo();
  48. System.out.println(extractDemo.doNer(doSegment));
  49.  
  50. System.out.println("Complete!");
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54.  
  55. }
  56. }

注意一定是JDK 1.8+的环境,最后输出结果如下:

4 IKAnalyzer

IK Analyzer是一个开源的,基于Java语言开发的轻量级的中文分词工具包。IK支持细粒度和智能分词两种切分模式,支持英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符。可以支持用户自定义的词典,通过配置IKAnalyzer.cfg.xml文件来实现,可以配置自定义的扩展词典和停用词典。词典需要采用UTF-8无BOM格式编码,并且每个词语占一行。配置文件如下所示:

  1. <properties>
  2. <comment>IK Analyzer 扩展配置</comment>
  3. <!--用户可以在这里配置自己的扩展字典-->
  4. <entry key="ext_dict">ext.dic;</entry>
  5.  
  6. <!--用户可以在这里配置自己的扩展停止词字典-->
  7. <entry key="ext_stopwords">stopword.dic;chinese_stopword.dic</entry>
  8.  
  9. </properties>

只需要把IKAnalyzer2012_u6.jar部署于项目的lib中,同时将IKAnalyzer.cfg.xml文件以及词典文件置于src中,即可通过API的方式开发调用。IK简单、易于扩展,分词结果较好并且采用Java编写,因为我平时的项目以Java居多,所以是我平时处理分词的首选工具。示例代码:

  1. /**
  2. * IK分词功能实现
  3. * @return
  4. */
  5. public String spiltWords(String srcString){
  6. StringBuffer wordsBuffer = new StringBuffer("");
  7. try{
  8. IKSegmenter ik=new IKSegmenter(new StringReader(srcString), true);
  9. Lexeme lex=null;
  10. while((lex=ik.next())!=null){
  11. // System.out.print(lex.getLexemeText()+" ");
  12. wordsBuffer.append(lex.getLexemeText()).append(" ");
  13. }
  14. }catch(Exception e){
  15. logger.error(e.getMessage());
  16. }
  17. return wordsBuffer.toString();
  18. }

5 中科院ICTCLAS

ICTCLAS是由中科院计算所历经数年开发的分词工具,采用C++编写。最新版本命名为ICTCLAS2013,又名为NLPIR汉语分词系统。主要功能包括中文分词、词性标注、命名实体识别、用户词典功能,同时支持GBK编码、UTF8编码、BIG5编码,新增微博分词、新词发现与关键词提取。可以可视化界面操作和API方式调用。

6 FudanNLP

FudanNLP主要是为中文自然语言处理而开发的工具包,也包含为实现这些任务的机器学习算法和数据集。FudanNLP及其包含数据集使用LGPL3.0许可证。主要功能包括:

  • 信息检索:文本分类,新闻聚类。
  • 中文处理:中文分词,词性标注,实体名识别,关键词抽取,依存句法分析,时间短语识别。
  • 结构化学习:在线学习,层次分类,聚类,精确推理。

工具采用Java编写,提供了API的访问调用方式。下载安装包后解压后,内容如下图所示:

在使用时将fudannlp.jar以及lib中的jar部署于项目中的lib里面。models文件夹中存放的模型文件,主要用于分词、词性标注和命名实体识别以及分词所需的词典;文件夹example中主要是使用的示例代码,可以帮助快速入门和使用;java-docs是API帮助文档;src中存放着源码;PDF文档中有着比较详细的介绍和自然语言处理基础知识的讲解。初始运行程序时初始化时间有点长,并且加载模型时占用内存较大。在进行语法分析时感觉分析的结果不是很准确。

 

 

Python自然语言处理工具小结的更多相关文章

  1. Python包管理工具小结

    此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 作为一名接触Python有一段时间的初学者,越来越体会到Python的方便之处,它使人能更 多的关注业务本身 ...

  2. Python自然语言处理工具NLTK的安装FAQ

    1 下载Python 首先去python的主页下载一个python版本http://www.python.org/,一路next下去,安装完毕即可 2 下载nltk包 下载地址:http://www. ...

  3. Python中调用自然语言处理工具HanLP手记

    手记实用系列文章: 1 结巴分词和自然语言处理HanLP处理手记 2 Python中文语料批量预处理手记 3 自然语言处理手记 4 Python中调用自然语言处理工具HanLP手记 5 Python中 ...

  4. Python 的十个自然语言处理工具

    原文 先mark,后续尝试. 1.NLTK NLTK 在用 Python 处理自然语言的工具中处于领先的地位.它提供了 WordNet 这种方便处理词汇资源的借口,还有分类.分词.除茎.标注.语法分析 ...

  5. 【转】Python 爬虫的工具列表【预】

    这个列表包含与网页抓取和数据处理的Python库 网络 通用 urllib -网络库(stdlib). requests -网络库. grab – 网络库(基于pycurl). pycurl – 网络 ...

  6. python入门:python包管理工具pip的安装

    pip 是一个安装和管理 Python 包的工具 , 是 easy_install 的一个替换品. distribute是setuptools的取代(Setuptools包后期不再维护了),pip是e ...

  7. Python 爬虫的工具列表 附Github代码下载链接

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  8. 批量下载网站图片的Python实用小工具(下)

    引子 在 批量下载网站图片的Python实用小工具 一文中,讲解了开发一个Python小工具来实现网站图片的并发批量拉取.不过那个工具仅限于特定网站的特定规则,本文将基于其代码实现,开发一个更加通用的 ...

  9. Python 爬虫的工具列表大全

    Python 爬虫的工具列表大全 这个列表包含与网页抓取和数据处理的Python库.网络 通用 urllib -网络库(stdlib). requests -网络库. grab – 网络库(基于pyc ...

随机推荐

  1. 一看就懂的ReactJs入门教程-精华版

    现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领 ...

  2. 04.LoT.UI 前后台通用框架分解系列之——轻巧的弹出框

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  3. 前端学HTTP之web攻击技术

    前面的话 简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标.本文将详细介绍攻击web站点 ...

  4. .net Elasticsearch 学习入门笔记

    一. es安装相关1.elasticsearch安装  运行http://localhost:9200/2.head插件3.bigdesk插件安装(安装细节百度:windows elasticsear ...

  5. CSS知识总结(七)

    CSS常用样式 5.背景样式 1)背景颜色 background-color : transparent | color 常用值:①英文单词,②十六进制,③RGB或RGBA 另外,还有一种是 渐变色彩 ...

  6. 基于Vue2.0的单页面开发方案

    2016的最后一天,多多少少都应该总结一下这一年的得失,哪里做的好,哪里需要改进,记一笔,或许将来会用到呢. 毕业差不多半年了,一直是一个人在负责公司项目的前端开发与维护,当时公司希望前后端分离,提高 ...

  7. JDK安装与配置

    JDK安装与配置 一.下载 JDK是ORACLE提供免费下载使用的,官网地址:https://www.oracle.com/index.html 一般选择Java SE版本即可,企业版的选择Java ...

  8. Linux系统中的Device Mapper学习

    在linux系统中你使用一些命令时(例如nmon.iostat 如下截图所示),有可能会看到一些名字为dm-xx的设备,那么这些设备到底是什么设备呢,跟磁盘有什么关系呢?以前不了解的时候,我也很纳闷. ...

  9. 自制文件上传JS控件,支持IE、chrome、firefox etc.

    (function() { if (window.FileUpload) { return; } window.FileUpload = function (id, url) { this.id = ...

  10. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...