转自:

http://www.jianshu.com/p/5b19605792ab?utm_campaign=maleskine&utm_content=note&utm_medium=pc_all_hots&utm_source=recommendation

http://www.jianshu.com/p/6338fab6bd0a

  1. 刚刚拿到一个简单语料库练手,发现只有语音和对应文字, 这篇文章记录了从数据预处理到kaldi对数据进行训练和测试的全过程,这里首先训练单音节模型,其他模型后面再补充。
  2.  
  3. 语料库处理
  4.  
  5. task : 观察语料库
  6.  
  7. 语料库主要用于命令词识别,包括200个词汇,2000条语音,10个说话者分别对200个词汇进行录音。语音目录以说话者id标识:
  8.  
  9. $ tree -d
  10. ├── speaker001
  11. ├── speaker002
  12. ├── speaker003
  13. ├── speaker004
  14. ├── speaker005
  15. ├── speaker006
  16. ├── speaker007
  17. ├── speaker008
  18. ├── speaker009
  19. ├── speaker010
  20. └── Levoice.list
  21. 每个说话者文件夹目录下包含对应的200条语音:
  22.  
  23. └┤ tree speaker001
  24. speaker001
  25. ├── .wav
  26. ├── .wav
  27. ├── .wav
  28. ...
  29. └── .wav
  30. 语音文字说明文件Levoice.list 格式为<语音id> <文字> <录音时长>,例如:
  31.  
  32. └┤ head -n Levoice.list
  33. speaker001/.wav 三六零通讯录 5.6
  34. speaker001/.wav 三六五日历 2.8
  35. 语料库所给的资源应用到kaldi还需要汉字发音词典,这里只能自己准备,下面会参考thchs30语料库的词典准备自己的词典。
  36.  
  37. task : 预处理语料库
  38.  
  39. 为方便后续操作,需要对语料库文件进行预处理,这部分包括:
  40.  
  41. 重新重命名语音文件,使2000个语音文件具有唯一标识(speakerid_voiceid.wav
  42. 划分训练、测试、验证数据集
  43. 根据Levoice.list生成utt2words.txt ,进行文件名对应汉字映射。
  44. 上述过程脚本(注意rname命令在UbuntuCentos中有细微差别):
  45.  
  46. !/bin/bash
  47.  
  48. #if need cv or not
  49. needcv=true
  50.  
  51. # rename wav files by add prefix by "speaker"
  52. start_path=`pwd`
  53. for dirname in $(ls | grep "speaker")
  54. do
  55. #get first filename
  56. filename=$(ls $dirname | head -n )
  57. if [[ $filename =~ "speaker" ]]; then
  58. echo "files in $dirname have already renamed, passing..."
  59. else
  60. echo "now rename flies with prefix speakers"
  61. echo $dirname
  62. cd $dirname
  63. #in centos rename
  64. rename "" $dirname"_00" ""*
  65. # ubuntu using follows
  66. #rename "s/00/$dirname""_00/" *
  67. cd ..
  68. fi
  69. done
  70.  
  71. # devide file to train, cv and test
  72. cd $start_path
  73. rm -rf test train cv && mkdir test train cv
  74.  
  75. i=
  76. for dirname in $(ls | grep "speaker")
  77. do
  78. if [ $i -lt ];then
  79. cp $dirname/* train
  80. else
  81. cp $dirname/* test
  82. fi
  83. let i=$i+1
  84.  
  85. done
  86.  
  87. function rand(){
  88. min=$1
  89. max=$(($2-$min+1))
  90. num=$(($RANDOM+1000000000))
  91. echo $(($num%$max+$min))
  92. }
  93.  
  94. count=0
  95. array=("0" "0" "0" "0")
  96. #ls -al train
  97. if [ needcv ]; then
  98. for file in $(ls train | grep "speak")
  99. do
  100. array[$count]=$file
  101. let count=$count+1
  102. if [ $count -eq 4 ];then
  103. rnd=$(rand 0 3)
  104. mv train/${array[$rnd]} cv
  105. #echo ${array[$rnd]}
  106. let count=0
  107. fi
  108. done
  109. echo "cv files prepared over, examples number is $(ls cv | wc -l)"
  110. fi
  111. echo "train files number is $(ls train | wc -l)"
  112. echo "test files number is $(ls test | wc -l)"
  113. 语料库对训练集、验证集、测试集参考thchs30,这里将说话人9、10语音作为测试集,再从1-8语音集中的1600百条语音文件四条语音为组随机选择一条语音归入验证集,剩下的作为训练集。划分结果训练集、验证集、测试集比例6:2:2。
  114.  
  115. 在语料库目录运行上脚本,会在该目录下产生trian、test和cv目录,这些目录及文件将被后面使用。
  116.  
  117. 最后直接将Levoice.list中的信息进行简单字符替换即可:
  118.  
  119. speaker001/00001.wav 三六零通讯录 5.6
  120. ---->
  121. speaker001_00001.wav 三六零通讯录 5.6
  122. 可以在vi或其他编辑器中替换即可。
  123.  
  124. 应用Kaldi
  125.  
  126. task0 : 构建kaldi项目结构
  127.  
  128. 参照其他项目,首先复制创建项目结构目录,配置文件以及项目需要使用的依赖工具,这里多参考thchs30部分结构。在egs 目录下建立/wakeup/s5作为项目目录,在该目录下准备以下文件:
  129.  
  130. $ tree -L 1
  131. |-- cmd.sh // 运行配置目录
  132. |-- conf // 配置文件目录
  133. |-- local //存放run.sh 中调用的脚本工具,需要自己编写
  134. |-- path.sh //Kaldi 工具和库目录添加到PATH
  135. |-- run.sh // top层脚本,运行该脚本训练数据和测试, 需要自己编写
  136. |-- steps // kaldi 脚本工具, 复制到工程目录下
  137. |-- tools // kaldi 脚本工具, 复制到工程目录下
  138. `-- utils // kaldi 脚本工具, 复制到工程目录下
  139. 这里cmd.sh里根据自己运行方式配置运行参数,这里配置成单机运行
  140.  
  141. export train_cmd=run.pl
  142. export decode_cmd="run.pl --mem 4G"
  143. export mkgraph_cmd="run.pl --mem 8G"
  144. conf 目录包含一些配置文件,这里主要将系统采样频率与语料库的采样频率设置为一致:
  145.  
  146. $ ls
  147. decode_dnn.config fbank.conf mfcc.conf
  148. $ more mfcc.conf
  149. --use-energy=false # only non-default option.
  150. --sample-frequency=8000
  151. $ more decode_dnn.config
  152. beam=18.0 # beam for decoding. Was 13.0 in the scripts.
  153. lattice_beam=10.0 # this has most effect on size of the lattices.
  154. $ more fbank.conf
  155. --sample-frequency=8000
  156. --num-mel-bins=40
  157. task1 : 准备训练文件
  158.  
  159. 参照kaldi数据准备部分文档,该部分需要自己根据语料库分别就train,test,cross validation目录生成以下文件:
  160.  
  161. text : < uttid > < word >
  162. wav.scp : < uttid > < utter_file_path >
  163. utt2spk : < uttid > < speakid >
  164. spk2utt : < speakid > < uttid >
  165. word.txt : 同 text
  166. 编写local/data_pre.sh脚本供run.sh调用(下面会涉及run.sh脚本的编写),传入参数运行目录以及语料库目录:
  167.  
  168. #!/bin/bash
  169. # 2017-3-23 by zqh
  170.  
  171. # This file prepares files needed in kaldi
  172. # including text, wav.scp, utt2spk, spk2utt
  173. # output:
  174. # data/train dir include infomation of train data
  175. # data/test dir include infomation of test data
  176. # data/cv dir include infomation of cross validation data
  177.  
  178. run_dir=$1
  179. dataset_dir=$2
  180.  
  181. cd $run_dir
  182. echo "prepare data in data/{train, test, cv}"
  183. mkdir -p data/{train,test,cv}
  184.  
  185. #create text, wav.scp, utt2spk, spk2utt
  186. (
  187. i=0
  188. for dir in train cv test; do
  189. echo "clean dir data/$dir"
  190. cd $run_dir/data/$dir
  191. rm -rf wav.scp utt2spk spk2utt word.txt text
  192. #phone.txt
  193. for data in $(find $dataset_dir/$dir/*.wav | sort -u | xargs -i basename {} .wav);do
  194. let i=$i+1
  195. spkid=$(echo $data | awk -F"_" '{print "" $1}')
  196. uttid=$data
  197. echo $uttid $dataset_dir/$dir/$data.wav >> wav.scp
  198. echo $uttid $spkid >> utt2spk
  199. # gen word.txt
  200. echo $uttid $(cat $dataset_dir/utt2word.txt | grep $uttid | awk '{print "" $2}') >> word.txt
  201. # gen phone.txt TODO
  202. done
  203. cp word.txt text
  204. sort wav.scp -o wav.scp
  205. sort utt2spk -o utt2spk
  206. sort text -o text
  207. # sort phone.txt -o phone.txt
  208. done
  209. echo "all file number is $i"
  210. ) || exit 1
  211.  
  212. utils/utt2spk_to_spk2utt.pl data/train/utt2spk > data/train/spk2utt
  213. utils/utt2spk_to_spk2utt.pl data/cv/utt2spk > data/cv/spk2utt
  214. utils/utt2spk_to_spk2utt.pl data/test/utt2spk > data/test/spk2utt
  215. task2 : 训练语言模型
  216.  
  217. 由于这里仅仅需要对语料库中的200个命令词进行识别,大而全的汉语词典并不必要,这里需要根据自己的语料建立词典并且生成语言模型。
  218.  
  219. task 2.1 : 准备词典
  220.  
  221. 根据kaldi的要求,需要准备的词典包括以下文件(我这里和语料库放在同个目录下,后面kaldi从该目录下读取):
  222.  
  223. [username@hostname dict]$ pwd
  224. /home/username/dataset_wakeup/resource/dict
  225. [username@hostname dict]$ ls
  226. extra_questions.txt lexiconp.txt lexicon.txt nonsilence_phones.txt optional_silence.txt silence_phones.txt
  227. 对上面文件简单说明:
  228.  
  229. lexicon.txt: 词典,包括语料中涉及的词汇与发音,与单字及其发音。
  230. silence_phones.txt:静音标识,这里为sil。
  231. nonsilence_phones.txt : 非静音标识,与silence_phones.txt共同组成lexicon.txt中的发音。
  232. extra_questions.txt : 包含重音音调标记,这里没有用到
  233. lexiconp.txt : 如果一个词有不同发音,则会在不同行中出现多次。如果你想使用发音概率,你需要建立 exiconp.txt 而不是 lexicon.txt,这里未使用
  234. 以上文件可以参考复制thchs30的resource资源,只要替换lexicon.txt为自己的字典,并且追加thchs30中lexicon.txt中所有的单字及其发音(简单awk命令即可)。此外该语料库仅仅提供了汉字无对应发音,需要自己参考thchs30中的词典准备,(心想只有200条,觉得手打的会很快,事实用了2-3个小时,心累,回头想可以写程序完成)。
  235. lexicon.txt 文件内容大致为:
  236.  
  237. $ more lexicon.txt
  238. SIL sil
  239. <SPOKEN_NOISE> sil
  240. 三六零通讯录 s an1 l iu4 l ing2 t ong1 x vn4 l u4
  241. 三六五日历 s an1 l iu4 uu u3 r iz4 l i4
  242. 三D图库 s an1 d i4 t u2 k u4
  243. task 2.2: 生成语言模型
  244.  
  245. 语言模型训练需要使用n-gram算法,借助sirlm工具可以简单实现,并进行语言模型生成:
  246.  
  247. 安装
  248.  
  249. 下载sirlm安装包(官网下载速慢,也可通过在github上找到相应资源下载),解压后进入最上层目录进行安装。
  250. export SRILM=pwd
  251. make
  252. 把$make_dir/bin/i686-m64/加入PATH以便使用其中脚本
  253. 生成语言模型
  254.  
  255. 在语料库目录下创建lm_word文件夹(方便管理),复制上面的字典lexicon.txt,并删除前两行,保存为作为words.txt作语料输入文件进行n-gram语言模型生成(由于只是词汇识别设置n=1):
  256.  
  257. ngram-count -order 1 -text words.txt -lm word.arpa
  258. 其他参数可以参考:
  259.  
  260. -order 指定n-gram的n是多少,默认是3
  261. -text 提供输入的语料文件,统计该语料中的n-gram
  262. -lm 指定输出的lm文件
  263. -vocab 用来指定对哪些词进行n-gram统计
  264. -wbdiscount1 表示1gram Witten-Bell discounting
  265. Note:参数顺序无所谓
  266. 该命令生成arpa格式的语言模型文件,后面由kaldi的其他工具转换为FST格式使用。
  267.  
  268. 完成语言模型的生成后,对应的可以在run.sh脚本中利用该部分的语言模型,通过kaldi提供的工具构建语言模型的FST格式文件,这部分 主要创建了data/{dict,lang,graph}目录及相应文件,并在后面的构建解码图的过程中使用。run.sh脚本该部分代码:
  269.  
  270. #gen lang dir
  271. (
  272. echo "create new dir data/dict,lang,graph"
  273. cd $run_path
  274. mkdir -p data/{dict,lang,graph} && \
  275. cp $dataset//resource/dict/{extra_questions.txt,nonsilence_phones.txt,optional_silence.txt,silence_phones.txt} data/dict && \
  276. cat $dataset/resource/dict/lexicon.txt | \
  277. grep -v '<s>' | grep -v '</s>' | sort -u > data/dict/lexicon.txt || exit 1;
  278. utils/prepare_lang.sh --position_dependent_phones false data/dict "<SPOKEN_NOISE>" data/local/lang data/lang || exit 1;
  279. gzip -c $dataset/King-ASR-M-005/lm_word/word.arpa > data/graph/word.arpa.gz || exit 1;
  280. utils/format_lm.sh data/lang data/graph/word.arpa.gz $dataset/King-ASR-M-005/lm_word/lexicon.txt data/graph/lang || exit 1;
  281. )
  282. 这里主要包括utils/prepare_lang.sh 、 和utils/format_lm.sh 两个脚本的调用,不作具体分析。
  283.  
  284. 作者:zqh_zy
  285. 链接:http://www.jianshu.com/p/5b19605792ab
  286. 來源:简书
  287. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  1. task4 : 特征提取(FMCC
  2.  
  3. 完成了语言模型的构建,下面开始生成声学模型部分,首先对语音文件进行特征提取,这里用到了上面准备的文件,包括:text, wav.scp, utt2spk, spk2utt
  4. run.sh中完成特征提取,并对语音进行归一化处理:
  5.  
  6. #gen MFCC features
  7. rm -rf data/mfcc && mkdir -p data/mfcc && cp -R data/{train,cv,test} data/mfcc || exit ;
  8. for x in train cv test; do
  9. #make mfcc
  10. steps/make_mfcc.sh --nj $n --cmd "$train_cmd" data/mfcc/$x exp/make_mfcc/$x mfcc/$x || exit ;
  11. #compute cmvn
  12. steps/compute_cmvn_stats.sh data/mfcc/$x exp/mfcc_cmvn/$x mfcc/$x || exit ;
  13. done
  14. 生成的特征提取相关文件保存在data/mfcc目录下,真实的数据保存在mfcc/目录下。
  15.  
  16. task5 : 训练声学模型、 构建解码图
  17.  
  18. 该部分调用kaldi脚本,训练单音节模型,后面测试证明,单个词汇的识别,该模型同样能保证良好的识别效果,同样run.sh脚本中:
  19.  
  20. #monophone
  21. #steps/train_mono.sh --boost-silence 1.25 --nj $n --cmd "$train_cmd" data/mfcc/train data/lang exp/mono || exit ;
  22. 声学模型的训练结果文件保存在exp/mono目录下。下面构建解码图,这部分调用utils/mkgraph.sh 利用先前创建的语言模型和上步训练的声学模型构建HCLG解码图,该部分生成的解码图保存在exp/mono/graph_word文件夹下:
  23.  
  24. utils/mkgraph.sh --mono --nj $n data/graph/lang exp/mono exp/mono/graph_word || exit ;
  25. task6: 测试
  26.  
  27. local目录下创建data_decode.sh 脚本对解码步骤进行封装:
  28.  
  29. #!/bin/bash
  30. #decoding wrapper
  31. #run from ../
  32. nj=
  33. mono=false
  34. . ./cmd.sh ## You'll want to change cmd.sh to something that will work on your system.
  35. . ./path.sh ## Source the tools/utils (import the queue.pl)
  36. . utils/parse_options.sh || exit ;
  37.  
  38. decoder=$
  39. srcdir=$
  40. datadir=$
  41.  
  42. if [ $mono = true ];then
  43. echo "using monophone to generate graph"
  44. opt="--mono"
  45. fi
  46.  
  47. #decode word
  48. $decoder --cmd "$decode_cmd" $srcdir/graph_word $datadir/test $srcdir/decode_test_word || exit
  49. run.sh脚本中调用上脚本:
  50.  
  51. #test mono model
  52. local/data_decode.sh --nj "steps/decode.sh" exp/mono data/mfcc &
  53. 这里注意由于测试集只有两个说话者,并发度设置为2,否则会出现文件分割数与并发数不匹配的情况,解码过程主要用到特征提取后的test文件,上部分生成的解码图,测试结果在exp/mono/decode_test_word文件夹中查看。
  54.  
  55. 为了对测试结果进行评估,还需在local目录下完成打分脚本相关的代码,这里参考thchs30,拷贝文件:score.shwer_output_filter
  56.  
  57. 下面给出完整的run.sh脚本,之后运行脚本:
  58.  
  59. #!/bin/bash
  60.  
  61. . ./cmd.sh
  62. . ./path.sh
  63.  
  64. run_path=`pwd`
  65. n= #parallel jobs
  66.  
  67. #dataset path
  68. dataset=~/dataset_wakeup
  69.  
  70. #data prepare
  71. #gen text, wav.scp, utt2spk, spk2utt
  72. local/data_prep.sh $run_path $dataset/King-ASR-M- || exit
  73.  
  74. #gen lang dir
  75. (
  76. echo "create new dir data/dict,lang,graph"
  77. cd $run_path
  78. mkdir -p data/{dict,lang,graph} && \
  79. cp $dataset//resource/dict/{extra_questions.txt,nonsilence_phones.txt,optional_silence.txt,silence_phones.txt} data/dict && \
  80. cat $dataset/resource/dict/lexicon.txt | \
  81. grep -v '<s>' | grep -v '</s>' | sort -u > data/dict/lexicon.txt || exit ;
  82. utils/prepare_lang.sh --position_dependent_phones false data/dict "<SPOKEN_NOISE>" data/local/lang data/lang || exit ;
  83. gzip -c $dataset/King-ASR-M-/lm_word/word.arpa > data/graph/word.arpa.gz || exit ;
  84. utils/format_lm.sh data/lang data/graph/word.arpa.gz $dataset/King-ASR-M-/lm_word/lexicon.txt data/graph/lang || exit ;
  85. )
  86.  
  87. #gen MFCC features
  88. rm -rf data/mfcc && mkdir -p data/mfcc && cp -R data/{train,cv,test} data/mfcc || exit ;
  89. for x in train cv test; do
  90. #make mfcc
  91. steps/make_mfcc.sh --nj $n --cmd "$train_cmd" data/mfcc/$x exp/make_mfcc/$x mfcc/$x || exit ;
  92. #compute cmvn
  93. steps/compute_cmvn_stats.sh data/mfcc/$x exp/mfcc_cmvn/$x mfcc/$x || exit ;
  94. done
  95.  
  96. #monophone
  97. steps/train_mono.sh --boost-silence 1.25 --nj $n --cmd "$train_cmd" data/mfcc/train data/lang exp/mono || exit ;
  98. #decode word
  99.  
  100. # make decoder graph
  101. utils/mkgraph.sh --mono data/graph/lang exp/mono exp/mono/graph_word || exit ;
  102.  
  103. #test mono model
  104. local/data_decode.sh --nj "steps/decode.sh" exp/mono data/mfcc &
  105. 运行脚本,由于数据量不大,并不需要很长时间,运行测试结束查看效果:
  106.  
  107. [uesrname@hostname scoring_kaldi]$ ls
  108. best_wer log penalty_0. penalty_0. penalty_1. test_filt.txt wer_details
  109. [uesrname@hostname scoring_kaldi]$ more best_wer
  110. %WER 5.57 [ / , ins, del, sub ] exp/mono/decode_test_word/wer_17_1.
  111. 错词率为5.%,在penalty_1.0中可以查看最好的识别结果。
  112.  
  113. 小结
  114.  
  115. 文章记录了从拿到语料库,到应用Kaldi的全过程,主要想对流程进行总结,对语音识别相关的原理没有涉及太多。另外这里仅仅训练了单音节模型,其他模型可以参照thchs30完成,这里不再补充。
  116. 过程中遇到的小问题很多,一个比较典型的,一开始想偷懒直接使用thchs30的词典,后来识别结果很差,单词均为一个或两个毫不相干的字。考虑自己语料库中的词汇在thchs30的词典中并未涉及,还是通过自己标注词典解决问题。
  117.  
  118. 作者:zqh_zy
  119. 链接:http://www.jianshu.com/p/6338fab6bd0a
  120. 來源:简书
  121. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

[转]Kaldi命令词识别的更多相关文章

  1. 如何用kaldi做孤立词识别-初版

    ---------------------------------------------------------------------------------------------------- ...

  2. 机器学习&数据挖掘笔记_13(用htk完成简单的孤立词识别)

    最近在看图模型中著名的HMM算法,对应的一些理论公式也能看懂个大概,就是不太明白怎样在一个具体的机器学习问题(比如分类,回归)中使用HMM,特别是一些有关状态变量.观察变量和实际问题中变量的对应关系, ...

  3. 基于HTK语音工具包进行孤立词识别的使用教程

    选自:http://my.oschina.net/jamesju/blog/116151 1前言 最近一直在研究HTK语音识别工具包,前几天完成了工具包的安装编译和测试,这几天又按耐不住好奇,决定自己 ...

  4. Shell出现cd命令无法识别

    出现cd 等命令无法识别的原因可能是: 当前文件实在windows环境下编辑的其换行结尾是 \r\n 和linux环境的 \n 不一致导致错误, 最好在linux系统上通过 VI 命令新建文件,然后通 ...

  5. CRF技能词识别过程

    最近在用CRF做未登录技能词识别,虽然艰难,但是感觉很爽,效率非常高. (1)数据准备: 选取30000行精语料作为训练数据.每一个br作为一条数据.使用已有的技能词典对数据进行无标注分词. (2)训 ...

  6. yesno孤立词识别kaldi脚本

    path.sh主要设定路径等 export KALDI_ROOT=`pwd`/../../.. [ -f $KALDI_ROOT/tools/env.sh ] && . $KALDI_ ...

  7. 如何用kaldi做孤立词识别三

    这次wer由15%下降到0%了,后面跑更多的模型 LOG (apply-cmvn[5.2.124~1396-70748]:main():apply-cmvn.cc:162) Applied cepst ...

  8. 如何用kaldi做孤立词识别二

    基本模型没有变化,主要是调参,配置: %WER     65%  下降到了     15% 后面再继续优化... Graph compilation finish!steps/decode.sh -- ...

  9. 亲自动手用HTK实现YES NO孤立词识别

    很久以前的发在研学论坛的帖子了,再重新整理了一下,希望对新手有用. 完整版链接:http://yun.baidu.com/s/1hapcE 第一步 创建语音文件 录音 命令:HSLab any_nam ...

随机推荐

  1. Populate screen data automatically

    field zz_test-uname. module populate_record on chain-request. module populate_record input. ztlo_tes ...

  2. HBase、MongoDB、cassandra比较

    前言 传统数据库遇到的问题,数据量很大的时候无法存储:没有很好的备份机制:数据达到一定数量开始缓慢,很大的话基本无法支撑:因此我们需要探究更加合适的数据库来支撑我们的业务. HBase 什么是HBas ...

  3. pg_dump 数据处理

    从数据库导出数据 -U 用户 -p 端口 -h 主机地址 -f 导出文件地址 -O 备份数据库结构和数据,不设置拥有者 -s  只导出数据库结构 最后是库名 (全部导出)pg_dump -U post ...

  4. zabbix的api接口

    zabbix官方文档解释,api是开发者能获得修改zabbix配置,获取历史数据.主要用于: 1.创建新应用 2.集成zabbix与第三方软件 3.自动运行任务 运用JSON-RPC2.0协议,因此接 ...

  5. Mysql 数据库管理

    1. mysql用户和权限 mysql权限控制通过两步控制,第一是能不能连接(验证用户身份),第二是能执行什么操作(验证权限). 其中身份验证,需要验证连接mysql的计算机的IP地址或者计算机名称还 ...

  6. Java 字符编码(三)Reader 中的编解码

    Java 字符编码(三)Reader 中的编解码 我们知道 BufferedReader 可以将字节流转化为字符流,那它是如何编解码的呢? try (BufferedReader reader = n ...

  7. Winform 利用 Oracle.ManagedDataAccess访问Oracle数据库

    Winform 利用 Oracle.ManagedDataAccess访问Oracle数据库时出现以下错误: Message = "每个配置文件中只允许存在一个 <configSect ...

  8. 解决sqlserver还原数据库失败命令

    1.使用Master数据库 2.选择数据库 select * from master.sys.sysprocesses where dbid=db_id('database') 3.查出进程使用kil ...

  9. jieba库词频统计

    一.jieba 库简介 (1) jieba 库的分词原理是利用一个中文词库,将待分词的内容与分词词库进行比对,通过图结构和动态规划方法找到最大概率的词组:除此之外,jieba 库还提供了增加自定义中文 ...

  10. join查询优化

    更新使用过滤条件中包括自身的表 此方法不能无法在mysql中使用 `UPDATE user1 SET over='齐天大圣' WHERE user1.user_name IN ( SELECT b.u ...