Я использую 1,6-миллиметровый корпус твитов для обучения наивного двигателя байесовских настроений.
У меня есть два словаря n-грамм (Dictionary<string,int>
, где string
- это мой n-грамм, а int
- это число вхождений n-грамм в моем корпусе). Первый список извлекается из положительных твитов, второй список извлекается из отрицательных твитов. В статье на эту тему авторы отбрасывают общие n-граммы (то есть n-граммы, которые не сильно указывают на какие-либо чувства и не указывают на объективность предложения. Такие n-граммы появляются равномерно во всех наборах данных). Концептуально я понимаю это довольно хорошо, но формула, которую они предоставляют, основана на математике, а не на коде, и я не могу расшифровать то, что я должен делать.
Последние несколько часов я потратил на поиски в Интернете того, как это сделать. Я нашел примеры вычисления энтропии для поисковых систем, которые обычно вычисляют энтропию строки, и наиболее распространенным блоком кода является ShannonsEntropy.
Я также относительно новичок в этом пространстве, поэтому я уверен, что мое невежество играет определенную роль в этом, но я надеюсь, что кто-то на SO может помочь подтолкнуть меня в правильном направлении. Подведем итог:
Учитывая два словаря, PosDictionary
& NegDictionary
, как рассчитать энтропию идентичных n-грамм?
Psuedo-код в порядке, и я думаю, он выглядит примерно так:
foreach(string myNGram in PosDictionary) {
if(NegDictionary.ContainsKey(myNGram) {
double result = CalculateEntropyOfNGram(myNGram);
if(result > someThetaSuchAs0.80) {
PosDictionary.Remove(myNGram);
NegDictionary.Remove(myNGram);
}
}
}
Я думаю это процесс, который мне нужно предпринять. Чего я не знаю, так это то, как выглядит функция CalculateEntropyOfNGram
...
(Edit)
Вот ссылка на PDF-файл, используемый для описания процесса энтропии / значимости (раздел 5.3)