NLP项目,选择Python还是C++
我们正在做一个阿拉伯语自然语言处理的项目,现在在考虑用Python还是C++(还有Boost库)来写代码。我们在想这些点:
Python
- 比C++慢(不过现在有一些工作在进行中,目的是让Python变得更快)
- 对UTF8的支持更好
- 写测试和尝试不同算法的速度更快
C++
- 比Python快
- 代码比较熟悉,几乎每个程序员都知道C或类似C的代码
项目完成后,把它移植到其他编程语言应该不会太难。
你觉得哪个更好,更适合这个项目呢?
5 个回答
这段话基本上是对Otto Almendinger回答的补充。如果你真的想在C++中实现一个大致类似于他在Python中示例的东西,我觉得下面这个代码会更接近:
#include <string>
#include <iostream>
int main() {
std::string temp;
while (std::cin>>temp)
if (temp.size()>2 && temp.substr(temp.size()-3, 3)=="ing")
std::cout << temp;
}
这个代码的功能和Python的代码基本上是一样的,而且长度也差不多——C++的代码看起来可能更复杂一些,但实际上它们的有效代码行数是一样的(不过C++的每一行代码确实要长一些)。
不要误会我的意思:我并不是说用C++开发会像用Python那样快或简单。我觉得这里展示的某些代码可能让人觉得差距很大,但实际上可能没有那么明显。
补充一下:如果你真的想说C++会更快更简单,你可以展示这样的代码:
for (std::string temp; std::cin>>temp; )
temp.size()>2 && temp.substr(temp.size()-3, 3)=="ing" && std::cout << temp;
...并配上一个虽然在事实上的确准确,但可能会误导人的说法,比如:“C++代码的语句数量只有Python实现的一半。”
虽然这个话题有点主观,也可能引发争论,但有证据表明,你可以用Python写出成功的自然语言处理(NLP)项目,比如NLTK。他们还提供了一个不同语言在NLP功能上的比较:
(引用比较内容)
许多编程语言都可以用于自然语言处理。正如前言中所解释的,我们选择Python是因为我们认为它非常适合NLP的特殊需求。在这里,我们简单介绍几种编程语言,演示一个简单的任务:读取文本并打印出以“ing”结尾的单词。我们先从Python版本开始,我们认为即使是非Python程序员也能轻松理解:
import sys
for line in sys.stdin:
for word in line.split():
if word.endswith('ing'):
print word
[...]
C语言是一种高效的低级语言,广泛用于操作系统和网络软件:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
int i = 0;
int c = 1;
char buffer[1024];
while (c != EOF) {
c = fgetc(stdin);
if ( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ) {
buffer[i++] = (char) c;
continue;
} else {
if (i > 2 && (strncmp(buffer+i-3, "ing", 3) == 0 || strncmp(buffer+i-3, "ING", 3) == 0 ) ) {
buffer[i] = 0;
puts(buffer);
}
i = 0;
}
}
return 0;
}
补充说明:我没有提供C++/Boost中可比较的代码,所以我添加了一个代码示例,虽然不完全相同,但功能类似,来自Boost文档。请注意,这不是最简洁的版本。
// char_sep_example_1.cpp
#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>
int main()
{
std::string str = ";;Hello|world||-foo--bar;yow;baz|";
typedef boost::tokenizer<boost::char_separator<char> >
tokenizer;
boost::char_separator<char> sep("-;|");
tokenizer tokens(str, sep);
for (tokenizer::iterator tok_iter = tokens.begin();
tok_iter != tokens.end(); ++tok_iter)
std::cout << "<" << *tok_iter << "> ";
std::cout << "\n";
return EXIT_SUCCESS;
}
用Python写代码,先测试一下性能,如果有些地方需要加速,就用C++来写。Python和C++有很多相似之处,所以用C++的熟悉感很快就不重要了。
我说这些是因为我主要是用C++开发的,最近才开始认真学习Python。我两个都喜欢,但我发现用Python写代码的速度比用C++快多了。真的,dict
在使用上比std::map
要好用得多。
顺便说一下,这里有一些关于如何从Python调用C代码的信息:点击查看。