Вместо этого вы можете загрузить предварительно обученные вложения с помощью gensim. По крайней мере, для меня это было намного быстрее. Сначала вам нужно установить gensim с помощью pip, а затем вы можете загрузить модель со следующей строкой кода:
from gensim.models import FastText
model = FastText.load_fasttext_format('cc.en.300.bin')
(я не уверен, нужен ли вам для этого файл .bin, может быть, .vec файл также работает.)
Чтобы получить вложение слова с этой моделью, просто используйте model[word]
.
Выполнение функционального программирования в C# технически возможно (хорошо, любой язык, который имеет указатели функции или делегирует эквивалентный, может быть "функциональным") - но C# становится очень очень болезненным, при попытке сделать много.
Первое, что пришло на ум, без определенного порядка:
Редактирование: Еще один:
Композиция функций
C# должен испустить tail.call также. Не нужный, JIT добавит последние вызовы сам как соответствующие.
Объекты в [1 134] полужирный были обращены, так как этот ответ был записан.
Поддержка неизменности, прежде всего.
должно быть легко создать неизменный тип и проверить, что это неизменно. Это должно быть легко к использование неизменный тип - поддержка как объект и инициализаторы набора, но для неизменного случая.
После этого: лучшие возможности вывода типа, кортежи, сопоставление с образцом и библиотеки поддержки (снова, неизменные списки и т.д.).
РЕДАКТИРОВАНИЕ: Я должен сказать, что я не функциональный программист, но я - программист C#, пытающийся узнавать больше функциональные пути. Я в настоящее время выручаю (скромно) с книгой функционального программирования, таким образом, я изучаю много материала там.
Однако Вы будете, надо надеяться, радоваться с LINQ. Это действительно делает жизнь очень легче для работы с последовательностями данных.
На Ваш вопрос, как Lisper, что я пропускаю при программировании в Java (извините, я не использую C#):
адреса C# (2) и (3) с var
и =>
, соответственно, насколько я понимаю. Таким образом, мое основное зависание является кюри и точками с запятой, наряду с подробными, запутывающими универсальными описаниями типа.
На Ваш заголовок, как функциональный программист (Haskell), я пропускаю то, что сказали все те другие парни: неизменность, полный вывод типа, кортежи, сопоставление с образцом, более легкие дженерики, потому что никакое разделение на подклассы, библиотеки со строгим контролем типов.
кроме того, как программист Haskell, мне все еще не нравятся кюри и точки с запятой. :)
Если Вы спросите Lisper в противоположность семейству ML функциональный программист, то Вы ничего не услышите о кортежах или выводе. Они скажут одну вещь, самодовольно: МАКРОСЫ.
Я, и я делаю. Таким образом, я использую Lisp дома и C# на работе, и я действительно пропускаю Lisp когда в C#. Вопрос немного забавен, потому что я больше не считаю (Общий) Lisp "функциональным", чем C# или Ruby или любой другой язык мультипарадигмы.
В целом, функциональные возможности C# становятся довольно достойными, до такой степени, когда они, вероятно, Достаточно хороши, если немного неловкий. (Поддержка языка Common LISP уверенного функционального программирования не прекрасна, также!), Но язык Common LISP является языком мультипарадигмы; C# не делает (и никогда не может) соответствовать Lisp на синтаксической абстракции, генерации кода, гибкости отправки метода, и так далее.
при поиске оправдания постараться не изучать Lisp, потому что Вы думаете, C# так же мощен, извините. :-)
В дополнение к ответу Jon
Eric на том, почему C# не имеет глубокого вывода: http://blogs.msdn.com/ericlippert/archive/2009/01/26/why-no-var-on-fields.aspx
http://blogs.msdn.com/jaredpar/archive/2008/11/10/comparing-continuations-in-f-and-c.aspx
Для расширения несколько на точке Jon действительное значение для меня на языках функционального программирования не то, что они имеют, а что они пропускают.
большинство "больших" языков в эти дни имеет (или может быть обманут в наличие), основные примитивы функционального программирования как рекурсия, функции высшего порядка, и т.д. Поэтому, если Вы действительно хотите, можно записать в стиле функционального программирования на большинстве языков (черт, если у Вас есть оптимизация последнего вызова в Вашем компиляторе C, можно в значительной степени написать код функционального стиля в C).
, С другой стороны, то, что также имеют основные языки, является богатством вещей, которые Вы не имеете на чистом языке функционального программирования, и те вещи могут действительно "повредить" функциональную модель и лишить возможности рассуждать о Вашей программе функционального стиля таким же образом, как Вы были бы о чисто-функциональном языке. Изменяемые локальные и глобальные переменные, все paraphenalia вокруг изменяемого параллелизма состояния (традиционное многопоточное программирование), даже повторение, если не справлено, все заставляют Ваш функциональный стиль кодировать нефункциональный (как это было).
Даже при том, что Вы смогли ограничивать себя от неправильного использования функций на Вашем основном языке программирования, довольно маловероятно, что все, кто касается кода со временем, могли бы ограничить себя, таким образом, Вы не можете сделать предположения о функциональности Вашей кодовой базы без действительно полных обзоров кода. Некоторые "нефункциональные" проблемы являются довольно тонкими также так люди, которые хотят написать функциональный код, может ошибиться.
лучший способ удостовериться, Вы функциональны, состоит в том, чтобы выучить и использовать язык функционального программирования. Мне удалось изучить Erlang до такой степени, что я теперь пишу игровой сервер приблизительно через две недели моего очень ограниченного свободного времени, так дело не в этом большая часть проблемы - я полагаю, что языки функционального программирования, после того как Вы переносите голову вокруг фундаментальных понятий, легче выучить, потому что они - настолько больше спартанца.
Несколько возвращаемых значений. и "касательно" нечитабельно по сравнению с возвратом кортежей.
Лучшая поддержка неизменности, точно так же, как Jon сказал. Прямо сейчас неизменность на классах возможна из-за человеческой дисциплины.
, Но большей частью недостающей функции является твердая платформа набора, разработанная на основе неизменности.
В моем текущем проекте я ожидал, что неизменность будет большой победой, и это было, но платформа набора является ужасным соответствием.
, Например, скажите, что Вы хотите добавить, что сотрудник к компании, как
public Company AddEmployee(Employee employee)
{
var newEmployeeList = new List(EmployeeList);
newEmployeeList.Add(employee);
return new Company(newEmployeeList.AsReadOnly(), ....)
}
просто не очень производителен или хорош реализовать.
Однажды, я даже рассмотрел создание моих собственных наборов, запускающихся с простого неизменного класса Недостатков. :)
, С другой стороны, Linq, разработанный очень хороший для нас. Мне действительно нравятся методы, которые это представляет. Я нашел специальный синтаксис Linq не в моем вкусе.
РЕДАКТИРОВАНИЕ: у меня есть слишком низкий разряд для комментария, таким образом, я отвечу на комментарий Jon здесь. Jon, я решил, что это была плохая идея из-за пригодности для обслуживания. У людей, которые поддержат этот проект за следующее десятилетие, вероятно, нет большого количества воздействия Lisp/функционального программирования. Это напоминает мне о другой вещи. Интересно, сколько месяцев обслуживания потребуется, прежде чем мои неизменные объекты становятся изменяемыми. (Правовая оговорка, при этом бизнес IT является чем-то вроде эры золотой лихорадки время от времени, я крайне знаю, что многие разработчик даже не получают, каковы функции как неизменный и закрытия.)
Небольшое творчество в сочетании с LINQ (в основном является функциональным языком, встроенным в C #, как становится более очевидным при просмотре DR. Erik Meijers Отличный видео серии на Haskell ) позволит вам сделать ваш код больше функционал.
Вот пример без использования LINQ:
HASKELL:
minThree :: Int -> Int -> Int -> Int
minThree x y z
| x <= y && x <=z = x
| y <=z = y
| otherwise = z
C #:
int MinThree(int x, int y, int z)
{
return
x <= y && x <= z ? x
: y <= z ? y
: z;
}
Просто не позволяйте очистку кода RESHARPER запускаемся по вашему коду, как это будет выглядеть так:
int MinThree(int x, int y, int z)
{
return
x <= y && x <= z
? x
: y <= z
? y
: z;
}
: (