in python/ts-to-word.py [0:0]
def write_comprehend_sentiment(document, speech_segments, temp_files):
"""
Writes out tables for per-period, per-speaker sentiment from the analytics mode, as well as
the overall sentiment for a speaker
:param document: Docx document to add the sentiment graph to
:param speech_segments: Process transcript text holding turn-by-turn sentiment
:param temp_files: List of temp files to be deleted later
:return:
"""
# Initialise our base structures
speaker0labels = ['ch_0', 'spk_0']
speaker1labels = ['ch_1', 'spk_1']
speaker0timestamps = []
speaker0data = []
speaker1timestamps = []
speaker1data = []
# Start with some spacing and a new sub-header
document.add_paragraph()
write_custom_text_header(document, "Amazon Comprehend Sentiment")
# Now step through and process each speech segment's sentiment
for segment in speech_segments:
if segment.segmentIsPositive or segment.segmentIsNegative:
# Only interested in actual sentiment entries
score = segment.segmentSentimentScore
timestamp = segment.segmentStartTime
# Positive re-calculation
if segment.segmentIsPositive:
score = 2 * ((1 - (1 - score) / (1 - MIN_SENTIMENT_POSITIVE)) * 0.5)
# Negative re-calculation
else:
score = 2 * ((1 - score) / (1 - MIN_SENTIMENT_NEGATIVE) * 0.5 - 0.5)
if segment.segmentSpeaker in speaker1labels:
speaker1data.append(score)
speaker1timestamps.append(timestamp)
elif segment.segmentSpeaker in speaker0labels:
speaker0data.append(score)
speaker0timestamps.append(timestamp)
# Spline fit needs at least 4 points for k=3, but 5 works better
speaker1k = 3
speaker0k = 3
if len(speaker1data) < 5:
speaker1k = 1
if len(speaker0data) < 5:
speaker0k = 1
# Create Speaker-0 graph
plt.figure(figsize=(8, 5))
speaker0xnew = np.linspace(speaker0timestamps[0], speaker0timestamps[-1],
int((speaker0timestamps[-1] - speaker0timestamps[0]) + 1.0))
speaker0spl = make_interp_spline(speaker0timestamps, speaker0data, k=speaker0k)
speaker0powerSmooth = speaker0spl(speaker0xnew)
plt.plot(speaker0timestamps, speaker0data, "ro")
plt.plot(speaker0xnew, speaker0powerSmooth, "r", label="Speaker 1")
# Create Speaker-1 graph
speaker1xnew = np.linspace(speaker1timestamps[0], speaker1timestamps[-1],
int((speaker1timestamps[-1] - speaker1timestamps[0]) + 1.0))
speaker1spl = make_interp_spline(speaker1timestamps, speaker1data, k=speaker1k)
speaker1powerSmooth = speaker1spl(speaker1xnew)
plt.plot(speaker1timestamps, speaker1data, "bo")
plt.plot(speaker1xnew, speaker1powerSmooth, "b", label="Speaker 2")
# Draw it out
plt.title("Call Sentiment - Pos/Neg Only")
plt.xlabel("Time (seconds)")
plt.axis([0, max(speaker0timestamps[-1], speaker1timestamps[-1]), -1.5, 1.5])
plt.legend()
plt.axhline(y=0, color='k')
plt.axvline(x=0, color='k')
plt.grid(True)
plt.xticks(np.arange(0, max(speaker0timestamps[-1], speaker1timestamps[-1]), 60))
plt.yticks(np.arange(-1, 1.01, 0.25))
# Write out the chart
chart_file_name = "./" + "sentiment.png"
plt.savefig(chart_file_name)
temp_files.append(chart_file_name)
plt.clf()
document.add_picture(chart_file_name, width=Cm(14.64))
document.paragraphs[-1].alignment = WD_ALIGN_PARAGRAPH.LEFT