This uses a preliminary transcript of the September 16 debate, with some manual editing to make it easier to process the edited text is included in the attached notebook, assigned to the variable textRaw. Feel free to try out the simple public app, or do some additional experimentation on the text. It'll be interesting to start watching trends over time, as the campaign season progresses and more debates occur.
Manipulate[
BarChart[ReplaceAll[<|# -> allCandidateCounts[#][ToLowerCase[word]] & /@
Keys[allCandidateCounts]|>, _Missing -> 0], BarOrigin -> Left,
ChartLabels -> Automatic,
PlotLabel -> "Word frequency in the Sept. 16, 2015 Republican Debate"], {word,
"freedom", InputField[#, String] &}]
CloudDeploy[%, Permissions -> "Public"]
===> CloudObject"[https://www.wolframcloud.com/objects/d1b62bc5-f686-42b3-bab9-bb70436d7e02"]

Basic counts
debateBySpeaker =
StringJoin /@ GroupBy[StringSplit[#, ": ", 2] & /@
StringTrim /@ StringSplit[StringDelete[
StringReplace[StringReplace[StringDelete[textRaw,
"\n" | "(APPLAUSE)" | "(LAUGHTER)" | "(CROSSTALK)" |
"(COMMERCIAL BREAK)" | ("UNKNOWN") | "know" | "going" |
"think" | "people" | "say" | "said" | "country" |
"want" | "need"], "..." -> " "],
name : RegularExpression["[A-Z ]+:"] :> "\n" <> name],
RegularExpression["\[[a-z ]+\]"]], "\n"], First][[All, All, 2]];
candidates = {"TRUMP", "BUSH", "WALKER", "RUBIO", "CHRISTIE",
"CARSON", "PAUL", "CRUZ", "KASICH", "FIORINA"};
Multicolumn[Labeled[Framed@
WordCloud[DeleteStopwords@debateBySpeaker[#], IgnoreCase -> True,
ImageSize -> 300], Style[#, "Section"], Top] & /@ candidates, 3]

Only words with higher than overall mean frequency
allCandidateCounts = <|# ->
Sort[Counts[
DeleteStopwords[
TextWords[
ToLowerCase@
StringReplace[debateBySpeaker[#], "." -> " "]]]]] & /@
candidates|>;
meanCounts = Merge[Values[allCandidateCounts], N[Mean[#]] &];
candidateVsMean = <|# ->
With[{cand = allCandidateCounts[#]}, <|# -> {cand[#], meanCounts[#]} & /@
Keys[cand]|>] & /@ candidates|>;
highFrequencyPerCandidate =
Select[#, #[[1]] > #[[2]] &] & /@ candidateVsMean;
highFrequencyForCloud = <|# ->
highFrequencyPerCandidate[#][[All, 1]] & /@ candidates|>;
Multicolumn[
Labeled[Framed@WordCloud[highFrequencyForCloud[#], IgnoreCase -> True,
ImageSize -> 300], Style[#, "Section"], Top] & /@ candidates, 3]

Individual frequency divided by overall mean frequency:
candidateOverMean = <|# ->
With[{cand =
allCandidateCounts[#]}, <|# -> cand[#]/meanCounts[#] & /@
Keys[cand]|>] & /@ candidates|>;
Multicolumn[
Labeled[Framed@WordCloud[candidateOverMean[#], IgnoreCase -> True,
ImageSize -> 300], Style[#, "Section"], Top] & /@ candidates, 3]

Unique words: Only show words that none of the other participants used
uniqueKeys = <|# ->
FoldList[Complement, Keys[allCandidateCounts[#]],
Keys[allCandidateCounts[#]] & /@
Complement[Keys[allCandidateCounts], {#}]][[-1]] & /@
Keys[allCandidateCounts]|>;
Multicolumn[
Labeled[Framed@WordCloud[KeyTake[allCandidateCounts[#], uniqueKeys[#]],
IgnoreCase -> True, ImageSize -> 300], Style[#, "Section"], Top] & /@ candidates, 3]

Reply to this discussion
in reply to