Предложения и слова часто обозначаются вручную. Существуют различные корпорации, которые занимаются тегами POS для слов в соответствии с контекстами предложений. PunktSentenceTokenizer
используется, когда ваши данные (предложения и слова) нуждаются в обучении для достижения единообразного понимания того, как слова должны быть помечены контекстуально. Возможно, ученый данных вручную аннотирует слова теги для целого ряда предложений, а затем говорит машине, чтобы узнать их (контролируемое обучение). Однако PunktSentenceTokenizer
использует алгоритмы ML, чтобы самостоятельно изучить эти теги (неконтролируемые). Вы просто выбираете, с какими данными он тренируется.
В зависимости от данных, с которыми вы работаете, результаты sent_tokenize
и, следовательно, word_tokenize
может отличаться от PunktSentenceTokenizer
. Выбор между токенизаторами остается до ученого данных, но стандарт всегда сравнивается с аннотированными тегами вручную (потому что они являются наиболее правильными тегами).
Ошибка означает, что значение CategoryList
равно нулю (и в результате метод DropDownListFor()
ожидает, что первый параметр имеет тип IEnumerable<SelectListItem>
).
Вы не генерируете вход для каждого свойства каждого SelectListItem
в CategoryList
(и не должен), поэтому никакие значения для SelectList
не отправляются в метод контроллера, и поэтому значение model.CategoryList
в методе POST равно null
, Если вы вернете представление, вы должны сначала переназначить значение CategoryList
, как и в методе GET.
public ActionResult Create(ProjectVM model)
{
if (!ModelState.IsValid)
{
model.CategoryList = new SelectList(db.Categories, "ID", "Name"); // add this
return View(model);
}
// Save and redirect
}
Чтобы объяснить внутреннюю работу (исходный код может быть см. здесь )
Каждая перегрузка DropDownList()
и DropDownListFor()
в конечном итоге вызывает следующий метод
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, ModelMetadata metadata,
string optionLabel, string name, IEnumerable<SelectListItem> selectList, bool allowMultiple,
IDictionary<string, object> htmlAttributes)
, который проверяет, есть ли selectList
(второй параметр из @Html.DropDownListFor()
) является null
// If we got a null selectList, try to use ViewData to get the list of items.
if (selectList == null)
{
selectList = htmlHelper.GetSelectData(name);
usedViewData = true;
}
, который, в свою очередь, вызывает
private static IEnumerable<SelectListItem> GetSelectData(this HtmlHelper htmlHelper, string name)
, который оценивает первый параметр @Html.DropDownListFor()
(в данном случае CategoryID
)
....
o = htmlHelper.ViewData.Eval(name);
....
IEnumerable<SelectListItem> selectList = o as IEnumerable<SelectListItem>;
if (selectList == null)
{
throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture,
MvcResources.HtmlHelper_WrongSelectDataType,
name, o.GetType().FullName, "IEnumerable<SelectListItem>"));
}
Поскольку свойство CategoryID
является typeof int
, оно не может быть передано в IEnumerable<SelectListItem>
, и генерируется исключение (которое определено в файле MvcResources.resx
как)
<data name="HtmlHelper_WrongSelectDataType" xml:space="preserve">
<value>The ViewData item that has the key '{0}' is of type '{1}' but must be of type '{2}'.</value>
</data>