在最近的工作到需要一个语言模型,为句子打分,本来准备用srilm来做,后来调研发现kenlm无论在内存还是速度上都比srilm好很多。srilm很好安装,安装过程中基本没遇到什么问题,kenlm的安装就是一个大坑,至今自己都觉得是玄学安装,这边记录下安装过程。
源码地址:https://github.com/kpu/kenlm
在安装kenlm之前需要先安装很多依赖包,主要有:
具体的安装可以参考:https://blog.csdn.net/lijiaqi0612/article/details/90082919
在安装bzip2的时候可能会因为解压tar包报错,所以bzip2包可以不通过源码安装,直接用:
sudo apt-get install libbz2-dev
安装完上面依赖之后开始安装kenlm.
mkdir -p build
cd build
cmake ..
make -j 4
github上是采用上面这几个命令即可安装完成,但是实际在操作的时候可能cmake的时候就报错了,这时候检查一下自己的所有安装的依赖是否都已经完成。
我的情况是cmake没有问题,但是最后make的时候总是不成功,搞了6个小时,玄学的解决。
报错:
CMakeFiles/sorted_uniform_test.dir/sorted_uniform_test.cc.o:在函数‘boost::unit_test::make_test_case(boost::function<void ()> const&, boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long)’中:
sorted_uniform_test.cc:(.text._ZN5boost9unit_test14make_test_caseERKNS_8functionIFvvEEENS0_13basic_cstringIKcEES8_m[_ZN5boost9unit_test14make_test_caseERKNS_8functionIFvvEEENS0_13basic_cstringIKcEES8_m]+0x31):对‘boost::unit_test::ut_detail::normalize_test_case_name(boost::unit_test::basic_cstring<char const>)’未定义的引用
CMakeFiles/sorted_uniform_test.dir/sorted_uniform_test.cc.o:在函数‘main’中:
sorted_uniform_test.cc:(.text.startup+0xb):对‘boost::unit_test::unit_test_main(bool (*)(), int, char**)’未定义的引用
collect2: error: ld returned 1 exit status
util/CMakeFiles/sorted_uniform_test.dir/build.make:94: recipe for target 'tests/sorted_uniform_test' failed
make[2]: *** [tests/sorted_uniform_test] Error 1
CMakeFiles/Makefile2:1091: recipe for target 'util/CMakeFiles/sorted_uniform_test.dir/all' failed
make[1]: *** [util/CMakeFiles/sorted_uniform_test.dir/all] Error 2
make[1]: *** 正在等待未完成的任务....
CMakeFiles/tokenize_piece_test.dir/tokenize_piece_test.cc.o:在函数‘boost::unit_test::make_test_case(boost::function<void ()> const&, boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long)’中:
tokenize_piece_test.cc:(.text._ZN5boost9unit_test14make_test_caseERKNS_8functionIFvvEEENS0_13basic_cstringIKcEES8_m[_ZN5boost9unit_test14make_test_caseERKNS_8functionIFvvEEENS0_13basic_cstringIKcEES8_m]+0x31):对‘boost::unit_test::ut_detail::normalize_test_case_name(boost::unit_test::basic_cstring<char const>)’未定义的引用
CMakeFiles/tokenize_piece_test.dir/tokenize_piece_test.cc.o:在函数‘main’中:
tokenize_piece_test.cc:(.text.startup+0xb):对‘boost::unit_test::unit_test_main(bool (*)(), int, char**)’未定义的引用
collect2: error: ld returned 1 exit status
util/CMakeFiles/tokenize_piece_test.dir/build.make:94: recipe for target 'tests/tokenize_piece_test' failed
make[2]: *** [tests/tokenize_p
具体问题参考https://github.com/kpu/kenlm/issues/79这个issue,里面有很多问题,但是别人的解决方法很多时候也并不适合自己遇到的情况,我把能试的都试了个遍,最后还是有问题。
后来我就删除了kenlm的源码,重新下载了tar.gz的kenlm,https://kheafield.com/code/kenlm.tar.gz .
重新执行了下面的几个命令:
mkdir -p build
cd build
cmake ..
make -j 4
make VERBOSE=1
make VERBOSE=1
cmake -DBUILD_TESTING=0 ..
make -j 4
把make VERBOSE=1执行了两遍,竟然就安装成功了,反正至今不知道为什么错了。
来源:CSDN
作者:咿咿呀呀呀
链接:https://blog.csdn.net/orangefly0214/article/details/103487333