2010-02-26 53 views
3

我們正在開發阿拉伯語自然語言處理項目,我們限制了我們的選擇,要麼在Python或C++(和Boost庫)中編寫代碼。我們正在考慮這幾點:NLP項目,Python或C++

  • 的Python

    • 比C++慢(目前正在進行的工作,以使Python更快)
    • 更好地支持UTF8
    • 更快的書面測試和嘗試不同的算法
  • C++

    • 更快比Python
    • 熟悉的代碼,每個程序員都知道C或C類代碼

項目完成後,應該不是很難港口項目到另一個編程語言。

您認爲哪種方法更適合該項目?

+5

你應該考慮你點了Python自然語言工具包http://www.nltk.org/ – 2010-02-26 19:05:22

+0

升壓缺乏統一的庫,因此,你應該考慮,而或Glibmm UTF-8字符串和字符轉換的其他實現,你應該選擇用C++來完成。儘管如此,您仍然可以找到Boost的其他工具(例如字符串算法)。 – Tronic 2010-02-26 19:57:42

+0

@Dana理智:是的它是一個很好的點,但它太面向英語,也許我們可以添加一些功能集成到它,我們完成這個項目:) – 2010-02-26 21:31:02

回答

8

用Python編寫,分析它,如果你需要加快部分速度,用C++編寫它們。 Python和C++非常相似,C++的「熟悉」優勢將非常快速。

我說這是一個主要用C++開發的人,並且最近對Python很認真。我喜歡它們,但是我可以使Python代碼比C++工作得更快。真的,dict擊敗std::map的可用性。

P.S.這裏有一些information on how to call C code from Python.

+1

用於算法開發和原型設計的python獲勝;如果需要的話,將計算密集的部分移動到c/C++模塊中很容易。 – James 2010-02-26 19:03:47

+0

我已經這麼做了,C++有着驚人的執行時間,但是我們可能會忽略關於Python專業人員的這一點。 但你的想法真的很酷且務實。 – 2010-02-26 21:16:09

+1

@ Kahled:那是我們的經驗。當然,我可以在C++中快速地使用FFT(使用fftw或MKL),但我的代碼中大於95%不是'fft()',這是決策制定,初始化和管理。而且,這是大部分時間都會改變的代碼,而不是內部循環的東西。當我在Python中完成這一部分時,我對它的應用程序的速度慢得多,但在實際應用中速度並不慢,而且開發速度要快得多。 – 2010-02-26 22:30:24

2

熟悉的代碼,每個程序員都知道C或C類代碼

許多開發者熟悉C或C類代碼,它並沒有使他們的C++標準。 未經驗的C++開發人員可能會對這樣一個複雜的項目造成很大的傷害,因此您必須格外小心。

我不能說python,但我聽說它對初學者更友好。

我想再說一次,你應該選擇你(作爲一個團隊)最熟悉的語言。

+0

你的第一點非常有趣,但第二點對我們來說並不重要,因爲我們有兩種語言的很酷的程序員。 – 2010-02-26 21:34:21

9

雖然這是主觀的和論證性的,但有證據表明你可以用python編寫一個成功的NLP項目,如NLTK。他們也有一個comparison of NLP functionality in different languages


(從比較報價)

很多編程語言已經使用了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 documentation。請注意,這不是最乾淨的版本。

// 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; 
    } 
+0

+1以上內容直接適用於該問題並提供其他信息。 – 2010-02-26 19:08:33

+0

謝謝,這將是很好的知道誰-1ed我沒有評論雖然 – 2010-02-26 19:09:57

+1

這個問題是關於蟒蛇和C + + /助推器,這個答案是關於python和C.你可以在這裏寫很多清潔器等效於 – 2010-02-26 19:16:29

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實現的一半多。」

+0

糾正我,如果我錯了,但我不認爲這是'python代碼的'line.split()'部分... – drevicko 2013-07-16 03:47:25

+1

@drevicko:是的,它的確如此。當用'>>'提取字符串時,它一次讀取一個字。 – 2013-07-16 03:50:52

+0

我站好了!謝謝闡述(:我認爲它分裂在空白區域?爲了記錄:是否有區域感?(至少在更現代的圖書館中..) – drevicko 2013-07-16 06:10:28

0

IMO去C/C++的僅僅是因爲 '熟悉' 的因素。儘管LOC的C/C++版本將更多,但您可以節省時間進行理解和測試。