НЛП проект, Python или C ++ - PullRequest
3 голосов
/ 26 февраля 2010

Мы работаем над проектом обработки арабского естественного языка, мы ограничили выбор написания кода на Python или C ++ (и библиотеки Boost). Мы думаем об этих моментах:

  • Python

    • Медленнее, чем C ++ (продолжается работа по ускорению Python)
    • Лучшая поддержка UTF8
    • Ускоряет написание тестов и пробует разные алгоритмы
  • C ++

    • Быстрее, чем Python
    • Знакомый код, каждый программист знает C или C-подобный код

После завершения проекта не составит труда перенести проект на другие языки программирования.

Как вы думаете, что лучше и подходит для проекта?

Ответы [ 5 ]

9 голосов
/ 26 февраля 2010

Хотя это субъективно и аргументировано, есть свидетельства того, что вы можете написать успешный проект НЛП на python, как NLTK . Они также имеют сравнение функциональности НЛП на разных языках :


(Цитата из сравнения)

Многие языки программирования были использованы для НЛП. Как объясняется в предисловии, мы выбрали Python, потому что считаем, что он хорошо соответствует особым требованиям НЛП. Здесь мы представляем краткий обзор нескольких языков программирования для простой задачи чтения текста и печати слов, оканчивающихся на 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;
}

Edit: я не включил сопоставимый код в 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 голосов
/ 26 февраля 2010

Напишите это на Python, профилируйте его, и если вам нужно ускорить его части, напишите их на C ++.Python и C ++ достаточно похожи, так что «знакомое» преимущество в C ++ будет неактуальным, довольно быстрым.

Я говорю это как тот, кто разработал в основном на C ++ и недавно серьезно относится к Python.Мне они оба нравятся, но я могу заставить работать код Python намного быстрее, чем C ++.Серьезно, dict превосходит std::map в удобстве использования.

PS Вот некоторая информация о том, как вызывать C-код из Python.

3 голосов
/ 27 февраля 2010

Это более или менее ответ / дополнение к ответу Отто Альмендингера. Если вы честно хотели реализовать что-то (примерно) похожее на его пример Python в C ++, я думаю, что-то вроде этого было бы ближе:

#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».

2 голосов
/ 26 февраля 2010

Знакомый код, каждый программист знает C или C-подобный код

Многие разработчики знакомы с C или C-подобным кодом, это не делает их совместимыми с C ++. Неопытные разработчики C ++ могут принести много вреда такому сложному проекту, и вам придется проявить особую осторожность.

Я не могу говорить за python, но слышал, что он более дружественный для новичков.

Я бы сказал, еще раз, вы должны выбрать язык, который вы (как команда) знаете лучше всего.

0 голосов
/ 15 октября 2011

IMO идет на C / C ++ просто из-за «знакомого» фактора. Хотя в C / C ++ будет больше LOC, вы сэкономите время на понимание и тестирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...