-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.xml
More file actions
215 lines (215 loc) · 112 KB
/
Copy pathsearch.xml
File metadata and controls
215 lines (215 loc) · 112 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title><![CDATA[XGBoost 参数说明]]></title>
<url>%2F2018%2F08%2F05%2Fxgboost-parameter-description%2F</url>
<content type="text"><![CDATA[XGBoost 参数XGBoost 官方参数说明文档,XGBoost 版本:0.72。 在运行 XGBoost 之前,必须设置三种类型参数:通用参数(General Parameters)、提升参数(Booster Parameters)和任务参数(Task Parameters)。 通用参数(General Parameters):设置整体功能,参数控制在提升(boosting)过程中使用哪种booster,常用的booster有树模型(tree model)和线性模型(linear model)。 提升参数(Booster Parameters):这取决于使用哪种booster(树or回归)。 任务参数(Task Parameters):控制学习的场景,例如在回归问题中会使用不同的参数控制排序。 通用参数(General Parameters)下面这些参数定义了 XGBoost 的总体功能: booster [default=gbtree] 选择每次迭代过程中需要运行的模型,一共有两种模型可以选择: gbtree:使用基于树的模型进行提升计算; gblinear:使用线性模型进行提升计算; silent [default=0] 设置模型是否打印运行时信息: 0:打印出运行时信息 1:不打印出运行时信息 nthread [default=可用的最大线程数] XGBoost 运行时的线程数,默认值为当前系统可以获得的最大线程数。 num_pbuffer [由 XGBoost 自动设置,不需要用户设置] 预测缓冲区的大小,通常设置为训练实例的数目。缓冲区用于保存最后一次升压步骤的预测结果。 num_feature [由 XGBoost 自动设置,不需要用户设置] boosting 过程中用到的特征维数,设置为特征个数。 提升参数(Booster Parameters)树模型 Booster 参数 eta [default=0.3,别名: learning_rate] 为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。eta 通过缩减每一步特征的权重使提升计算过程更加保守,使得模型更加健壮。 取值范围:[0,1]。典型值一般设置为:0.01~0.2。 gamma [default=0,别名:min_split_loss] 在树的叶子节点上进行进一步分割,所需要的最小损失函数减少的大小。越大,算法就越保守。这个值一般来说需要根据损失函数来调整。 取值范围:[0,∞] max_depth [default=6] 树的最大深度,值越大,树越复杂。可以用来控制过拟合。 取值范围:[1,∞]。典型值是3-10。 min_child_weight [default=1] 孩子节点中最小的样本权重(hessian)和。如果一个叶子节点的样本权重和小于min_child_weight,则拆分过程将放弃进一步的划分。在线性回归任务中,这个参数是指建立每个模型所需要的最小样本数。该参数越大算法越保守。这个参数可以用来减少过拟合,但是过高的值也会导致欠拟合,因此可以通过交叉验证来调。 取值范围: [0,∞] max_delta_step [default=0] 最大增量步骤,我们允许每个叶子输出。如果该值设置为0,则意味着没有约束。如果它被设置为正值,有助于更新步骤更加保守。通常不需要这个参数,当类是非常不平衡的时,它可能有助于 logistic 回归。将其设置为 1~10 的值可能有助于控制更新。 取值范围:[0,∞] subsample [default=1] 用于训练模型的子样本占整个样本集合的比例。如果设置为0.5则意味着 XGBoost 将随机的从整个样本集合中随机的抽取出50%的子样本建立树模型,这能够防止过拟合。 取值范围为:(0,1] colsample_bytree [default=1] 在构建每棵树时,列的采样比(一般是特征采样比)。在每次 boosting 迭代中都会出现一次采样。 取值范围:(0,1] colsample_bylevel [default=1] 在每个级别上,每个样本的子样本比。每次进行新的分割时,都会出现次采样。当 tree_method 设置为hist时,此参数没有任何影响。这个一般很少用,subsample 和 colsample_bytree 参数调节就足够了。 lambda [default=1, 别名: reg_lambda] 权重的L2正则化项,增加这个值会使模型更保守。这个其实用的很少。 alpha [default=0, 别名: reg_alpha] 权重的L1正则化项,增加这个值会使模型更保守。这个主要是用在数据维度很高的情况下,可以提高运行速度。 tree_method [default=auto] XGBoost 中使用的树构造算法。参见参考文献中的描述。 分布式和外存版本只支持近似算法(tree_method=approx)。 选项: ‘auto’、’approx’、’exact’、’hist’、’gpu_exact’、’gpu_hist’。 ‘auto’: 用启发式方法去选择最快的一个。 对于小到中数据集,将使用精确的贪心算法。 对于大数据集,会选择近似算法。 由于之前总是在单台机器上使用精确的贪心算法,所以当选择近似算法时,用户会得到一条消息来通知这个选择。 ‘exact’: 使用贪心算法 ‘approx’: 使用草图和直方图的近似贪心算法 ‘hist’: 快速直方图优化近似贪婪算法。它使用了一些性能改进,比如垃圾箱缓存。 ‘gpu_exact’: 使用gpu执行exact算法 ‘gpu_hist’: 使用gpu执行hist算法 sketch_eps [default=0.03] 这个选项适用于近似贪心算法。 这大概可以理解为O(1/sketcheps)数量的箱子。与直接选择的箱数相比,该方法具有一定的理论保证和梗概精度。 通常用户不需要调整这个参数,但是使用一个较低的值唯一获得更多的精确的列举。 取值范围:(0,1) scale_pos_weight [default=1] 用于类别不平衡的情况下,控制正负权重的平衡。将参数设置大于0,可以加快收敛。 updater [default=grow_colmaker,prune] 一个逗号分隔的字符串,定义了要运行的树更新器的序列,提供了一种构造和修改树的模块化方法。这是一个高级的参数通常设置为自动的,取决于其他参数。它也可以被用户明确的定义。有下列的更新器插件: ‘grow_colmaker’: 非分布的基于列的树结构。 ‘discol’: 采用基于列的数据分割模式的分布式树结构。 ‘grow_histmaker’: 基于基于直方图计数的全局建议的基于行的数据分割的分布式树结构。 ‘grow_local_histmaker’: 基于局部直方图计数。 ‘grow_skmaker’: 使用近似的草图算法。 ‘refresh’: 根据当前数据刷新树的统计和/或叶值。注意,不执行任何随机的数据行子抽样。 ‘prune’: 在损失小于min_split_loss (or gamma)的情况下修剪。 在分布式设置中,updater序列应该调整为’grow_histmaker,prune’ refresh_leaf [default=1] 设置一个刷新updater插件的参数。当标志为1时,树叶和树节点的统计信息都更新了。当标志为0时,只更新节点属性。 process_type [default=default] 一种可运行的 boosting 过程 选项: {‘default’,’update’} ‘default’: 普通的 boosting 过程来创建新的树。 ‘update’: 从一个已经存在的模型并且仅仅更新它的树。在每一次 boosting 迭代,从初始模型得到的树,一个指定序列的 updater 插件为这些树运行,修改后的树被添加到新的模型。新的模型可能有相同或者更少的树,取决于 boosting 迭代的次数。目前,以下内置的 updater 插件可以与此过程类型有意义的使用:’refresh’, ‘prune’。如果 process_type=update,你就不能使用 updater 插件来创建新的树。 grow_policy [default=depthwise] 控制节点被添加到树的方式 目前仅仅支持 tree_method=hist 时的设置。 选项: {‘depthwise’, ‘lossguide’} ‘depthwise’: 在离根最近的节点处分割 ‘lossguide’: 在最大的 loss 改变出分割 max_leaves [default=0] 最多添加的节点数量。仅当 grow_policy=lossguide 时相关。 max_bin [default=256] 仅当 tree_method=hist 时有用。 最大的离散箱数,以存储连续的特性。 增加这个数字可以减少计算时间成本。 predictor [default=cpu_predictor] 选择预测算法的类型。提供同样的结果但是可以选择使用CPU或者GPU。 cpu_predictor: 使用多核CPU预测算法。 gpu_predictor: 使用gpu预测。如果 tree_method 设置为 gpu_exact 或者 gpu_hist,那么这个就是默认选项。 Dart Booster 额外的参数(booster=dart)Dart Booster 将 dropout 引入模型,这里的 dropout 不是直接扔掉,而是变权值。 sample_type [default=uniform] 算法抽样的类型 uniform: 均匀选择树 dropped。 weighted: 按照权重来选择树dropped。 normalize_type [default=tree] 归一化算法的类型 tree: 新的树和每一个 dropped 树有同样的权重。 新的树的权重为 1 / (k + learning_rate)。 dropped 树乘以一个系数 k / (k + learning_rate)。 forest: 新的树和所有 dropped 树的和有相同的权重。 新的树的权重为 1 / (1 + learning_rate)。 dropped 树乘以一个系数 1 / (1 + learning_rate)。 rate_drop [default=0.0] dropout的概率(在生成的树中 dropped 一部分)。 取值范围: [0.0, 1.0] one_drop [default=0] 当这个被设置时,至少有一个树始终会被 dropped(支持原始 DART 论文中的 Binomial-plus-one 或 epsilon-dropout). skip_drop [default=0.0] 在 boosting 迭代的过程中略过 dropout 过程的概率。 如果一次 dropout 被略过,新的树被添加进 model 用和 gbtree 一样的方式。 非0的 skip_drop 比 rate_drop 和 one_drop 有更高的优先级。 取值范围: [0.0, 1.0] 线性Booster的参数(booster=gblinear) lambda [default=0, 别名:reg_lambda] L2正则化的权重,增加该参数的值会让模型更保守 alpha [default=0, 别名:reg_alpha] L1正则化的权重,增加这个值会让模型更保守。归一化到训练实例的数量。 updater [default=shotgun] 选择算法拟合线性模型 shotgun: 基于 shotgun 算法的并行坐标下降算法。使用 ‘HOGRAVE’ 并行性,因此在每次运行时产生一个非确定性的解决方案。 coord_descent: 普通坐标下降算法。而且多线程下仍然产生确定性的解决方案。 Tweedie Regression 的参数(objective=reg:tweedie) tweedie_variance_power [default=1.5] 在 Tweedie 分布上控制方差的参数 var(y)~E(y)^tweedie_variance_power 取值范围: (1,2) 值越接近2越接近 gamma 分布 值越接近1越接近 Poisson 分布 学习任务参数(Learning Task Parameters)指定学习任务和相应的学习目标。下面的目标选项如下: objective [default=reg:linear] ‘reg:linear’:线性回归。 ‘reg:logistic’:逻辑回归。 ‘binary:logistic’:二分类的逻辑回归,输出概率。 ‘binary:logitraw’:二分类的逻辑回归,在逻辑变换前输出得分。 ‘binary:hinge’:二分类的 hinge loss。使得预测结果为0或1,而不是产生概率。 ‘gpu:reg:linear, gpu:reg:logistic, gpu:binary:logistic, gpu:binary:logitraw’: 对应在 GPU 上评价的目标函数版本。注意,像 GPU 直方图算法一样,它们只能在整个训练期间使用相同数据集时使用。 ‘count:poisson’:用于统计数据的 poisson 回归,输出 poisson 分布均值。 max_delta_step:在 poisson 回归中默认值设置为0.7(用于维护优化)。 ‘survival:cox’:用于正确删除的生存时间数据的 Cox 回归(被正确删除的作为负例)。注意,预测是按危害比表中的值返回。(例如:在比例风险函数h(t) = h0(t) * HR中,HR = exp(marginal_prediction)。 ‘multi:softmax’:设置 XGBoost 做多分类任务用 softmax 目标,你需要指定 num_class。 ‘multi:softprob’:和 softmax 一样,但是输出的是一个 ndata nclass 的向量,可以进一步变形为 ndata nclass 的矩阵。结果包含预测的每个数据属于每个类的概率值。 ‘rank:pairwise’:通过最小化 pairwise loss,设置 XGBoost 用于排序任务。 ‘reg:gamma’:用 log-link 的 gamma 回归。输出是 gamma 分布的均值。他是有用的,例如:为了模拟保险索赔的严谨性,或者任何输出结果可能是 gamma 分布的。 ‘reg:tweedie’:用 log-link 的 Tweedie 回归。他是有用的,例如:模拟保险全损,或者任何输出结果可能是 Tweedie 分布的。 base_score [default=0.5] 初始化的所有例子的越策得分,全局 bias 对于足够多的迭代次数,改变这个值不会有太大的效果 eval_metric [default according to objective] 对于验证集的评测指标,一个默认的指标是根据目标分配的(对于回归任务用rmse,对于分类任务用error,mean average precision for ranking) 用户可以添加多个评测指标,对于python用户,记得将这些指标存入一个参数对的list而不是map,不然后面的指标将会失效。 可选项如下: rmse:root mean square error(均方根误差)。 mae:mean absolute error(绝对值误差)。 logloss:negative log-likelihood(负对数似然)。 error:二分类错误率。他可以用公式 #(wrong cases)/#(all cases)计算。对于预测,指标会把预测结果大于0.5的当做正类,其他当做负类。 error@t:与阈值为0.5的二分类不同,可以通过 t 设置阈值。 merror:多分类错误率,可以用公式 #(wrong cases)/#(all cases)计算。 mlogloss:Multiclass logloss(多分类对数似然)。 auc:Area under the curve(曲线下面积)。 ndcg:Normalized Discounted Cumulative Gain(归一化累积获得收益) map:Mean average precision(平均准确率,排名任务)。 ndcg@n,map@n:n 可以设置为整数,以切断列表中的顶部位置进行评估。 ndcg-,map-,ndcg@n-,map@n-:在XGBoost,NDCG 和 MAP 将评估没有任何正例样本的列表的得分为1。通过在评价度量中添加“-”,XGBoost 将在某些条件下将这些分数评估为0,反复训练。 poisson-nloglik:Poisson 回归的负对数似然。 gamma-nloglik:gamma 回归的负对数似然。 gamma-deviance:gamma 回归中的差残差 tweedie-nloglik:Tweedie 回归的负对数似然(在tweedie_variance_power参数为特定值)。 seed [default=0] 随机数种子 命令行参数下列的参数仅仅被用在命令行版本的xgboost中 use_buffer [default=1] 是否创建一个二进制缓冲从输入文本中。这样做通常会加快加载时间。 num_round boosting 的轮数 data 训练集的路径 test:data 要预测的测试集的路径 save_period [default=0] 保存模型的周期,设置 save_period=10 表示每10次 boosting 就会保存一次模型,设置为0表示在训练期间不保存任何模型。 task [default=train] 选项:train、pred、eval、dump train:用数据训练 pred:预测test:data eval:设置eval[name]=filename,评估指定的统计数据 dump:将学习到的模型转换为文本形式 model_in [default=NULL] 输入模型的路径,用于task为test、eval、dump ,如果被明确地指明训练,xgboost会从输入模型继续训练。 model_out [default=NULL] 在训练结束后输出模型的路径,如果不知名,会输出0003.model,这里的0003是 boosting 的轮数。 model_dir [default=models/] 用保存训练期间的模型输出的目录。 fmap 特征图,用于转换模型。 name_dump [default=dump.txt] 模型转储文件的名称。 name_pred [default=pred.txt] 预测文件的名字,用于预测模式。 pred_margin [default=0] 预测 margin 而不是转换概率。]]></content>
</entry>
<entry>
<title><![CDATA[XGBoost使用教程]]></title>
<url>%2F2018%2F08%2F04%2Fxgboost-using-tutorial%2F</url>
<content type="text"><![CDATA[XGBoost官方文档]]></content>
</entry>
<entry>
<title><![CDATA[product_quantization_tutorial]]></title>
<url>%2F2018%2F05%2F28%2Fproduct-quantization-tutorial%2F</url>
<content type="text"><![CDATA[]]></content>
</entry>
<entry>
<title><![CDATA[faiss_install_tutorial]]></title>
<url>%2F2018%2F05%2F28%2Ffaiss-install-tutorial%2F</url>
<content type="text"><![CDATA[macOS Sierra (10.12.3)编译Faiss最近Facebook AI实验室开源了相似性搜索库Faiss。Faiss是用于有效的相似性搜索(similarity search)和稠密矢量聚类(clustering of dense vectors)的库。它包含了可在任何大小向量集合里进行搜索的算法,向量集合的大小甚至可达到RAM容纳不下的地步。另外,它还包含了用于评估和参数调优的支持代码。Faiss用C++编写,有Python/numpy的完整包装。其中最有用的一些算法则在GPU上实现。机器上没有安装HomeBrew的,请参考让Mac也能拥有apt-get类似的功能——Brew。 下面,我们介绍一下如何在macOS Sierra (10.12.3)上编译Faiss。 1.下载Faiss源代码 Shell $ git clone https://github.com/facebookresearch/faiss.git1$ git clone https://github.com/facebookresearch/faiss.git2.安装编译需要的工具 Shell $ brew install llvm1$ brew install llvm3.修改调整源代码,准备编译 Shell $ cd faiss$ cp example_makefiles/makefile.inc.Mac.brew makefile.inc12$ cd faiss$ cp example_makefiles/makefile.inc.Mac.brew makefile.inc4.编译 Shell $ make all1$ make all5.执行测试用例 Shell #需要手工指定动态库的搜索路径,否则会提示“dyld: Library not loaded: @rpath/libomp.dylib”,导致进程无法启动 $ export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/usr/local/opt/llvm/lib/$ ./tests/demo_ivfpq_indexing1234 #需要手工指定动态库的搜索路径,否则会提示“dyld: Library not loaded: @rpath/libomp.dylib”,导致进程无法启动 $ export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/usr/local/opt/llvm/lib/$ ./tests/demo_ivfpq_indexing其余的示例,参考源代码中的INSTALL文件中的内容即可。]]></content>
</entry>
<entry>
<title><![CDATA[序列标注中的几种标签方案]]></title>
<url>%2F2017%2F12%2F02%2Fsequence-label-Label-scheme%2F</url>
<content type="text"><![CDATA[标签说明标签方案中通常都使用一些简短的英文字符[串]来编码。 标签是打在token上的。 对于英文,token可以是一个单词(e.g. awesome),也可以是一个字符(e.g. a)。 对于中文,token可以是一个词语(分词后的结果),也可以是单个汉字字符。 为便于说明,以下都将token试作等同于字符。标签列表如下: B,即Begin,表示开始I,即Intermediate,表示中间E,即End,表示结尾S,即Single,表示单个字符O,即Other,表示其他,用于标记无关字符常见标签方案基于上面的标签列表,通过选择该列表的子集,可以得到不同的标签方案。同样的标签列表,不同的使用方法,也可以得到不同的标签方案。 分词、词性标注任务常用的序列表示法有IOB/BIO和start/end。IOB表示法可以分为IOB1,IOB2,IOE1,IOE2四种。四种表示法大同小异,相同点是「I」代表当前词在一个组块中,「O」表示当前的词不在任意一个组块中。不同点是四种表示法对组块的开始或者结束的表达方式所有区别。具体如下:IOB1: 标签I用于文本块中的字符,标签O用于文本块之外的字符,标签B用于当前词是紧跟前一个组块的新组块的开始。非紧邻的新组块开始标记位I。例如:序 I列 I标 B注 I中 O的 O几 O种 O标 I签 I方 B案 IIOB2: 每个文本块都以标签B开始,除此之外,跟IOB1一样。例如:序 B列 I标 B注 I中 O的 O几 O种 O标 B签 I方 B案 IIOE1: 标签I用于独立文本块中,标签E仅用于同类型文本块连续的情况,假如有两个同类型的文本块,那么标签E会被打在第一个文本块的最后一个字符。例如:序 I列 E标 I注 I中 O的 O几 O种 O标 I签 E方 I案 IIOE2: 每个文本块都以标签E结尾,无论该文本块有多少个字符,除此之外,跟IOE1一样。例如:序 I列 E标 I注 E中 O的 O几 O种 O标 I签 E方 I案 Estart/end (也叫SBEIO、IOBES): 是另一个类型的表示法,该表示法表达的更为细致,包含了全部的5种标签,文本块由单个字符组成的时候,使用S标签来表示,由一个以上的字符组成时,首字符总是使用B标签,尾字符总是使用E标签,中间的字符使用I标签。例如:广 B东 I省 E的 O别 B称 E粤 S其中最常用的是IOB2、IOBS、IOBES。]]></content>
</entry>
<entry>
<title><![CDATA[词向量工具---wordrank使用教程]]></title>
<url>%2F2017%2F11%2F25%2Fwordrank-tools-using-tutorial%2F</url>
<content type="text"><![CDATA[]]></content>
</entry>
<entry>
<title><![CDATA[词向量工具---fastText简介、使用教程及源码分析]]></title>
<url>%2F2017%2F11%2F18%2Ffasttext-tools-using-tutorial%2F</url>
<content type="text"><![CDATA[简介fastText 是 Facebook 2016 年开源的一个词向量计算以及文本分类的工具,word2vec 的作者 mikolov 也参与了制作,目前已经引起了广泛的关注。这个工具包的 GitHub链接,该项目是 C++ 写的,和之前的项目相比这个项目更加专业,涉及的内容也比之前的项目多很多。在学术上没有什么创新点,但是好处就是模型简单,性能比肩深度学习而且速度更快,用起来很顺手,做出来的结果也可以达到上线使用的标准。该工具其实是由两部分组成,一部分是高效文本分类,一部分是词向量学习。该工具的理论基础是以下两篇论文: Bag of Tricks for Efficient Text Classification 这篇论文提出了 fastText 算法,介绍高效文本分类技巧,该算法实际上是将目前用来算 word2vec 的 CBOW 模型架构做了个小修改,原先使用一个词的上下文的所有词向量之和来预测词本身,现在改为用一段短文本的词向量之和来对文本进行分类。在生成文本向量的时候用到了ngram的信息,用这个文档所有单词的词向量的平均预测标签。对这种简单的任务,用简单的模型效果就不错了。具体方法就是把句子每个 word 的 vector 求平均,然后直接用简单的LR分类就行。fastText 的 fast 指的是这个。 这个 知乎答案 总结得挺好的,取平均其实算 Deep Learning 的 average pooling。 Enriching Word Vectors with Subword Information 这篇论文使用 subword 信息,也就是连续的字符信息来丰富词汇向量,提出了用 subword 的向量之和来代替简单的词向量的方法,从而使得词的微变形关系也能映射到嵌入空间中,以解决简单 word2vec 无法处理同一词的不同形态的问题。每个词被看做是 n-gram 字母串包。为了区分前后缀情况,”<”, “>” 符号被加到了词的前后端。除了词的子串外,词本身也被包含进了 n-gram 字母串包。以 where 为例,n=3 的情况下,其子串分别为<wh, whe, her, ere, re>,以及其本身 <where>注意,这里的 her 与单词 < her> 是不同的。fastText 中提供了 maxn 这个参数来确定 subword 的大小。词向量学习部分可说是一个 word2vec 优化版,用了 subword 的信息,速度是不会提升的,只是效果方面的改进。这个改进能提升模型对 morphology 的效果, 即”字面上”相似的词语 distance 也会小一些. 有人在question-words 数据集上跑过 fastText 和 gensim-word2vec 的对比, 结果在 Jupyter Notebook Viewer .可以看出fastText在 “adjective-to-adverb”, “opposite”之类的数据集上效果还是相当好的. 不过像 “family” 这样的字面上不一样的数据集, fastText效果反而不如 gensim-word2vec.推广到中文上, 结果也类似. “字面上”相似对 vector 的影响非常大. 一个简单的例子是, gensim 训练的模型中与”交易”最相似的是”买卖”, 而 fastText 的结果是”交易法”注:在代码实现中,对于中文是不计算 subword 的。 fastText 用于文本分类fastText文本分类模型 = word2vec 中 CBOW 模型 + h-softmax 的灵活使用。模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率。序列中的词和词组组成特征向量,特征向量通过线性变换映射到中间层,中间层再映射到标签。fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。对于有大量类别的数据集,fastText 使用了一个分层分类器(而非扁平式架构)。不同的类别被整合进树形结构中(想象下二叉树而非 列表)。在某些文本分类任务中类别很多,计算线性分类器的复杂度高。为了减少了训练复杂性和测试文本分类器的时间,fastText 利用了类别(class)不均衡这个事实(一些类别出现次数比其他的更多),使用层次 Softmax 技巧。层次 Softmax 通过使用 Huffman 算法建立用于表征类别的树形结构,对标签进行编码,频繁出现的类别的深度要比不频繁出现类别的深度要小,这也使得进一步的计算效率更高。fastText 能在五分钟内将50万个句子分成超过30万个类别。 注: fastText 只能做多类别分类,从多个类别里预测出一个类。 文本分类单层网络就够了,非线性的问题用多层的。fasttext只有1层神经网络,属于所谓的 shallow learning,比deep learning 模型的优点是训练和预测速度极快,但是 fasttext 的效果并不差,在工业界这点非常重要。 fastText 用于词向量表征在 fastText 中一个低维度向量与每个单词都相关。隐藏表征在不同类别所有分类器中进行共享,使得文本信息在不同类别中能够共同使用。常用的特征是词袋模型( Bag-of-Words ),但词袋模型忽略了词序信息,因此 fastText 还加入了 n-gram ,n-gram 来将局部词序考虑在内,特征这对很多文本分类问题来说十分重要。“我 爱 你” 这句话中的词袋模型特征是 “我”,“爱”, “你”。这些特征和句子 “你 爱 我” 的特征是一样的。如果加入 2-gram,第一句话的特征还有 “我-爱” 和 “爱-你”,这两句话 “我 爱 你” 和 “你 爱 我” 就能区别开来了。当然,为了提高效率,我们需要过滤掉低频的 n-gram。 举例来说:fastText 能够学会“男孩”、“女孩”、“男人”、“女人”指代的是特定的性别,并且能够将这些数值存在相关文档中。然后,当某个程序在提出一个用户请求(假设是“我女友现在在儿?”),它能够马上在 fastText 生成的文档中进行查找并且理解用户想要问的是有关女性的问题。 facebook 公开了90种语言的 Pre-trained word vectors(词向量维度为300维),点击了解更多详情 。 fastText词向量优势 适合大型数据+高效的训练速度:能够训练模型“在使用标准多核CPU的情况下10分钟内处理超过10亿个词汇”,特别是与深度模型对比,fastText 能将训练时间由数天缩短到几秒钟。使用一个标准多核 CPU,得到了在10分钟内训练完超过10亿词汇量模型的结果。此外,fastText 还能在五分钟内将50万个句子分成超过30万个类别。 支持多语言表达:利用其语言形态结构,fastText能够被设计用来支持包括英语、德语、西班牙语、法语以及捷克语等多种语言。它还使用了一种简单高效的纳入子字信息的方式,在用于像捷克语这样词态丰富的语言时,这种方式表现得非常好,这也证明了精心设计的字符 n-gram 特征是丰富词汇表征的重要来源。fastText的性能要比时下流行的word2vec工具明显好上不少,也比其他目前最先进的词态词汇表征要好。 fastText 专注于文本分类,在许多标准问题上实现当下最好的表现(例如文本倾向性分析或标签预测)。fastText 与基于深度学习方法的 Char-CNN 以及 VDCNN 对比: 比word2vec更考虑了同一词的不同形态的问题,比如 fastText 的词向量学习能够考虑 english-born 和 british-born 之间有相同的后缀,但 word2vec 却不能。 fastText vs word2vec相同之处 图模型结构很像,都是采用 embedding 向量的形式,得到 word 的隐向量表达。 采用很多相似的优化方法,比如使用 Hierarchical softmax 优化训练和预测中的打分速度。 训练词向量时,两者都是无监督算法。输入层是 context window 内的 term。输出层对应的是每一个 term,计算某 term 的概率最大; 在使用层次softmax的时候,huffman 树叶子节点处是训练语料里所有词的向量。 不同之处 fastText 用于学习词向量时,加入了词的 subword 信息和 n-gram 信息。 fastText 用于文本分类时,是有监督算法。输入层对应整个 sentence 的内容,包括term,也包括 n-gram 的内容。输出层对应的是分类的 label。huffmax树叶子节点处是每一个类别标签的词向量 fastText 用于文本分类时,遍历分类树的所有叶节点,找到概率最大的 label(一个或者 N 个)。 参数说明 loss function选用hs(hierarchical softmax)要比ns(negative sampling) 训练速度要快很多倍,并且准确率也更高。 wordNgrams 默认为1,设置为2以上可以明显提高准确率。 如果词数不是很多,可以把bucket设置的小一点,否则预留会预留太多bucket使模型太大。 因为facebook提供的只是C++版本的代码,上github已经有封装的python接口。用起来特别方便,觉得还不能满足自己的使用要求,修改源码也非常方便。所以对于文本分类,先用fasttext做一个简单的baseline是很适合的。 fastText 分类示例classification-example.sh 示例说明,包含训练、测试和预测示例。123456789101112131415161718192021222324252627282930313233343536373839404142#!/usr/bin/env bash## Copyright (c) 2016-present, Facebook, Inc.# All rights reserved.## This source code is licensed under the BSD-style license found in the# LICENSE file in the root directory of this source tree. An additional grant# of patent rights can be found in the PATENTS file in the same directory.## 对文本进行预处理并且打乱myshuf() { perl -MList::Util=shuffle -e 'print shuffle(<>);' "$@";}normalize_text() { tr '[:upper:]' '[:lower:]' | sed -e 's/^/__label__/g' | \ sed -e "s/'/ ' /g" -e 's/"//g' -e 's/\./ \. /g' -e 's/<br \/>/ /g' \ -e 's/,/ , /g' -e 's/(/ ( /g' -e 's/)/ ) /g' -e 's/\!/ \! /g' \ -e 's/\?/ \? /g' -e 's/\;/ /g' -e 's/\:/ /g' | tr -s " " | myshuf}# 然后就是下载数据集,normalize数据集,normalize_text()包括了myshuf。训练集是dbpedia.train,测试集是dbpedia.testRESULTDIR=resultDATADIR=datamkdir -p "${RESULTDIR}"mkdir -p "${DATADIR}"if [ ! -f "${DATADIR}/dbpedia.train" ]then wget -c "https://github.com/le-scientifique/torchDatasets/raw/master/dbpedia_csv.tar.gz" -O "${DATADIR}/dbpedia_csv.tar.gz" tar -xzvf "${DATADIR}/dbpedia_csv.tar.gz" -C "${DATADIR}" cat "${DATADIR}/dbpedia_csv/train.csv" | normalize_text > "${DATADIR}/dbpedia.train" cat "${DATADIR}/dbpedia_csv/test.csv" | normalize_text > "${DATADIR}/dbpedia.test"fi# 编译C++代码make# 根据训练集训练fasttext,输出训练的结果./fasttext supervised -input "${DATADIR}/dbpedia.train" -output "${RESULTDIR}/dbpedia" -dim 10 -lr 0.1 -wordNgrams 2 -minCount 1 -bucket 10000000 -epoch 5 -thread 4# 根据训练的结果以及测试集进行测试,得到准确率./fasttext test "${RESULTDIR}/dbpedia.bin" "${DATADIR}/dbpedia.test"# 根据训练的结果以及测试集,输出测试集的结果./fasttext predict "${RESULTDIR}/dbpedia.bin" "${DATADIR}/dbpedia.test" > "${RESULTDIR}/dbpedia.test.predict" fastText 词向量示例word-vector-example.sh 示例说明,包括用skip-gram模式训练和评估词向量的示例。12345678910111213141516171819202122232425262728293031323334353637383940#!/usr/bin/env bash## Copyright (c) 2016-present, Facebook, Inc.# All rights reserved.## This source code is licensed under the BSD-style license found in the# LICENSE file in the root directory of this source tree. An additional grant# of patent rights can be found in the PATENTS file in the same directory.#RESULTDIR=resultDATADIR=datamkdir -p "${RESULTDIR}"mkdir -p "${DATADIR}"# 下载语料if [ ! -f "${DATADIR}/fil9" ]then wget -c http://mattmahoney.net/dc/enwik9.zip -P "${DATADIR}" unzip "${DATADIR}/enwik9.zip" -d "${DATADIR}" perl wikifil.pl "${DATADIR}/enwik9" > "${DATADIR}"/fil9fi# 下载测试集if [ ! -f "${DATADIR}/rw/rw.txt" ]then wget -c https://nlp.stanford.edu/~lmthang/morphoNLM/rw.zip -P "${DATADIR}" unzip "${DATADIR}/rw.zip" -d "${DATADIR}"fi# 编译源代码make# 用skipgram模式进行训练./fasttext skipgram -input "${DATADIR}"/fil9 -output "${RESULTDIR}"/fil9 -lr 0.025 -dim 100 \ -ws 5 -epoch 1 -minCount 5 -neg 5 -loss ns -bucket 2000000 \ -minn 3 -maxn 6 -thread 4 -t 1e-4 -lrUpdateRate 100cut -f 1,2 "${DATADIR}"/rw/rw.txt | awk '{print tolower($0)}' | tr '\t' '\n' > "${DATADIR}"/queries.txtcat "${DATADIR}"/queries.txt | ./fasttext print-word-vectors "${RESULTDIR}"/fil9.bin > "${RESULTDIR}"/vectors.txt# 评估训练的词向量python eval.py -m "${RESULTDIR}"/vectors.txt -d "${DATADIR}"/rw/rw.txt]]></content>
<categories>
<category>WordEmbedding</category>
</categories>
<tags>
<tag>fastText</tag>
</tags>
</entry>
<entry>
<title><![CDATA[词向量工具---fastText简介、使用教程及源码分析]]></title>
<url>%2F2017%2F11%2F18%2Ffasttext-source-code-analysis%2F</url>
<content type="text"><![CDATA[首先我们还是看一下fasttext的目录。所有的C++代码都在src中。然后就是一些linux脚本文件 我们进入src目录看看有哪些C++文件。从上往下看,args是专门存储超参的类。dictionary是词典类,构建存储词典,支持把单词转成id。fasttext是训练测试等的核心文件,会调用model进行词向量文本向量的训练。main是主函数负责接受超参转成args类,根据不同目的调用不同的方法。剩下的matrix,vector等文件都是辅助fasttext,model以及dictionary词典的。 fasttext中文本向量就是词向量的平均,得到文本向量并进行分类的代码和word2vec中的CBOW非常像。我们先看一下classification-example.sh。这个脚本文件会对来自于dbpedia的文本进行分类。分类前要对文本进行预处理并且打乱。 参数方面 loss function选用hs(hierarchical softmax)要比ns(negative sampling) 训练速度要快很多倍,并且准确率也更高。 wordNgrams 默认为1,设置为2以上可以明显提高准确率。 如果词数不是很多,可以把bucket设置的小一点,否则预留会预留太多bucket使模型太大。 因为facebook提供的只是C++版本的代码,上github已经有封装的python接口。用起来特别方便,觉得还不能满足自己的使用要求,修改源码也非常方便。所以对于文本分类,先用fasttext做一个简单的baseline是很适合的。 源码分析 训练数据格式训练数据格式为一行一个句子,每个词用空格分割,如果一个词带有前缀 label,那么它就作为一个类标签,在文本分类时使用,这个前缀可以通过-label参数自定义。训练文件支持 UTF-8 格式。 fasttext 模块fasttext 是最顶层的模块,它的主要功能是训练和预测,首先是训练功能的调用路径,第一个函数是 train,它的主要作用是 初始化参数,启动多线程训练。]]></content>
<categories>
<category>WordEmbedding</category>
</categories>
<tags>
<tag>fastText</tag>
</tags>
</entry>
<entry>
<title><![CDATA[词向量工具---GloVe使用教程]]></title>
<url>%2F2017%2F11%2F11%2Fglove-tools-using-tutorial%2F</url>
<content type="text"><![CDATA[基于统计的词向量模型以基于SVD分解技术的LSA模型为代表,通过构建一个共现矩阵得到隐层的语义向量,充分利用了全局的统计信息。然而这类模型得到的语义向量往往很难把握词与词之间的线性关系(例如著名的King、Queen、Man、Woman等式)。基于预测的词向量模型则以基于神经网络的Skip-gram模型为代表,通过预测一个词出现在上下文里的概率得到embedding词向量。这类模型的缺陷在于其对统计信息的利用不充分,训练时间与语料大小息息相关。不过,其得到的词向量能够较好地把握词与词之间的线性关系,因此在很多任务上的表现都要略优于SVD模型。既然两种模型各有优劣,那么能不能二者各取其长,构造一个更强大的词向量模型呢?这就是接下来要介绍的GloVe模型。GloVe是斯坦福大学提出的一种新的词矩阵生成的方法,GloVe全称应该是 Global Vectors for Word Representation,综合运用词的全局统计信息和局部统计信息来生成语言模型和词的向量化表示。官方主页链接,上面还有训练好的模型可以下载。在GloVe的原始论文里,作者首先分析了Skip-gram模型能够挖掘出词与词之间线性关系的背后成因,然后通过在共现矩阵上构造相似的条件,得到一个基于全局信息的词向量模型——GloVe模型。与Skip-gram模型相比,GloVe在充分利用了语料库的全局统计信息的同时,也提高了词向量在大语料上的训练速度(一个共现矩阵的遍历要比整个语料库的遍历容易的多)。而与传统的SVD技术相比,SGD的训练也更加简单高效。同时,GloVe得到的词向量更能把握住词与词之间的线性关系。GloVe综合了LSA、CBOW的优点,训练更快、对于大规模语料算法的扩展性也很好、在小语料或者小向量上性能表现也很好。和绝大多数的词向量不同,glove的目标是通过训练词向量和上下文向量,使得它们能够重构共现矩阵。需要注意的是,在运行glove时,对内存要求比较高,1.4G的语料,20G的内存都无法运行,一直死机;后面降到300M的语料,20G的内存基本上能够运行。而gensim中的word2vec,对于1.4G的语料,20G完全可以运行,而且只需要几个小时就能跑出结果。 glove在三元组上面进行训练, glove是根据每个三元组去更新一次词向量和上下文向量GloVe训练参数: 最佳的向量维度:300左右,之后变化比较轻微 对于GloVe向量来说最佳的窗口长度是8 训练迭代次数越大,对于GloVe来说确实有助于达到更好的效果 更多的数据有助于帮助提高训练精度 论文链接 GloVe实现:目前开源的有C语言版本、Python版本和R语言版本。python:python-glove Python版本GitHub地址安装pip install glove_python GloVe之C语言版本GitHub地址跑在linux下那就只能用C的代码训练,然后再用python来处理结果。让人欣喜的是,GloVe训练的结果,是可以用gensim里面word2vec的load直接加载并且使用的(将参数write_header设置为1,会在 vectors.txt 的首行添加<词表大小>/<词向量大小>),那就简单了。 下载源码1$ git clone http://github.com/stanfordnlp/glove 切换到glove目录1$ cd glove 首先先参考 README.txt,里面主要介绍这个程序包含了四部分子程序,按步骤分别是vocab_count、cooccur、shuffle、glove。 vocab_count用于统计文本中的词的词频,生成 vocab.txt,每一行为:词 词频。 cooccur用于统计词与词的共现,目测类似与 word2vec 的窗口内的任意两个词,生成二进制文件 cooccurrence.bin。 shuffle对 cooccurrence.bin中的共现结果重新整理。对于大文件,文件自动分割成块,每个块 shuffle 后再合并在一起,生成二进制文件 cooccurrence.shuf.bin。 gloveGloVe 算法的训练模型,使用之前生成的vocab.txt和 cooccurrence.shuf.bin,最终会输出词典中词对应的词向量 vectors.txt和词向量二进制文件 vectors.bin。( 编译源码1$ make 确保安装了 gcc ,生成一个 build 的文件夹 Demo测试1$ ./demo.sh GitHub地址]]></content>
</entry>
<entry>
<title><![CDATA[词向量工具---word2vec简介、使用教程及源码分析]]></title>
<url>%2F2017%2F11%2F05%2Fword2vec-tools-using-tutorial%2F</url>
<content type="text"><![CDATA[word2vec 是 Google 于 2013 年开源推出的一个用于获取词向量的工具包,它简单、高效,因此引起了很多人的关注。word2vec 的作者 Tomas Mikolov 在以下两篇论文介绍了相应的理论基础: Efficient Estimation of Word Representations in Vector Space Distributed Representations of Words and Phrases and their Compositionality 原始论文没有谈及太多算法细节,解释得不够清晰,因而在一定程度上增加了这个工具包的神秘感并没有中文。想了解一下 word2vec 的数学原理,推荐 peghoty 大神的系列博客《word2vec 中的数学原理详解》 ,博主也是通过阅读该系列博客学习 word2vec 中的数学原理和实现细节,在此推荐给大家。 word2vec 就是“两个训练方案+两个提速手段”,两两组合,因此也就有了四个备选的模型。 两个训练方案CBOW (Continuous Bag-of-Words Model) 和 Skip-gram(Continuous Skip-gram Model)。结构如图所示: 两个模型都是只有三层,即输入层、映射层和输出层。CBOW 可以理解为”将周围词叠加来预测当前次”,用上下文的词向量作为输入,映射层在所有的词间共享,输出层为一个分类器,目标是使当前词的概率最大。Skip-gram 可以理解为”根据当前词分别预测周围词”,输入层为当前词向量,输出层是使得上下文的预测概率最大。训练采用SGD。按理论来说,skip gram比cbow需要花window ~ 2 * window倍的时间。cbow是把2window个词作为输入,一个词作为输出,这样构成训练样本。而skip gram相当于将这2 \ window个词拆成了2 * window个样本。 两个提速手段Hierarchical Softmax 和 Negative Sampling。Hierarchical Softmax 是对softmax的简化,精度会比原生的softmax略差,但是预测概率的效率从O(|V|)降到O(log2|V|),是word2vec中用于提高性能的一项关键技术。Negative Sampling 是 NCE(Noise Contrastive Estimation) 的一个简化版本,目的是用来提高训练速度并改善所得词向量的质量。与Hierarchical Softmax不同,Negative Sampling 不再使用复杂的Huffman树,而是利用相对简单的随机负采样,达到大幅度提高性能。 word2vec 将词的上下文关系嵌入到低维空间。更具体而言,word2vec 将词的上下文关系转换为分类关系,并以此同时训练词嵌入向量和 logistic regression 分类器。逻辑回归logistic regression 是经典的线性分类模型。广义上而言,线性模型由三个部分组成, 1. 输入向量 2. 线性系数 3. 偏移(bias),而 bias 可以进一步表示成线性系数。所以,二分类的线性分类问题可以表示为输入 $x$ 和系数 $w$ 的内积结果 $w^Tx$,结果的正负决定了数据的类别。分类器参数通过最小化损失函数 $l(y, w^Tx)$来完成,不同的损失函数定义了不同的分类模型。logistic regression 也广泛地应用在多分类问题中,通过 softmax 函数计算数据属于每个类别的概率完成分类。因为分类神经网络的输出层通常也设定为 softmax 函数,所以多分类 lr 也可以表示为浅层神经网络。 cbow 用上下文词向量的加和结果来预测其中心词汇。skip-gram我们将词的上下文定义为以词 $w_i$ 为中心,窗口为 $k$ 前后范围内的词 $Ci = {w{i-k}, w{i-k+1}, …, w{i-1}, w{i+1}, … w{i+k}}$。skip-gram 将词之间的关系变成了 $|V|$ 多分类问题,其中 $|V|$ 是词库大小。每个词有两个变量 $x_i, w_i$,前者为词嵌入向量,后者是线性分类器的系数,在相关文章中又称为上下文向量。skip-gram 用中心词汇来预测其上下文针对多分类的计算优化word2vec 将上下文关系转化为多分类任务,进而训练逻辑回归模型,这里的类别数量是 $|V|$ 词库大小。通常的文本数据中,词库少则数万,多则百万,在训练中直接训练多分类逻辑回归并不现实。word2vec [5] 中提供了两种针对大规模多分类问题的优化手段, negative sampling 和 hierarchical softmax。以 skip-gram 为例,中心词对上下文的词类是正面例子,对所有其它的词则是负面例子。在优化中,negative sampling 只更新少量负面类,从而减轻了计算量。hierarchical softmax 将词库表示成前缀树,从树根到叶子的路径可以表示为一系列二分类器,一次多分类计算的复杂度从 $|V|$ 降低到了树的高度。嵌入技术将词的上下文关系嵌入到低维空间。word2vec 将词的局部上下文转化为了多分类任务,从而训练逻辑回归模型,并将逻辑回归模型中的输入部分作为词嵌入输出。首先简单说一下word2vec的使用方式。word2vec的官方下载地址是 https://code.google.com/archive/p/word2vec/ 。到source里面找到download下载就可以。word2vec可以直接在linux上和macos上面运行,但是不能直接在windows上面运行,原因是windows没有pthread库。把pthread依赖去掉可以单线程跑,但是实在是太慢了。也可以安装这个库,但是比较麻烦,这里就不深入探讨了。 测试数据集question-words.txt和question-phrases.txt是用来衡量词向量/短语向量质量的词类比(analogy)数据集。question-words.txt每一行是四个单词,我们需要根据前三个单词推断出第四个单词是什么。每一行像这样:Berlin Germany London England。question-phrases.txt数据集中是包含了短语的analogy问题,像这样:Jeff_Bezos Amazon Tim_Cook Apple 代码makefile文件对几个c语言文件进行编译生成可执行文件。word2vec.c这个工具包中最重要的文件就是word2vec.c。它读入语料然后训练得到词向量。其他的c文件实现了一些边角辅助功能。word2phrase.c会过滤一遍要训练的语料,识别出语料中哪些是短语(比如把Tim Cook识别成一个短语Tim_Cook),把短语当做一个新词,输出出去。distance.c的功能是输入一个单词,返回最接近的单词(比如给beijing返回shanghai,heilongjiang)以及它们的词向量和输入单词的词向量的Cosine夹角。word-analogy.c的功能是输入三个单词(比如wife king queen),返回第四个单词(比如husband)。compute-accuracy.c的功能是定量的给出词向量在analogy数据集上面的准确率。 1、word2vecword2vec:与一般的共现计数不同,word2vec主要来预测单词周边的单词,在嵌入空间里相似度的维度可以用向量的减法来进行类别测试。 弊端: 1、对每个local context window单独训练,没有利用包含在global co-corrence矩阵中的统计信息2、多义词处理乏力,因为使用了唯一词向量]]></content>
<categories>
<category>词向量</category>
</categories>
<tags>
<tag>word2vec</tag>
</tags>
</entry>
<entry>
<title><![CDATA[词向量简介]]></title>
<url>%2F2017%2F11%2F01%2Fword-vector-abstract%2F</url>
<content type="text"><![CDATA[简介自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。在 NLP 领域中,如何量化词的表达也是关键问题之一。用某个固定维度的向量(vector)去表示词是一个很经典很基本的任务,我们称这个向量为「词向量」,通常也被认为是词的特征向量。我们之所以要把单词变成向量是因为我们需要把自然语言抽象成数学中的某个概念(这里是向量)。换一种更具体直白的说法,之所以要把单词变成固定维度的向量,是因为绝大多数的机器学习(Machine Learning)模型需要固定维度的向量作为输入。近年来,「词向量」已逐渐成为自然语言处理的基础知识,一份高质量的「词向量」是很多任务取得更好表现的关键。常见的方式有以下两种: 独热编码(One-Hot Encoding) 词嵌入(Word Embedding) 独热编码(One-Hot Encoding)独热编码即 One-Hot 编码,又称一位有效编码,直观来说就是使用 N 位状态寄存器对 N 个状态进行编码,每个状态都有其独立的寄存器位,并且在任意时候有且只有一位有效,即只有一个值为 1,其他值全为 0 的一种码制。在机器学习的任务中,对于离散型的分类型的数据,需要对其进行数字化,比如说「性别」这一属性,只能有「男性」、「女性」或者「其他」这三种值,如何对这三个值进行数字化表达呢?一种简单的方式就是「男性」为 0,「女性」为 1,「其他」为 2。使用上面简单的方式对分类值进行数字化后,进行模型训练时可能会产生一个问题:特征因为数字值的不同影响模型的训练效果,在模型训练的过程中不同的值使得同一特征在样本中的权重可能发生变化。假如直接编码成 100,是不是比编码成 1 对模型的的影响更大?为了解决上述的问题,使训练过程中不受到因为分类值数字化的问题对模型产生的负面影响,引入独热码对分类型的特征进行独热码编码。 在 NLP 任务中,假设词典中不同词的数量为 N,每个词的 index 都与 0 到 N-1 的连续整数一一对应。假设一个词的下标为 i,为了得到该词的 One-Hot 向量表示,我们创建一个全 0 的长为 N的向量,并将其第 i位置成 1。One-Hot 编码使用了高维稀疏向量表示词,这样的特征可以反映词出现的频率,但这并不是最好的选择。一个主要的原因是,One-Hot 词向量无法表达不同词之间的关系,例如「相似度」这一度量关系。任何一对词的 One-Hot 向量的余弦相似度都为 0。 那究竟用什么向量去表示词才是合理的呢?一个符合直觉的想法是,相似的词应该有相似的「词向量」,比如 dog 和 cat 这两个词,他们的意思很相近,那么他们的「词向量」也应该很相似,或者说他们的「词向量」在空间中位置很接近,距离很短。再比如 dog 和 rocket 这两个词,他们的「词向量」在空间中位置应该距离比较远。我们应该怎样做才能使得相似的词有相似的「词向量」呢? 词嵌入(Word Embedding)目前大多数人所述的「词向量」,其实指的就是「词嵌入」。与 One-Hot 编码相比而言,「词嵌入」技术将词汇的上下文关系嵌入到一个低维空间。举一个简单的例子,在字典用我们会用几千个常用词去解释每个词的意思,而「词向量」中,我们用(比如) 100 维的实数向量去表示字典中的词。换一种说法,我们要把字典中每一个词映射到某个维度(比如 100 维)的空间当中去,所以我们也可以把「词向量」叫做「空间向量模型」(Vector Space Model)。「词嵌入」模型几乎都利用了语言学中这样的一个规律:相似的词有着相似的上下文。这个规律叫 Distributional Hypothesis。原理基本都是词的上下文的分布可以揭示这个词的语义,就好比“看看你跟什么样的人交往,就知道你是什么样的人”,所以「词向量」模型的核心就是对上下文的关系进行建模。还是以 dog 和 cat 两个词为例,他们是比较相似的单词,他们在语料中的上下文也很相近。他们的上下文中一般都会出现关于动物、宠物的单词或短语。所以,目前主流的「词向量」模型表面上千差万别,但是本质都很相似,都是对词与其上下文的关系进行建模,从而得到高质量的「词向量」。目前比较有代表性的工具有 word2vec、GloVe 和 fastText 等。 词类比(Word Analogy)上面已经提到,「词向量」会把相似的词映射到空间中相近的位置中去。所以我们可以用「词向量」找到和某个词相近的词。除此之外,「词向量」还有另一个比较优美的性质,「词类比」(Word Analogy)。在词类比任务中,我们需要通过前三个单词,例如 Athens、Greece、Baghdad,推导出第四个单词 Iraq。推导的过程就是「雅典」和「希腊」是首都的关系,「巴格达」和谁是首都的关系?答案是「伊拉克」。要做好这个任务,就要求我们还需要从「词向量」中得到词之间关系的信息,比如在上述例子中,这个关系就是「首都」。当年 word2vec 出现以后受到大家广泛关注,一个可能的原因就是大家惊讶于「词向量」能在 Word Analogy数据集上取得这么好的效果,原来「词向量」还有这样神奇的性质。 那「词向量」为何有能力做好 Word Analogy 这个任务呢?在 word2vec 中用 vec('wife') + vec('king') - vec('queen') 去寻找 husband 这个词,这种加加减减的操作看似没有什么道理,这里先给一个例子帮助大家直观的理解。我们以 king、queen 这两个词为例。假设语料中 king 周围出现的词主要和「皇室」这个主题以及「男性」这个主题有关。queen 周围出现的词主要和「皇室」这个主题和「女性」这个主题有关。我们令 vec('皇室')为所有有关「皇室」主题的词的「词向量」的平均,vec('男性') 和 vec('女性') 分别为所有有关「男性」和「女性」主题的词的「词向量」的平均。我们在上面内容中提到过,词的语义能通过它在语料中的上下文中的信息体现出来。我们这里就认为 vec('king') = 1/2(vec('皇室') + vec('男性')),vec('queen') = 1/2(vec('皇室') + vec('女性'))。所以 vec('king') - vec('queen') 就等于 1/2(vec('男性')-vec('女性'))。同理,对于 husband、wife 这两个词,husband 周围的词是关于「伴侣」和「男性」的主题,wife 周围的词是关于「伴侣」和「女性」的主题。vec('husband') - vec('wife') 同样等于 1/2(vec('男性')- vec('女性'))。这样 vec('husband') - vec('wife') 就等于 vec('king') - vec('queen'),我们就能轻易的通过三个词,去推断出第四个词。而 vec('king') - vec('queen') 也很好的反映了「男性」与「女性」这样一个关系。 总结在之后的「词向量」系列博文中,我会全面细致的解析包括 word2vec、GloVe 和 fastText 等一系列「词向量」工具包。通过上面提到的工具包,我们可以得到高质量的「词向量」,也可以根据我们的需求,得到不同性质的「词向量」。]]></content>
<categories>
<category>词向量</category>
</categories>
<tags>
<tag>词向量</tag>
</tags>
</entry>
<entry>
<title><![CDATA[C++学习笔记---map容器使用教程]]></title>
<url>%2F2017%2F10%2F27%2Fcpp-container-map-use-tutorial%2F</url>
<content type="text"><![CDATA[注意事项: 在map中,由key查找value时,首先要判断map中是否包含key。 如果不检查,直接返回map[key],可能会出现意想不到的行为。如果map包含key,没有问题,如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value取默认值,返回value。也就是说,map[key]不可能返回null。 map提供了两种方式,查看是否包含key,map.count(key)、map.find(key)。 map.count(key):由于map不包含重复的key,因此map.count(key)取值为0,表示不包含,取值为1,表示包含。 map.find(key):返回迭代器,判断是否存在。 对于STL中的容器,有泛型算法find(begin,end,target)查找目标,map还提供了一个成员方法find(key)。 对于下面的场景,存在key就使用,否则返回null,有下面两种写法:1234if(1 == map.count(key)) { return map[key];}return null; 12345iter = map.find(key);if(iter != map.end()) { return iter->second;}return null; 这里需要注意:前一种方法很直观,但是效率差很多。因为前面的方法,需要执行两次查找。因此,推荐使用后一种方法。]]></content>
<categories>
<category>C++</category>
</categories>
<tags>
<tag>C++,container</tag>
</tags>
</entry>
<entry>
<title><![CDATA[C++学习笔记---vector容器使用教程]]></title>
<url>%2F2017%2F10%2F21%2Fcpp-container-vector-use-tutorial%2F</url>
<content type="text"><![CDATA[利用 remove_if() 和 erase() 从 vector 中移除指定 set 中包含的元素 12345678910111213141516171819202122232425262728#include <iostream>#include <vector>#include <unordered_set>std::unordered_set<std::string> replace_str_set{",", "."};bool IsReplaceStr(std::string str) { if (replace_str_set.find(str) != replace_str_set.end()) { return true; } return false;}int main() { std::vector<std::string> string_vector{"a", ",", "b", ".", "c"}; std::vector<std::string>::iterator it; std::cout << "before replace: "; for (it = string_vector.begin(); it != string_vector.end(); it++) { std::cout << *it; << std::endl; } std::cout << std::endl; string_vector.erase(remove_if(string_vector.begin(), string_vector.end(), IsReplaceStr), string_vector.end()); std::cout << "after replace: "; for (it = string_vector.begin(); it != string_vector.end(); it++) { std::cout << *it; } std::cout << std::endl; return 0;} 输出结果:12before replace: a,b.cafter replace: abc]]></content>
<categories>
<category>C++</category>
</categories>
<tags>
<tag>C++,container</tag>
</tags>
</entry>
<entry>
<title><![CDATA[C++学习笔记---容器(container)使用教程]]></title>
<url>%2F2017%2F10%2F20%2Fcpp-container-use-tutorial%2F</url>
<content type="text"><![CDATA[在 C++ 的 STL 中,常见的容器可分为「顺序容器」(sequential container) 和「关联容器」(associative container)。 标准的 STL 「顺序容器」包括: vector、deque、list、forward_list、array 与 string。 标准的 STL「关联容器」可分为「关键字有序」和「关键字无序」。 关键字有序:map、set、multimap和multiset。 关键字无序: unorder_map、unorder_set、unorder_multimap和unorder_multiset。 vectorvector将元素保存在连续的内存空间中,支持随机存取。由于元素是连续存储的,在这两种容器中间插入和删除元素,需要修改该位置之后所有元素的位置,效率较低。如果不清楚元素的确切个数,请使用vector,如果清楚元素的确切个数,请使用数组。 string、string将元素保存在连续的内存空间中,支持随机存取。由于元素是连续存储的,在这两种容器中间插入和删除元素,需要修改该位置之后所有元素的位置,效率较低。 list、forward_listlist和forward_list分别对应数据结构中的双向链表和单向链表。两个容器将元素的设计目的是让容器在任何位置的插入和删除效率提高,但其代价是容器不支持随机存取,查找效率较低。 dequedeque是一种更为复杂的数据结构。与string和vector类似,支持快速随机访问,并且在其两端添加和删除元素的效率都很高。但是,由于deque中元素也是连续存储,在其中间插入和删除元素的效率也较低。 arrayarray是一种更安全的数组,与内置数组类似,不支持动态内存分配,支持元素随机访问。]]></content>
<categories>
<category>C++</category>
</categories>
<tags>
<tag>C++,container</tag>
</tags>
</entry>
<entry>
<title><![CDATA[TensorFlow Tensor变换API]]></title>
<url>%2F2017%2F10%2F19%2Ftensorflow-tensor-transform-api%2F</url>
<content type="text"><![CDATA[tf.stack()12345stack( values, axis=0, name="stack") 官方文档: https://www.tensorflow.org/api_docs/python/tf/stack 定义: tensorflow/python/ops/array_ops.py 功能: 将由 R 维的 tensor 堆成 R+1 维的 tensor . 说明: 通过沿着 axis 维,将 values 中的 tensor 列表填充到一个比values 中的 tensor 高一维的 tensor中。 给定一个长度为 N ,由 shape 为 (A,B,C) 的 tensor 构成的列表; 如果 axis == 0,输出的 tensor 的 shape 为 (N, A, B, C) 如果 axis == 1,输出的 tensor 的 shape 为 (A, N, B, C) 示例:12345678910111213141516171819import tensorflow as tfx = [1, 4]y = [2, 5]z = [3, 6]stack_0 = tf.stack([x, y, z])print (stack_0.get_shape()) # (3, 2)stack_1 = tf.stack([x, y, z], axis=1)print (stack_1.get_shape()) # (2, 3)with tf.Session() as sess: stack_0_val, stack_1_val = sess.run([stack_0, stack_1]) print ('stack_0_val:') print (stack_0_val) # [[1, 4], [2, 5], [3, 6]] print ('stack_0_val.shape: %s' % str(stack_0_val.shape)) # (3, 2) print ('stack_1_val:') print (stack_1_val) # [[1, 2, 3], [4, 5, 6]] print ('stack_1_val.shape: %s' % str(stack_1_val.shape)) # (2, 3) 输出结果:1234567891011stack_0.get_shape(): (3, 2)stack_1.get_shape(): (2, 3)stack_0_val:[[1 4] [2 5] [3 6]]stack_0_val.shape: (3, 2)stack_1_val:[[1 2 3] [4 5 6]]stack_1_val.shape: (2, 3)]]></content>
<categories>
<category>TensorFlow</category>
</categories>
<tags>
<tag>TensorFlow</tag>
</tags>
</entry>
<entry>
<title><![CDATA[TensorFlow的2种安装方法---pip安装和源码安装]]></title>
<url>%2F2017%2F10%2F01%2Ftensorflow-install%2F</url>
<content type="text"><![CDATA[本篇学习笔记是在 macOS 系统上进行的演示,python 版本为 2.7.10,如果大家想学习在 windows,linux 等系统上的安装步骤,可以参考一下官方的安装 TensorFlow 的方法:https://www.tensorflow.org/install/ ,个人建议在虚拟环境下安装 TensorFlow。下面介绍 TensorFlow 的2种安装方法。 通过「pip」直接安装安装「pip」如果已经安装,跳过此步1sudo easy_install pip 查看 pip 是否安装成功1pip —version 安装「tensorflow」安装CPU版本:1pip install tensorflow 安装GPU版本:1pip install tensorflow-gpu 注:默认安装都是最新版本,如需要安装指定版本,需要加上版本号例如安装1.0.0版本安装CPU版本:1pip install tensorflow==1.0.0 安装GPU版本:1pip install tensorflow-gpu==1.0.0 通过源码安装首先Mac下内置有gcc,可以通过终端命令gcc -v 查看: 其中的4.2.1就是gcc的版本,或者大家也可以直接输入终端命令python进行查看 里面有一个GCC 4.2.1,感觉比上面那个命令更直观一些。然后就是要安装Google自家的编译工具bazel了,mac上最好的办法就是直接使用brew安装了:\brew install bazel安装好之后就要下载官方的TensorFlow源码了:git clone https://github.com/tensorflow/tensorflow下载完成后会在你的用户名的目录下生成一个tensorflow的文件夹,使用cd tensorflow进入这个文件夹,然后输入:./configure进行配置,通常情况下没有特殊的要求,一般全部都选择n,需要输入path的地方敲回车,使用默写path 配置完成后就是编译过程了,输入终端命令:bazel build –config=opt //tensorflow/tools/pip_package:build_pip_package经过漫长的编译后,任务就基本上完成了,接下来就是输入下面的命令来生成pip安装包了:bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg接下来安装这个wheel。如果之前pip装过tf的话,最好先卸载掉:pip uninstall tensorflow再安装pip install /tmp/tensorflow_pkg/tensorflow-1.3.0-cp27-cp27m-macosx_10_12_intel.whl安装成功Installing collected packages: tensorflowSuccessfully installed tensorflow-1.2.0验证安装遇到的问题:如果错误是bazel相关的,请卸载bazel重新安装。]]></content>
<categories>
<category>TensorFlow</category>
</categories>
<tags>
<tag>TensorFlow</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Python虚拟环境---virtualenv的安装及使用]]></title>
<url>%2F2017%2F08%2F10%2Fvirtualenv-using-tutorial%2F</url>
<content type="text"><![CDATA[在开发 Python 应用程序的时候,系统安装的 Python只有一个版本,所有第三方的包都会被 pip 安装到 Python 的 site-packages 目录下。如果我们要同时开发多个应用程序,那这些应用程序都会共用这个安装在系统的 Python。如果 「应用A」 需要 Python 2.6 版本,而 「应用B」 需要 Python 2.7 版本,这种情况下共用这个安装在系统的 Python 版本就不能满足需求了,每个应用需要各自拥有一套「独立」的 Python 运行环境。virtualenv 就是用来为一个应用创建一套「独立」的 Python 运行环境,在虚拟环境下,用 pip 安装的包都被安装到虚拟环境 Python 的 site-packages 下,系统 Python 环境不受任何影响。 安装「virtualenv」1sudo pip install virtualenv 查看 virtualenv 是否安装成功1virtualenv —version 创建「virtualenv」环境切换到虚拟环境要存放的目录,创建虚拟环境:1virtualenv <env_name> 个人建议: 虚拟环境与项目在同一目录下,并且虚拟环境以前缀 env_ 加项目名来命名。示例:machine_learning 是项目目录,env_machine_learning 是虚拟环境目录。 激活「virtualenv」环境1source <env_name>/bin/activate 激活成功后,命令提示符有个(<env_name>)前缀,表示当前环境是一个名为 <env_name> 的 Python 虚拟环境。 退出「virtualenv」环境1deactivate 退出成功后,命令提示符(<env_name>)前缀消失,此时就回到了正常的系统环境。]]></content>
<categories>
<category>Tool</category>
</categories>
<tags>
<tag>virtualenv</tag>
</tags>
</entry>
<entry>
<title><![CDATA[终端复用工具---「tmux」的安装及使用]]></title>
<url>%2F2017%2F08%2F09%2Ftmux-using-tutorial%2F</url>
<content type="text"><![CDATA[简介tmux 是一个优秀的终端复用软件,即使非正常掉线,也能保证当前的任务运行,这一点对于远程 ssh 访问特别有用,网络不好的情况下仍然能保证工作现场不丢失! tmux 完全使用键盘控制窗口,实现窗口的切换。 安装在「Mac OS」中安装安装「Homebrew」如果没有 homebrew ,先安装 homebrew ,如果已经安装,则跳过此步。1ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 安装「Tmux」1brew install tmux 查看是否安装成功通过如下命令查看 tmux 的版本号1tmux -V 当前安装版本为 2.6,则终端显示如下:1tmux 2.6 在「Ubuntu」中安装在终端输入如下命令:1sudo apt-get install tmux 「Tmux」的配置文件tmux 的配置文件为 ~/.tmux.conf ,每当开启一个新的会话时,tmux 都会先读取这个文件。本人使用的配置文件如下: 12345678910111213141516171819# 状态栏# 颜色set -g status-bg blackset -g status-fg white# 对齐方式set-option -g status-justify centre# 左下角set-option -g status-left '#[bg=black,fg=green][#[fg=cyan]#S#[fg=green]]'set-option -g status-left-length 20# 窗口列表setw -g automatic-rename onset-window-option -g window-status-format '#[dim]#I:#[default]#W#[fg=grey,dim]'set-window-option -g window-status-current-format '#[fg=cyan,bold]#I#[fg=blue]:#[fg=cyan]#W#[fg=dim]'# 右下角set -g status-right '#[fg=green][#[fg=cyan]%Y-%m-%d#[fg=green]]' 「Tmux」的快捷键前缀(Prefix)为了使自身的快捷键和其他软件的快捷键互不干扰, tmux 提供了一个快捷键前缀(Prefix),默认是组合键 Ctrl-b(同时按下 Ctrl 键和 b 键)当想要使用快捷键时,需要先按下快捷键前缀,然后再按下快捷键,以下把前缀按键称为 Prefix。 下面介绍一下 tmux 的三个核心概念,会话(session)、窗口(window)和窗格(pane)及其基本用法。 会话「session」创建session创建一个新的会话,只需要在终端运行如下的命令:1tmux new -s <session_name> -n <window_name> 参数说明: -s 参数表示会话名称,如果不加 -s 参数,那么 tmux 默认会新建一个以数字(下标从 0 开始)命名的会话,并默认打开一个窗口。-n 参数表示默认打开的窗口的名称 重命名session1Prefix + $ : 重命名当前的会话 断开session想要暂时从 tmux 暂时分离,回到终端环境时,可以通过如下快捷键。1Prefix + d : 断开当前的会话 注意,即使是 detach 的状态,tmux 中在运行的程序还会继续运行 回到session想要回到 session 时,只需执行:1tmux attach -t <session_name> 列出session在终端下,运行如下命令列出当前有多少个会话:1tmux ls 在会话中列出当前有多少个会话1Prefix + s : 列出所有会话 关闭session在终端下,要真正关闭一个会话,可以运行如下命令:1tmux kill-session -t <session_name> 参数说明: -t 参数表示会话名称。 窗口「window」如果说会话是个不可见的东西,那么窗口就是我们输入、执行命令的地方。一个会话 可以包含多个会话。 创建window在创建会话的时候默认会创建一个以 数字下标+bash 命名的窗口,并且名称随着 bash 中执行的不同命令而变化。1Prefix + c : 创建一个新窗口 重命名window1Prefix + , : 重命名当前窗口 切换window同一个会话下的多个window之间切换。1234Prefix + p: 切换到上一个窗口。 Prefix + n: 切换到下一个窗口 。 Prefix + 0: 切换到0号window,依次类推,1、2、3... Prefix + w: 列出全部窗口,通过上、下键选择要进入的窗口,按回车键即可进入所选择的窗口中。 关闭window1Prefix + & : 关闭当前窗口。 窗格「pane」一个窗口可以切割成多个窗格,也就是所谓的分屏。 创建pane12Prefix + % : 垂直分屏,用一条垂线把当前窗口分成左右两屏。 Prefix + " : 水平分屏,用一条水平线把当前窗口分成上下两屏。 切换pane1234Prefix + o : 依次切换当前窗口下的各个窗格。 Prefix + Up|Down|Left|Right : 根据按箭方向选择切换到某个窗格。 Prefix + Space(空格键): 对当前窗口下的所有窗格重新排列布局,每按一次,换一种样式。 Prefix + z : 最大化当前窗格。再按一次后恢复。 关闭pane1Prefix + x : 关闭当前使用中的窗格。 其他pane快捷键12345Prefix + q : 显示窗格的编号Prefix + } : 与下一个窗格交换位置Prefix + { : 与上一个窗格交换位置Prefix + ! : 在新窗口中显示当前窗格Prefix + t : 在当前窗格显示时间 滚屏1Prefix + [ : 滚屏 滚屏要进入 copy-mode,然后就可以用上下键来滚动屏幕,配置了 vi 快捷键模式,就可以像操作 vi 一样来滚动屏幕,非常的方便。 退出直接回车键或 q键即可退出]]></content>
<categories>
<category>Tool</category>
</categories>
<tags>
<tag>linux, tmux</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Git常用命令教程]]></title>
<url>%2F2017%2F08%2F05%2Fgit-command-tutorial%2F</url>
<content type="text"><![CDATA[Git简介Git 介绍Git 是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git的读音为/gɪt/。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 什么文件可以被 Git 管理?文本文件(.txt),脚本文件(.py等),各种基于文本信息的文件. 什么文件不能被 Git 管理?图片文件(.jpg等),PDF(.pdf),MS Word(.doc),MS Power Point(.ppt),MS Excel(.xls)等。 Git 基础Git 直接记录快照,而非差异比较Git 和其它版本控制系统(包括 Subversion 等)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个「快照流」。这是 Git 与几乎所有其它版本控制系统的重要区别。 因此 Git 重新考虑了以前每一代版本控制系统延续下来的诸多方面。Git 更像是一个小型的文件系统,提供了许多以此为基础构建的超强工具,而不只是一个简单的 VCS。 Git 不需要联网就能工作在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息,由于本地磁盘上就有项目的完整历史,所以大部分操作看起来瞬间完成。而其他集中式版本控制系统(例如 SVN等),必须联网才能工作, 所有操作都有网络延时开销。 Git 保证完整性Git 的内容完整性要优于其他集中式版本控制系统(例如 SVN等)。Git 中所有数据在存储前都计算校验和,然后以校验和来引用。这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若在传送过程中丢失信息或损坏文件,Git 就能发现。Git 用以计算校验和的机制叫做 SHA-1 哈希散列。 这是一个由40个十六进制字符(0-9 和 a-f)组成字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:24b9da6552252987aa493b52f8696cd6d3b00373,Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值。 实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。 Git 一般只添加数据Git 操作,几乎只往 Git 数据库中增加数据。 很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。 同别的 VCS 一样,未提交更新时有可能丢失或弄乱修改的内容;但是一旦你提交快照到 Git 中,就难以再丢失数据,特别是如果你定期的推送数据库到其它仓库的话。这使得在使用 Git 成为一个安心愉悦的过程,因为我们深知可以尽情做各种尝试,而没有把事情弄糟的危险。 Git 安装最早 Git 是在 Linux 上开发的,很长一段时间内,Git 也只能在 Linux 和 Unix 系统上跑。目前,Git 已经可以在 Linux、Unix、Mac 和 Windows 几大平台上运行。详细的安装说明请前往 Git官网安装说明 查看, Git 在每种系统上的安装方式各不相同,安装步骤分别如下: Linux平台上安装打开 terminal,可以用下面的命令安装: Debian/Ubuntu1$ apt-get install git-all 使用 git --version 查看是否安装成功12$ git --versiongit version 2.7.4 Centos/RedHat1$ yum -y install git-all 使用 git --version 查看是否安装成功12$ git --versiongit version 1.7.1 Mac 平台上安装1、先下载 .dmg 安装包,下载地址为:https://git-scm.com/download/mac ,点击下载到本地,下载文件例如:git-2.14.1-intel-universal-mavericks.dmg2、双击安装包进行安装即可3、使用 git --version 查看是否安装成功12$ git --versiongit version 2.14.1 Windows 平台上安装1、先下载 .exe 安装包,下载地址为:https://git-scm.com/download/win ,选择适合当前系统的版本,点击下载到本地2、双击安装包进行安装即可3、在开始菜单里找到Git->Git Bash,会弹出 Git 命令窗口,使用 git --version 查看是否安装成功12$ git versiongit version 2.14.2.windows.1 Git 配置安装 Git 后,每台计算机上只需要进行一次配置,程序升级时会保留配置信息。你可以在任何时候再次通过运行命令来修改它们。Git 自带一个 git config 的工具,专门用来配置或读取相应的工作环境变量。这些变量存储在三个不同的位置: /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置,如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。 ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户,可以传递 --global 选项让 Git 读写此文件。 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。 每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。 在 Windows 系统中,Git 会查找 $HOME 目录下(一般情况下是 C:\Users\$USER)的 .gitconfig 文件。 Git 同样也会寻找 /etc/gitconfig 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。 配置用户信息当安装完 Git 应该做的第一件事就是设置个人的「用户名称」与「邮件地址」。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:12$ git config --global user.name lichengjin$ git config --global user.email lichengjin606@gmail.com 再次强调,如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情,Git 都会使用那些信息。当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global选项的命令来配置,新的设定保存在当前项目的 .git/config 文件里。 查看配置信息要检查已有的配置信息,可以使用 git config --list 命令:123$ git config --listuser.name=lichengjinuser.email=lichengjin606@gmail.com 有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。这些配置我们也可以在 ~/.gitconfig 或 /etc/gitconfi 看到,如下所示:1$ vim ~/.gitconfig 显示内容如下所示:123[user] name = lichengjin email = lichengjin606@gmail.com 你可以通过输入 git config <key> 来检查 Git的某一项配置,例如:12$ git config user.namelichengjin Git 工作流程Git 的工作流程如下: 克隆 Git 资源作为工作目录。 在克隆的资源上添加或修改文件。 如果其他人修改了,你可以更新资源。 在提交前查看修改。 提交修改。 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。 下图展示了 Git 的工作流程,图片来自菜鸟教程: Git 工作区,暂存区和版本库工作区:就是你在电脑里能看到的目录。是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。暂存区:英文叫stage, 或index。是一个文件,一般存放在 .git/index 中,保存了下次将提交的文件列表信息,有时候也被称作索引( index )。版本库:版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以还原。工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库,是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。下面这个图展示了「工作区」、「暂存区」和「版本库」之间的关系,图片来自菜鸟教程:图中左侧为「工作区」,右侧为「版本库」。在「版本库」中标记为 index 的区域是「暂存区」(stage,index),标记为 master 的是 master 分支所代表的目录树。图中我们可以看出此时 HEAD 实际是指向 master 分支的一个「游标」。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。图中的 objects 标识的区域为 Git 的「对象库」,实际位于 .git/objects 目录下,里面包含了创建的各种对象及内容。当对「工作区」修改或新增的文件执行 git add 命令时,「暂存区」的目录树被更新,同时「工作区」修改或新增的文件内容被写入到「对象库」中的一个新的对象中,而该对象的 ID 被记录在暂存区的文件索引中。当执行提交操作 git commit 时,「暂存区」的目录树写到「版本库」中,master 分支会做相应的更新。即 master 指向的目录树就是提交时「暂存区」的目录树。当执行 git reset HEAD 命令时,「暂存区」的目录树会被重写,被 master 分支指向的目录树所替换,但是「工作区」不受影响。当执行 git rm --cached <file> 命令时,会直接从「暂存区」删除文件,「工作区」则不做出改变。当执行 git checkout . 或者 git checkout -- <file> 命令时,会用「暂存区」全部或指定的文件替换「工作区」的文件。这个操作很危险,会清除「工作区」中未添加到「暂存区」的改动。当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换「暂存区」和以及「工作区」中的文件。这个命令也是极具危险性的,因为不但会清除「工作区」中未提交的改动,也会清除「暂存区」中未提交的改动。 获取版本库创建新的版本库1、 选择一个合适的地方,创建一个空目录: 1234$ mkdir git_tutorial$ cd git_tutorial$ pwd/Users/lichengjin/workspace/git_tutorial 2、 通过 git init 命令把这个目录变成 Git 可以管理的仓库:注:如果打算使用 Git 来对现有的项目进行管理,只需要进入该项目目录并输入git init。 12$ git initInitialized empty Git repository in /Users/lichengjin/workspace/git_tutorial/.git/ 该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干,是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。如果你没有看到 .git 目录,那是因为这个目录默认是隐藏的,用 ls -a 命令查看即可:12$ ls -a. .. .git 克隆现有的版本库如果你想获得一份已经存在了的 Git 仓库的拷贝,比如说,你想为某个开源项目贡献自己的一份力,这时就要用到 git clone 命令。 如果你对其它的 VCS 系统(比如说 Subversion )很熟悉,请留心一下你所使用的命令是 clone 而不是 checkout。 这是 Git 区别于其它版本控制系统的一个重要特性,Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。 事实上,如果你的服务器的磁盘坏掉了,你通常可以使用任何一个克隆下来的用户端来重建服务器上的仓库(虽然可能会丢失某些服务器端的挂钩设置,但是所有版本的数据仍在)。 克隆仓库的命令格式:1git clone <repo> 例如:1git clone https://github.com/ChengjinLi/machine_learning.git 如果我们需要克隆到指定的目录,可以使用以下命令格式:1git clone <repo> <directory> 例如:1git clone https://github.com/ChengjinLi/machine_learning.git mj_machine_learning 参数说明: repo:Git 仓库。 directory:本地目录。 Git 支持多种数据传输协议。 上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用 SSH 传输协议。 Git 文件生命周期请记住,「工作目录」下的每一个文件都不外乎这两种状态:「已跟踪」或「未跟踪」。「已跟踪」的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于「未修改」,「已修改」或「已放入暂存区」。 「工作目录」中除「已跟踪」文件以外的所有其它文件都属于「未跟踪」文件,它们既不存在于上次快照的记录中,也没有放入「暂存区」。 初次克隆某个仓库的时候,「工作目录」中的所有文件都属于「已跟踪」文件,并处于「未修改」状态。编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为「已修改」文件。 我们逐步将这些修改过的文件放入「暂存区」,然后提交所有暂存了的修改,如此反复。使用 Git 时文件的生命周期如下: Git 常用命令git add <file_name>/<dir_name>将文件添加到暂存区,参数可以是指定路径的文件名或目录的名字,也可以使用 glob 模式。 git status查看项目的当前状态,输出详细内容git status --short 或 git status -s查看项目的当前状态,以简短的结果输出状态说明: ?? 未跟踪的文件 M:修改过的文件,出现在靠左边的M表示该文件被修改了并放入了暂存区,出现在右边的M表示该文件被修改了但是还没放入暂存区, A:新添加到暂存区的文件 D:已删除(deleted) R:重命名(renamed) C:已拷贝(copied) U:已更新但为合并(updated but unmerged) git diff查看尚未 add 的所有文件的改动和上个已经 commit的文件的不同git diff <file_name>查看尚未 add 的 <file_name> 文件的改动和上个已经 commit的文件的不同git diff --cached查看已经 add 的文件的改动git diff HEAD查看已 add 的与未 add 的所有改动git diff --stat显示摘要而非整个diff git commit -m "message"将暂存区的文件提交到版本库,-m后面输入的是本次提交的说明,可以输入任意内容,最好是有意义的,方便从历史记录找到改动记录。git commit --amend --no-edit将本次改动直接合并到上一个 commit 中git commit -am "message"跳过使用暂存区的方式,自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。 git rm <file_name>/<dir_name>将文件从暂存区域移除,参数可以是指定路径的文件名或目录的名字,也可以使用 glob 模式。git rm --cached <file_name>/<dir_name>将文件从 Git 仓库中删除,但仍然希望保留在当前工作目录中,参数可以是指定路径的文件名或目录的名字,也可以使用 glob 模式。 git mv <file_from> <file_to>将 Git 中的 <file_from> 重命名为 <file_to> git log查看历史提交记录,显示从最近到最远的提交日志git log --oneline一行显示一次提交git log --oneline --graph查看历史中什么时候出现了分支、合并,开启了拓扑图选项git log --author=<user_name>查找指定用户 <user_name> 的提交日志 git reflog查看历史命令记录,显示从最近到最远的日志 git reset HEAD取消已缓存的内容,即取消之前 git add 添加的内容在 Git 中,用 HEAD 表示当前版本,上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成 HEAD~100。git reset <file_name>取消已缓存的<file_name>,即取消之前 git add 添加的内容git reset --hard <commit_id>回退到指定 <commit_id> 版本,<commit_id>没必要写全,前位(例如前7位)就可以了,Git 会自动去找,当然也不能只写前一两位,因为 Git 可能会找到多个版本号,就无法确定是哪一个了。 git checkout <commid_id> -- <file_name>将 <file_name> 回退到 <commid_id> 的版本git checkout <branch_name>将 HEAD 从当前分支切换到 <branch_name> 分支git checkout -b <branch_name>创建 <branch_name> 分支,并切换到新建的分支 git branch查看当前分支,*代表了当前 HEAD 所在的分支git branch <branch_name>创建 <branch_name> 分支 git merge <branch_name>将 <branch_name> 合并到当前分支,Git 会采用默认的 Fast forward 格式进行合并,这次合并操作不会有 commit 信息,log 中也不会有分支的图案。git merge --no-diff -m "message" <branch_name>采取 --no-ff 这种方式保留合并的 commit 信息。 忽略文件一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为.gitignore 的文件,列出要忽略的文件模式。要养成一开始就设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。文件 .gitignore 的格式规范如下: 所有空行或者以 # 开头的行都会被 Git 忽略。 可以使用标准的 glob 模式匹配。 匹配模式可以以(/)开头防止递归。 匹配模式可以以(/)结尾指定目录。 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。 所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号*匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号?只匹配一个任意字符;如果在方括号中使用短划线-分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有0到9的数字)。 使用两个星号*表示匹配任意中间目录,比如a/**/z 可以匹配 a/z, a/b/z 或 a/b/c/z等。GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,你可以在 https://github.com/github/gitignore 找到它. Github 使用Github 是一个大家都积极贡献的地方, 你可以和各种人合作创作,也是开源的天堂, 只要你愿意, 任何人都能下载, 或修改你的杰作。在Github 上注册一个账户然后添加一个 online 版本库 repository连接本地版本库1git remote add [alias] [url] 例如:12$ git remote add origin https://github.com/ChengjinLi/machine_learning.git$ git push -u origin master # 推送本地 master 去 origin 在执行 commit 之后,可以执行 git push -u origin master 将本地修改提交到 Github 要查看当前配置有哪些远程仓库,可以用命令:12$ git remoteorigin 执行时加上 -v 参数,你还可以看到每个别名的实际链接地址。123$ git remote -vorigin https://github.com/ChengjinLi/machine_learning.git (fetch)origin https://github.com/ChengjinLi/machine_learning.git (push) 删除别名为 <alias> 的远程仓库1$ git remote rm <alias> 相关链接Git 官网: https://git-scm.com/Git 完整命令手册地址: http://git-scm.com/docsPro Git book: https://git-scm.com/book/zh/v2廖雪峰Git教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000菜鸟Git教程: http://www.runoob.com/git/git-tutorial.htmlGithub 官网: https://github.com/]]></content>
<categories>
<category>Tool</category>
</categories>
<tags>
<tag>git</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Vim常用命令教程]]></title>
<url>%2F2017%2F08%2F04%2Fvim-command-tutorial%2F</url>
<content type="text"><![CDATA[vim 的配置文件在根目录的 .vimrc 文件中,如果没有,自己创建一个。打开 .vimrc 文件,输入配置,配置如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051set paste " 进入paste模型set number " 显示行号set tabstop=4 " 一个tab为4个空格长度set shiftwidth=4 " 将换行自动缩进设置成4个空格set expandtab " 输入tab时自动将其转化为空格set sts=4 " 敲入tab键时实际占有的列数set autoindent " 设置自动缩进set smartindent " 智能缩进set mouse=a " 鼠标可用syntax on " 语法高亮set hlsearch " 开启查找匹配的高亮显示, 简写set hls" set nohlsearch " 关闭查找匹配的高亮显示, 简写set nohlsset encoding=utf-8 " 屏幕显示的编码set fileencoding=utf-8 " 正在被编辑的文件的编码set fileencodings=ucs-bom,utf-8,cp936,gbk,gb2312set termencoding=utf-8set showmatch " 括号匹配 set ruler " 右下角显示光标状态行 set incsearch " 设置快速搜索 set foldenable " 开启代码折叠 set fdm=manual " 手动折叠 set foldmethod=syntax " 自动语法折叠 set modeline " 自动载入模式行set cursorline " 开启光亮光标行set cursorcolumn " 开启光亮光标列" vundle 环境设置filetype offset rtp+=~/.vim/bundle/Vundle.vim vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间call vundle#begin()Plugin 'altercation/vim-colors-solarized'Plugin 'tomasr/molokai'Plugin 'vim-scripts/phd'Plugin 'Lokaltog/vim-powerline'Plugin 'octol/vim-cpp-enhanced-highlight'Plugin 'Raimondi/delimitMate'Plugin 'scrooloose/nerdtree'Plugin 'vim-scripts/indentpython.vim'Plugin 'davidhalter/jedi-vim'"Plugin 'w0rp/ale'Plugin 'Shougo/neocomplete.vim'Plugin 'majutsushi/tagbar'" 插件列表结束call vundle#end()filetype plugin indent onmap <F3> :nohlsearch<CR> " 绑定快捷键来去掉当前显示的高亮(一次性):set pastetoggle=<F10> " 绑定快捷键来激活/取消 paste模式nnoremap <silent> <F11> :AV<CR> map <F12> :q<CR> " 绑定快捷键来退出当前vim编辑: 设置说明: set shiftwidth(简写:sw) 这个是用于程序中自动缩进所使用的空白长度。一般来说为了保持程序的美观,和下面的参数最好一致。同时它也是符号移位长度的制定者。 set tabstop(简写:ts) 定义tab所等同的空格长度,linux 内核代码建议每个tab占用8列,因为如果是其它值的话,可能引起文件在打印之类的场合中看起来很别扭。 set expandtab(简写:et) 输入tab时自动将其转化为空格,这样的话就不会一起混淆,不过毕竟制表符为8是最常用最普遍的设置,所以一般还是不要改。举个例子,在多人一起开发项目时,为了使代码风格尽量保持一致,一般不允许在代码使用TAB符,而以4个空格代之。 set softtabstop(简写:sts) 敲入tab键时实际占有的列数。如果我们希望改变程序中的缩进怎么办?shiftwidth和tabstop不一样的话,你会发现程序比较难看的。这时候,softtabstop就起作用了。可以从vim的说明中看到,一旦设置了softtabstop的值时,你按下tab键,插入的是空格和tab制表符的混合,具体如何混合取决于你设定的softtabstop,举个例子,如果设定softtabstop=8, 那么按下tab键,插入的就是正常的一个制表符;如果设定 softtabstop=16,那么插入的就是两个制表符;如果softtabstop=12,那么插入的就是一个制表符加上4个空格;如果softtabstop=4呢?那么一开始,插入的就是4个空格,此时一旦你再按下一次tab,这次的四个空格就会和上次的四个空格组合起来变成一个制表符。换句话说,softtabstop是“逢8空格进1制表符”,前提是你tabstop=8。 set number(简写:nu) 显示行号 set nonumber(简写:nonu) 关闭行号显示 set ruler 设置在窗口右下角显示行号,与上面的好处是,节省空间 set autoindent(简写:ai) 设置自动缩进 syntax on 语法高亮 set smartindent 智能缩进 set encoding 屏幕显示的编码,目前大部分Linux系统已经将utf-8作为默认locale,encoding就应是utf-8以方便显示。该选项使用于缓冲的文本(你正在编辑的文件),寄存器,Vim 脚本文件等等。你可以把 ‘encoding’ 选项当作是对 Vim 内部运行机制的设定。 set fileencoding 正在被编辑的文件的编码,它也决定新文件的编码。如果为空,表示与encoding相同。如果与encoding不同,vi将会在保存和读取时做二者之间的转换。 set fileencodings 供vim尝试的编码列表,vi会逐个尝试每一项,如果没有发生错误,就设置当前的fileencoding为与该项相同的值。如果均失败,fileencoding将为空。 set termencoding 输出到客户终端(Term)采用的编码类型,默认空值,也就是输出到终端不进行编码转换。 set showmatch 括号匹配 set ruler 右下角显示光标状态行 set incsearch 设置快速搜索 set foldenable 开启代码折叠 set fdm=manual 手动折叠 set foldmethod=syntax 自动语法折叠 set modeline 自动载入模式行 set ignorecase 大小写无关 set noignorecase 大小写敏感 set hlsearch 开启查找匹配的高亮显示, 简写set hls set nohlsearch 关闭查找匹配的高亮显示, 简写set nohls :nohlsearch 去掉当前显示的高亮(一次性) :set paste 进入paste模型,进入 paste 模式后,按 i 键进入插入模式,然后再粘帖,文本格式不会错乱了。但粘帖后还需要按 进入普通模式并执行如下命令结束 paste 模式: :set nopaste 结束 paste 模式 :set pastetoggle= paste有一个切换paste开关的选项,这就是pastetoggle。通过它可以绑定快捷键来激活/取消 paste模式 vim 的插件使用 vundle 管理: 安装 vundle:1git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 安装插件,先找到其在 github.com 的地址,再将配置信息加入 .vimrc 中的call vundle#begin() 和 call vundle#end() 之间,如我的配置文件所示,Plugin ‘插件地址’ 即为添加插件,例如:1Plugin 'majutsushi/tagbar' 最后进入 vim 执行:1:PluginInstall 便安装完成插件。 如需删除插件,只需将 Plugin ‘插件地址’ 删除或者注释掉,再进入 vim 执行: 1:PluginClean 便将插件删除。 如需升级插件,进入 vim 执行:1:PluginUpdate 便完成升级。]]></content>
<categories>
<category>Tool</category>
</categories>
<tags>
<tag>Vim</tag>
</tags>
</entry>
<entry>
<title><![CDATA[本地挂载服务器文件夹工具---「sshfs」的安装及使用]]></title>
<url>%2F2017%2F08%2F03%2Fsshfs-install-and-using-on-mac%2F</url>
<content type="text"><![CDATA[对于习惯在本地使用「IDE」工具进行编辑而不习惯在服务器上使用 「vim」 进行编辑的同学,下面介绍一个非常方便的在本地挂载服务器文件夹的工具 「sshfs」。下面介绍在「Mac」(系统版本:macOS Sierra 10.12.6)下的安装及使用方法: 安装「sshfs」安装 Homebrew 先确定是否已经安装「Homebrew」,在命令行执行如下命令:1brew -v 输出示例:12Homebrew >1.2.0 (no git repository)Homebrew/homebrew-core (git revision 9cf7; last commit 2017-09-22) 如果没有安装,则执行如下命令进行安装,在命令行执行如下命令:1ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 安装 「sshfs」 的依赖 「osxfuse」执行如下命令:1brew install caskroom/cask/osxfuse 安装 「sshfs」执行如下命令:1brew install sshfs 使用 「sshfs」 挂载执行如下命令:1sshfs -C -o reconnect user@hostname:remote_dir local_dir 参数说明如下: user: 远程连接用户名 hostname: 远程连接的主机名 remote_dir: 远程目录 local_dir: 本地目录 查看挂载情况1df -h local_dir 使用 「umount」 取消挂载1umount local_dir 相关问题如过我们的Mac休眠或重启, 发现挂载的失败了, 进入目录:1ls local_dir 会提示如下类似信息:1ls: local_dir: Input/output error 取消挂载1umount local_dir 又会提示1umount: local_dir: not currently mounted 这个时候, 我们不得不关闭进程了, 可以先通过命令查看进程1pgrep -lf sshfs 然后杀掉相应的挂载进程, 或者直接杀掉所有挂载进程1pkill -9 sshfs 之后重新挂载响应的目录即可 相关链接:http://www.jianshu.com/p/8723ba79f35a]]></content>
<categories>
<category>Tool</category>
</categories>
<tags>
<tag>sshfs</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Markdown 使用教程]]></title>
<url>%2F2017%2F08%2F02%2Fmarkdown-using-tutorial%2F</url>
<content type="text">< 说明:()中的””之间可以为链接指定title,title属性可加可不加。title属性的效果是鼠标悬停在链接上会出现指定的 title 文字。链接地址与链接标题前有一个空格。示例:1[MJ's Learning Notes](https://chengjinli.github.io/) 示例显示效果: MJ’s Learning Notes 列表有序列表语法:1数字加一个英文句点 示例:121. 有序列表12. 有序列表2 示例显示效果: 有序列表1 有序列表2 无序列表语法:1*,+,- 加上列表内容 示例:123456* 无序列表1* 无序列表2+ 无序列表3+ 无序列表4- 无序列表5- 无序列表6 示例显示效果: 无序列表1 无序列表2 无序列表3 无序列表4 无序列表5 无序列表6 引用单层引用语法:1>加上被引用的内容 示例:1> 一行内容的引用 示例显示效果: 一行内容的引用 多层引用语法:1不同数量的>加上被引用的内容 示例:12345>>>第3层引用>>第2层引用>第1层引用 示例显示效果: 第3层引用 第2层引用 第1层引用 引用其他元素语法:1引用的区块内也可以使用其他的 Markdown 语法,包括标题、列表、代码区块等: 示例:123456> ### 三级标题> 1. 第一行列表内容> 2. 第二行列表内容> > 插入代码的例子> `print ("MJ")` 示例显示效果: 三级标题 第一行列表内容 第二行列表内容 print ("MJ") 插入图片语法:1 说明:[]中写图片Alt,如果图片因为某些原因不能显示,就用定义的图片Alt文字来代替图片。()里写图片地址,()图片Title表示鼠标悬停在图片上时出现的文字。 Alt 和 Title 都不是必须的,可以省略,但建议写上。示例:1 示例显示效果: LaTeX公式行内公式语法:1$公式$ 示例:1质能守恒方程可以用一个很简洁的方程式 $E=mc^2$ 来表达。 示例显示效果: 质能守恒方程可以用一个很简洁的方程式 $E=mc^2$ 来表达。 正行公式1$$公式$$ 示例:123$$\sum_{i=1}^n a_i=0$$$$f(x_1,x_x,\ldots,x_n) = x_1^2 + x_2^2 + \cdots + x_n^2 $$$$\sum^{j-1}_{k=0}{\widehat{\gamma}_{kj} z_k}$$ 示例显示效果: $$\sum_{i=1}^n a_i=0$$ $$f(x_1,x_x,\ldots,x_n) = x_1^2 + x_2^2 + \cdots + x_n^2$$ 表格语法说明: 不管是哪种方式,第一行为表头,第二行分隔表头和主体部分,第三行开始每一行为一个表格行。 列于列之间用管道符“|”隔开。原生方式的表格每一行的两边也要有管道符。 第二行还可以为不同的列指定对齐方向。默认为左对齐,在 “-” 右边加上 “:” 为右对齐,在 “-” 两侧同时加上 “:” 为居中对齐。 示例:12345|年|月|日||-|:-:|-:||2015|5|5||2016|6|6||2017|7|7| 示例显示效果: 年 月 日 2015 5 5 2016 6 6 2017 7 7 分割线语法:你可以在一行中用三个以上的星号、减号、底线来建立一个分隔线,行内不能有其他东西。你也可以在星号或是减号中间插入空格。下面每种写法都可以建立分隔线:示例:1234* * *********- - - 示例显示效果: 代码行内代码语法:1`代码` 示例:1python语言里的函数`print()`怎么使用? 示例显示效果: python语言里的函数print()怎么使用? 多行代码语法:```第1行代码第2行代码``` 示例:```pythonif name == ‘main‘: print(“MJ”)``` 示例显示效果:12if __name__ == '__main__': print("MJ") 缩进式代码语法:缩进 4 个空格或是 1 个制表符,一个代码区块会一直持续到没有缩进的那一行(或是文件结尾)。 示例:12if __name__ == '__main__': print("MJ") 示例显示效果: if __name__ == '__main__': print("MJ") 相关链接:http://blog.leanote.com/post/freewalk/Markdown-%E8%AF%AD%E6%B3%95%E6%89%8B%E5%86%8C#title-6]]></content>
<categories>
<category>Tool</category>
</categories>
<tags>
<tag>Markdown</tag>
</tags>
</entry>
<entry>
<title><![CDATA[使用Hexo + Next + github/coding 搭建个人静态博客]]></title>
<url>%2F2017%2F08%2F01%2Fuse-hexo-next-github-and-coding-build-static-blog%2F</url>
<content type="text"><![CDATA[博客框架使用 Hexo主题使用 NexT代码托管使用 Coding Next主题修改文章内链接文本样式实现效果:https://chengjin.li/ 在themes\next\source\css\_common\components\post\post.styl文件如下位置添加css样式:123456789101112131415.post-sticky-flag { display: inline-block; font-size: 16px; -ms-transform: rotate(30deg); transform: rotate(30deg);}// 文章内链接文本样式.post-body p a{ color: #0593d3; border-bottom: none; &:hover { color: #fc6423; border-bottom: none; }} Next主题添加鼠标心形点击特效1、 在themes\next\source\js\src\目录下新建love.js,代码如下:1!function(e,t,a){function n(){c(".heart{width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);}.heart:after,.heart:before{content: '';width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 50%;-moz-border-radius: 50%;position: fixed;}.heart:after{top: -5px;}.heart:before{left: -5px;}"),o(),r()}function r(){for(var e=0;e<d.length;e++)d[e].alpha<=0?(t.body.removeChild(d[e].el),d.splice(e,1)):(d[e].y--,d[e].scale+=.004,d[e].alpha-=.013,d[e].el.style.cssText="left:"+d[e].x+"px;top:"+d[e].y+"px;opacity:"+d[e].alpha+";transform:scale("+d[e].scale+","+d[e].scale+") rotate(45deg);background:"+d[e].color+";z-index:99999");requestAnimationFrame(r)}function o(){var t="function"==typeof e.onclick&&e.onclick;e.onclick=function(e){t&&t(),i(e)}}function i(e){var a=t.createElement("div");a.className="heart",d.push({el:a,x:e.clientX-5,y:e.clientY-5,scale:1,alpha:1,color:s()}),t.body.appendChild(a)}function c(e){var a=t.createElement("style");a.type="text/css";try{a.appendChild(t.createTextNode(e))}catch(t){a.styleSheet.cssText=e}t.getElementsByTagName("head")[0].appendChild(a)}function s(){return"rgb("+~~(255*Math.random())+","+~~(255*Math.random())+","+~~(255*Math.random())+")"}var d=[];e.requestAnimationFrame=function(){return e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)}}(),n()}(window,document); 2、 在themes\next\layout\_layout.swig文件的最下方,</body>前面添加如下代码:1<script type="text/javascript" src="/js/src/love.js"></script> Next主题修改文章底部的那个带#号的标签实现效果: 方法:修改模板themes/next/layout/_macro/post.swig,搜索 rel="tag">#,将 # 换成 <i class="fa fa-tag"></i> Next主题在每篇文章末尾统一添加“本文结束”标记实现效果:方法: 在路径themes\next\layout\_macro 中新建 passage-end-tag.swig 文件,并添加以下内容:12345<div> {% if not is_index %} <div style="text-align:center;color: #ccc;font-size:14px;">-------------本文结束<i class="fa fa-heart"></i>感谢您的阅读-------------</div> {% endif %}</div> 接着打开themes\next\layout\_macro\post.swig文件,在 post-body 之后, post-footer 之前添加如下代码:12345<div> {% if not is_index %} {% include 'passage-end-tag.swig' %} {% endif %}</div> 然后打开主题配置文件_config.yml,在末尾添加:123# 文章末尾添加“本文结束”标记passage_end_tag: enabled: true Next主题修改作者头像并旋转打开themes\next\source\css\_common\components\sidebar\sidebar-author.styl,修改site-author-image相代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960.site-author-image { display: block; margin: 0 auto; padding: $site-author-image-padding; max-width: $site-author-image-width; height: $site-author-image-height; border: $site-author-image-border-width solid $site-author-image-border-color; /* 头像圆形 */ border-radius: 70px; -webkit-border-radius: 70px; -moz-border-radius: 70px; box-shadow: inset 0 -1px 0 #333sf; /* 设置循环动画 [animation: (play)动画名称 (2s)动画播放时长单位秒或微秒 (ase-out)动画播放的速度曲线为以低速结束 (1s)等待1秒然后开始动画 (1)动画播放次数(infinite为循环播放) ]*/ /* 鼠标经过头像旋转360度 */ -webkit-transition: -webkit-transform 1.0s ease-out; -moz-transition: -moz-transform 1.0s ease-out; transition: transform 1.0s ease-out;}img:hover { /* 鼠标经过停止头像旋转 -webkit-animation-play-state:paused; animation-play-state:paused;*/ /* 鼠标经过头像旋转360度 */ -webkit-transform: rotateZ(360deg); -moz-transform: rotateZ(360deg); transform: rotateZ(360deg);}/* Z 轴旋转动画 */@-webkit-keyframes play { 0% { -webkit-transform: rotateZ(0deg); } 100% { -webkit-transform: rotateZ(-360deg); }}@-moz-keyframes play { 0% { -moz-transform: rotateZ(0deg); } 100% { -moz-transform: rotateZ(-360deg); }}@keyframes play { 0% { transform: rotateZ(0deg); } 100% { transform: rotateZ(-360deg); }} Next主题设置网站的图标Favicon方法:将一张32x32的ico图标名称改为favicon.ico,然后把图标放在themes/next/source/images里,并且修改主题配置文件:12# Put your favicon.ico into `hexo-site/source/` directory.favicon: /images/favicon.ico]]></content>
<categories>
<category>Tool</category>
</categories>
<tags>
<tag>Hexo</tag>
<tag>Next</tag>
</tags>
</entry>
</search>