NLP项目,选择Python还是C++

3 投票
5 回答
4462 浏览
提问于 2025-04-15 19:46

我们正在做一个阿拉伯语自然语言处理的项目,现在在考虑用Python还是C++(还有Boost库)来写代码。我们在想这些点:

  • Python

    • 比C++慢(不过现在有一些工作在进行中,目的是让Python变得更快)
    • 对UTF8的支持更好
    • 写测试和尝试不同算法的速度更快
  • C++

    • 比Python快
    • 代码比较熟悉,几乎每个程序员都知道C或类似C的代码

项目完成后,把它移植到其他编程语言应该不会太难。

你觉得哪个更好,更适合这个项目呢?

5 个回答

3

这段话基本上是对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实现的一半。”

9

虽然这个话题有点主观,也可能引发争论,但有证据表明,你可以用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;
    }
8

用Python写代码,先测试一下性能,如果有些地方需要加速,就用C++来写。Python和C++有很多相似之处,所以用C++的熟悉感很快就不重要了。

我说这些是因为我主要是用C++开发的,最近才开始认真学习Python。我两个都喜欢,但我发现用Python写代码的速度比用C++快多了。真的,dict在使用上比std::map要好用得多。

顺便说一下,这里有一些关于如何从Python调用C代码的信息:点击查看

撰写回答