Revision: 18290
http://sourceforge.net/p/gate/code/18290
Author: ian_roberts
Date: 2014-09-04 12:14:12 +0000 (Thu, 04 Sep 2014)
Log Message:
-----------
Added the option for a free-text "comment" field on each unit, allowing
annotators to feed back arbitrary comments with each judgment (e.g. why they
chose not to annotate anything, or the classification they think is correct if
they've had to choose "none of the above").
Modified Paths:
--------------
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/EntityClassificationResultsImporter.java
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/NewClassificationJobAction.java
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/EntityAnnotationResultsImporter.java
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/NewAnnotationJobAction.java
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/rest/CrowdFlowerClient.java
Modified:
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/EntityClassificationResultsImporter.java
===================================================================
---
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/EntityClassificationResultsImporter.java
2014-09-04 01:19:45 UTC (rev 18289)
+++
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/EntityClassificationResultsImporter.java
2014-09-04 12:14:12 UTC (rev 18290)
@@ -159,9 +159,8 @@
if(judgments != null) {
for(JsonElement judgmentElt : judgments) {
JsonObject judgment = judgmentElt.getAsJsonObject();
- String answer =
- judgment.getAsJsonObject("data").get("answer")
- .getAsString();
+ JsonObject data = judgment.getAsJsonObject("data");
+ String answer = data.get("answer").getAsString();
long judgmentId = judgment.get("id").getAsLong();
double trust = judgment.get("trust").getAsDouble();
long workerId = judgment.get("worker_id").getAsLong();
@@ -172,6 +171,14 @@
judgmentAnn.getFeatures().put("trust", Double.valueOf(trust));
judgmentAnn.getFeatures()
.put("worker_id", Long.valueOf(workerId));
+ if(data.get("comment") != null) {
+ if(data.get("comment").isJsonPrimitive()) {
+ String comment = data.get("comment").getAsString().trim();
+ if(comment.length() > 0) {
+ judgmentAnn.getFeatures().put("comment", comment);
+ }
+ }
+ }
}
} else {
log.warn("Unit " + unitId + " has no judgments");
Modified:
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/NewClassificationJobAction.java
===================================================================
---
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/NewClassificationJobAction.java
2014-09-04 01:19:45 UTC (rev 18289)
+++
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/NewClassificationJobAction.java
2014-09-04 12:14:12 UTC (rev 18290)
@@ -28,13 +28,17 @@
import javax.swing.AbstractAction;
import javax.swing.AbstractButton;
+import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
+import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;
import com.jeta.forms.components.panel.FormPanel;
@@ -68,7 +72,9 @@
panel.setPreferredSize(new Dimension(500, 400));
- // attach listeners etc.
+ initListeners(panel);
+
+ // put the panel in a JOptionPane
final JTable commonOptionsTable = panel.getTable("commonOptions");
final DefaultTableModel optionsTableModel = new DefaultTableModel(
new String[][] {
@@ -173,7 +179,10 @@
panel.getTextField("title").getText().trim(),
panel.getTextComponent("instructions").getText(),
panel.getTextField("caption").getText().trim(),
- commonOptions));
+ commonOptions,
+
panel.getCheckBox("commentCheckbox").isSelected()
+ ?
panel.getTextField("commentCaption").getText().trim()
+ : null));
// if the creation was successful we can dispose the
dialog
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -226,8 +235,28 @@
statusLabel.setText("<html><p>A caption is required</p></html>");
statusLabel.setIcon(MainFrame.getIcon("Invalid"));
valid = false;
+ } else if(panel.getCheckBox("commentCheckbox").isSelected()
+ &&
"".equals(panel.getTextField("commentCaption").getText().trim())) {
+ statusLabel.setText("<html><p>A caption for the \"comment\" field is
required</p></html>");
+ statusLabel.setIcon(MainFrame.getIcon("Invalid"));
+ valid = false;
}
return valid;
}
+
+ protected void initListeners(FormPanel panel) {
+ final JLabel commentLabel = panel.getLabel("commentCaptionLabel");
+ final JTextField commentField = panel.getTextField("commentCaption");
+ final JCheckBox commentCheckbox = panel.getCheckBox("commentCheckbox");
+ commentCheckbox.addChangeListener(new ChangeListener() {
+
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ commentLabel.setEnabled(commentCheckbox.isSelected());
+ commentField.setEnabled(commentCheckbox.isSelected());
+ }
+ });
+ }
+
}
Modified:
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml
===================================================================
---
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml
2014-09-04 01:19:45 UTC (rev 18289)
+++
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml
2014-09-04 12:14:12 UTC (rev 18290)
@@ -24,8 +24,8 @@
</at>
<at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
</super>
- <at
name="id">/Users/ian/svn/gate-extras/crowd-flower-tools/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml</at>
- <at
name="rowspecs">TOP:30DLU:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE</at>
+ <at
name="id">/Users/ian/svn/gate/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml</at>
+ <at
name="rowspecs">TOP:30DLU:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE</at>
<at
name="colspecs">FILL:4DLU:NONE,LEFT:DEFAULT:NONE,FILL:4DLU:NONE,FILL:MIN(75DLU;DEFAULT):GROW(1.0),FILL:DEFAULT:NONE,FILL:4DLU:NONE</at>
<at name="components">
<object classname="java.util.LinkedList">
@@ -39,7 +39,7 @@
<at name="row">3</at>
<at name="colspan">1</at>
<at name="rowspan">1</at>
- <at name="halign">default</at>
+ <at name="halign">right</at>
<at name="valign">default</at>
<at name="insets" object="insets">0,0,0,0</at>
</object>
@@ -55,8 +55,8 @@
<object classname="com.jeta.forms.store.support.PropertyMap">
<at name="text">Job title</at>
<at name="height">16</at>
+ <at name="name"/>
<at name="width">49</at>
- <at name="name"></at>
<at name="fill">
<object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
<at name="name">fill</at>
@@ -114,7 +114,7 @@
<at name="properties">
<object classname="com.jeta.forms.store.support.PropertyMap">
<at name="height">28</at>
- <at name="width">679</at>
+ <at name="width">594</at>
<at name="name">title</at>
<at name="toolTipText">The title of the CrowdFlower job.</at>
<at name="border">
@@ -151,7 +151,7 @@
<at name="cellconstraints">
<object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
<at name="column">2</at>
- <at name="row">7</at>
+ <at name="row">11</at>
<at name="colspan">4</at>
<at name="rowspan">1</at>
<at name="halign">default</at>
@@ -170,8 +170,8 @@
<object classname="com.jeta.forms.store.support.PropertyMap">
<at name="text">Instructions</at>
<at name="height">16</at>
+ <at name="name"/>
<at name="width">772</at>
- <at name="name"></at>
<at name="fill">
<object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
<at name="name">fill</at>
@@ -211,7 +211,7 @@
<at name="cellconstraints">
<object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
<at name="column">2</at>
- <at name="row">9</at>
+ <at name="row">13</at>
<at name="colspan">4</at>
<at name="rowspan">1</at>
<at name="halign">default</at>
@@ -288,6 +288,7 @@
</at>
</object>
</at>
+ <at name="y">-38</at>
</object>
</at>
</object>
@@ -302,7 +303,7 @@
<at name="cellconstraints">
<object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
<at name="column">2</at>
- <at name="row">11</at>
+ <at name="row">15</at>
<at name="colspan">4</at>
<at name="rowspan">1</at>
<at name="halign">default</at>
@@ -362,7 +363,7 @@
<at name="cellconstraints">
<object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
<at name="column">2</at>
- <at name="row">13</at>
+ <at name="row">17</at>
<at name="colspan">3</at>
<at name="rowspan">9</at>
<at name="halign">default</at>
@@ -506,7 +507,7 @@
<at name="cellconstraints">
<object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
<at name="column">5</at>
- <at name="row">13</at>
+ <at name="row">17</at>
<at name="colspan">1</at>
<at name="rowspan">1</at>
<at name="halign">default</at>
@@ -561,7 +562,7 @@
<at name="cellconstraints">
<object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
<at name="column">5</at>
- <at name="row">15</at>
+ <at name="row">19</at>
<at name="colspan">1</at>
<at name="rowspan">1</at>
<at name="halign">default</at>
@@ -616,7 +617,7 @@
<at name="cellconstraints">
<object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
<at name="column">5</at>
- <at name="row">17</at>
+ <at name="row">21</at>
<at name="colspan">1</at>
<at name="rowspan">1</at>
<at name="halign">default</at>
@@ -671,7 +672,7 @@
<at name="cellconstraints">
<object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
<at name="column">5</at>
- <at name="row">19</at>
+ <at name="row">23</at>
<at name="colspan">1</at>
<at name="rowspan">1</at>
<at name="halign">default</at>
@@ -729,7 +730,7 @@
<at name="row">5</at>
<at name="colspan">1</at>
<at name="rowspan">1</at>
- <at name="halign">default</at>
+ <at name="halign">right</at>
<at name="valign">default</at>
<at name="insets" object="insets">0,0,0,0</at>
</object>
@@ -745,8 +746,8 @@
<object classname="com.jeta.forms.store.support.PropertyMap">
<at name="text">Task caption</at>
<at name="height">16</at>
+ <at name="name"/>
<at name="width">81</at>
- <at name="name"></at>
<at name="fill">
<object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
<at name="name">fill</at>
@@ -803,10 +804,12 @@
<at name="classname">javax.swing.JTextField</at>
<at name="properties">
<object classname="com.jeta.forms.store.support.PropertyMap">
+ <at name="selectionEnd">51</at>
<at name="text">Which of the following describes
"{{entity}}" best?</at>
<at name="height">28</at>
- <at name="width">679</at>
+ <at name="width">594</at>
<at name="name">caption</at>
+ <at name="selectionStart">51</at>
<at name="toolTipText"><html><p>The question that will
be presented to the user.</p><p>The caption may contain a
placeholder {{entity}}, which will be replaced by the text of the entity that
is the target of the current task.</p></html></at>
<at name="border">
<object
classname="com.jeta.forms.store.properties.CompoundBorderProperty">
@@ -835,6 +838,238 @@
</object>
</at>
</item>
+ <item >
+ <at name="value">
+ <object classname="com.jeta.forms.store.memento.BeanMemento">
+ <super classname="com.jeta.forms.store.memento.ComponentMemento">
+ <at name="cellconstraints">
+ <object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+ <at name="column">2</at>
+ <at name="row">7</at>
+ <at name="colspan">1</at>
+ <at name="rowspan">1</at>
+ <at name="halign">right</at>
+ <at name="valign">default</at>
+ <at name="insets" object="insets">0,0,0,0</at>
+ </object>
+ </at>
+ <at
name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+ </super>
+ <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+ <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+ <at name="beanproperties">
+ <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+ <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+ <at name="properties">
+ <object classname="com.jeta.forms.store.support.PropertyMap">
+ <at name="text">Allow free-text comment</at>
+ <at name="height">16</at>
+ <at name="width">159</at>
+ <at name="name">commentCheckboxLabel</at>
+ <at name="fill">
+ <object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
+ <at name="name">fill</at>
+ </object>
+ </at>
+ <at name="border">
+ <object
classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ <at name="borders">
+ <object classname="java.util.LinkedList">
+ <item >
+ <at name="value">
+ <object
classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ </object>
+ </at>
+ </item>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </item>
+ <item >
+ <at name="value">
+ <object classname="com.jeta.forms.store.memento.BeanMemento">
+ <super classname="com.jeta.forms.store.memento.ComponentMemento">
+ <at name="cellconstraints">
+ <object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+ <at name="column">2</at>
+ <at name="row">9</at>
+ <at name="colspan">1</at>
+ <at name="rowspan">1</at>
+ <at name="halign">right</at>
+ <at name="valign">default</at>
+ <at name="insets" object="insets">0,0,0,0</at>
+ </object>
+ </at>
+ <at
name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+ </super>
+ <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+ <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+ <at name="beanproperties">
+ <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+ <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+ <at name="properties">
+ <object classname="com.jeta.forms.store.support.PropertyMap">
+ <at name="text">Caption for comment field</at>
+ <at name="height">16</at>
+ <at name="width">166</at>
+ <at name="name">commentCaptionLabel</at>
+ <at name="fill">
+ <object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
+ <at name="name">fill</at>
+ </object>
+ </at>
+ <at name="border">
+ <object
classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ <at name="borders">
+ <object classname="java.util.LinkedList">
+ <item >
+ <at name="value">
+ <object
classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ </object>
+ </at>
+ </item>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </item>
+ <item >
+ <at name="value">
+ <object classname="com.jeta.forms.store.memento.BeanMemento">
+ <super classname="com.jeta.forms.store.memento.ComponentMemento">
+ <at name="cellconstraints">
+ <object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+ <at name="column">4</at>
+ <at name="row">7</at>
+ <at name="colspan">1</at>
+ <at name="rowspan">1</at>
+ <at name="halign">default</at>
+ <at name="valign">default</at>
+ <at name="insets" object="insets">0,0,0,0</at>
+ </object>
+ </at>
+ <at
name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+ </super>
+ <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+ <at name="beanclass">javax.swing.JCheckBox</at>
+ <at name="beanproperties">
+ <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+ <at name="classname">javax.swing.JCheckBox</at>
+ <at name="properties">
+ <object classname="com.jeta.forms.store.support.PropertyMap">
+ <at name="selected">true</at>
+ <at name="height">20</at>
+ <at name="width">515</at>
+ <at name="name">commentCheckbox</at>
+ <at name="border">
+ <object
classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ <at name="borders">
+ <object classname="java.util.LinkedList">
+ <item >
+ <at name="value">
+ <object
classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ </object>
+ </at>
+ </item>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </item>
+ <item >
+ <at name="value">
+ <object classname="com.jeta.forms.store.memento.BeanMemento">
+ <super classname="com.jeta.forms.store.memento.ComponentMemento">
+ <at name="cellconstraints">
+ <object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+ <at name="column">4</at>
+ <at name="row">9</at>
+ <at name="colspan">2</at>
+ <at name="rowspan">1</at>
+ <at name="halign">default</at>
+ <at name="valign">default</at>
+ <at name="insets" object="insets">0,0,0,0</at>
+ </object>
+ </at>
+ <at
name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+ </super>
+ <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+ <at name="beanclass">javax.swing.JTextField</at>
+ <at name="beanproperties">
+ <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+ <at name="classname">javax.swing.JTextField</at>
+ <at name="properties">
+ <object classname="com.jeta.forms.store.support.PropertyMap">
+ <at name="selectionEnd">7</at>
+ <at name="text">Comment</at>
+ <at name="height">28</at>
+ <at name="width">594</at>
+ <at name="name">commentCaption</at>
+ <at name="selectionStart">7</at>
+ <at name="border">
+ <object
classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ <at name="borders">
+ <object classname="java.util.LinkedList">
+ <item >
+ <at name="value">
+ <object
classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ </object>
+ </at>
+ </item>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </item>
</object>
</at>
<at name="properties">
@@ -892,7 +1127,7 @@
<at name="cellpainters">
<object classname="com.jeta.forms.store.support.Matrix">
<at name="rows">
- <object classname="[Ljava.lang.Object;" size="22">
+ <object classname="[Ljava.lang.Object;" size="26">
<at name="item" index="0">
<object classname="[Ljava.lang.Object;" size="6"/>
</at>
@@ -959,6 +1194,18 @@
<at name="item" index="21">
<object classname="[Ljava.lang.Object;" size="6"/>
</at>
+ <at name="item" index="22">
+ <object classname="[Ljava.lang.Object;" size="6"/>
+ </at>
+ <at name="item" index="23">
+ <object classname="[Ljava.lang.Object;" size="6"/>
+ </at>
+ <at name="item" index="24">
+ <object classname="[Ljava.lang.Object;" size="6"/>
+ </at>
+ <at name="item" index="25">
+ <object classname="[Ljava.lang.Object;" size="6"/>
+ </at>
</object>
</at>
</object>
Modified:
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/EntityAnnotationResultsImporter.java
===================================================================
---
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/EntityAnnotationResultsImporter.java
2014-09-04 01:19:45 UTC (rev 18289)
+++
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/EntityAnnotationResultsImporter.java
2014-09-04 12:14:12 UTC (rev 18290)
@@ -25,6 +25,7 @@
import gate.Annotation;
import gate.AnnotationSet;
+import gate.FeatureMap;
import gate.Resource;
import gate.Utils;
import gate.creole.AbstractLanguageAnalyser;
@@ -202,12 +203,20 @@
if(judgments != null) {
for(JsonElement judgmentElt : judgments) {
JsonObject judgment = judgmentElt.getAsJsonObject();
- JsonArray answer =
- judgment.getAsJsonObject("data").get("answer")
- .getAsJsonArray();
+ JsonObject data = judgment.getAsJsonObject("data");
+ JsonArray answer = data.get("answer").getAsJsonArray();
Long judgmentId = judgment.get("id").getAsLong();
Double trust = judgment.get("trust").getAsDouble();
Long workerId = judgment.get("worker_id").getAsLong();
+ String comment = null;
+ if(data.get("comment") != null) {
+ if(data.get("comment").isJsonPrimitive()) {
+ comment = data.get("comment").getAsString().trim();
+ if("".equals(comment)) {
+ comment = null;
+ }
+ }
+ }
if(answer.size() > 0) {
// judgment says there are some entities to annotate. Look for
// sequences of consecutive token indices and create one result
@@ -235,10 +244,14 @@
if(!found) {
// no existing annotation found, create one
try {
- resultAS.add(startOffset, endOffset,
resultAnnotationType, Utils.featureMap(
+ FeatureMap features = Utils.featureMap(
JUDGMENT_ID_FEATURE_NAME, judgmentId,
"trust", trust,
- "worker_id", workerId));
+ "worker_id", workerId);
+ if(comment != null) {
+ features.put("comment", comment);
+ }
+ resultAS.add(startOffset, endOffset,
resultAnnotationType, features);
} catch(InvalidOffsetException e) {
throw new ExecutionException("Invalid offset obtained
from existing annotation!", e);
}
Modified:
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/NewAnnotationJobAction.java
===================================================================
---
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/NewAnnotationJobAction.java
2014-09-04 01:19:45 UTC (rev 18289)
+++
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/NewAnnotationJobAction.java
2014-09-04 12:14:12 UTC (rev 18290)
@@ -25,11 +25,15 @@
import java.io.InputStream;
import javax.swing.AbstractAction;
+import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
+import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
import com.jeta.forms.components.panel.FormPanel;
@@ -62,7 +66,9 @@
panel.setPreferredSize(new Dimension(500, 400));
- // attach listeners etc.
+ initListeners(panel);
+
+ // wrap panel in a JOptionPane.
final JOptionPane optionPane = new JOptionPane(panel,
JOptionPane.PLAIN_MESSAGE,
JOptionPane.OK_CANCEL_OPTION);
final JDialog dialog = new JDialog(MainFrame.getInstance(), "New
annotation job", true);
@@ -103,7 +109,11 @@
panel.getTextComponent("instructions").getText(),
panel.getTextField("caption").getText().trim(),
panel.getTextField("noEntitiesCaption").getText().trim(),
-
panel.getTextField("noEntitiesError").getText().trim()));
+
panel.getTextField("noEntitiesError").getText().trim(),
+
panel.getCheckBox("commentCheckbox").isSelected()
+ ?
panel.getTextField("commentCaption").getText().trim()
+ : null));
+
// if the creation was successful we can dispose the
dialog
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -164,8 +174,27 @@
statusLabel.setText("<html><p>An error message for the \"no entities\"
checkbox is required</p></html>");
statusLabel.setIcon(MainFrame.getIcon("Invalid"));
valid = false;
+ } else if(panel.getCheckBox("commentCheckbox").isSelected()
+ &&
"".equals(panel.getTextField("commentCaption").getText().trim())) {
+ statusLabel.setText("<html><p>A caption for the \"comment\" field is
required</p></html>");
+ statusLabel.setIcon(MainFrame.getIcon("Invalid"));
+ valid = false;
}
return valid;
}
-
+
+ protected void initListeners(FormPanel panel) {
+ final JLabel commentLabel = panel.getLabel("commentCaptionLabel");
+ final JTextField commentField = panel.getTextField("commentCaption");
+ final JCheckBox commentCheckbox = panel.getCheckBox("commentCheckbox");
+ commentCheckbox.addChangeListener(new ChangeListener() {
+
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ commentLabel.setEnabled(commentCheckbox.isSelected());
+ commentField.setEnabled(commentCheckbox.isSelected());
+ }
+ });
+ }
+
}
Modified:
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml
===================================================================
---
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml
2014-09-04 01:19:45 UTC (rev 18289)
+++
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml
2014-09-04 12:14:12 UTC (rev 18290)
@@ -24,8 +24,8 @@
</at>
<at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
</super>
- <at
name="id">/Users/ian/svn/gate-extras/crowd-flower-tools/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml</at>
- <at
name="rowspecs">TOP:30DLU:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE</at>
+ <at
name="id">/Users/ian/svn/gate/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml</at>
+ <at
name="rowspecs">TOP:30DLU:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE</at>
<at
name="colspecs">FILL:4DLU:NONE,LEFT:DEFAULT:NONE,FILL:4DLU:NONE,FILL:MIN(75DLU;DEFAULT):GROW(1.0),FILL:4DLU:NONE</at>
<at name="components">
<object classname="java.util.LinkedList">
@@ -56,8 +56,8 @@
<at name="horizontalAlignment">11</at>
<at name="text">Job title</at>
<at name="height">16</at>
- <at name="name"/>
<at name="width">49</at>
+ <at name="name">titleLabel</at>
<at name="horizontalTextPosition">10</at>
<at name="fill">
<object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
@@ -153,7 +153,7 @@
<at name="cellconstraints">
<object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
<at name="column">2</at>
- <at name="row">11</at>
+ <at name="row">15</at>
<at name="colspan">3</at>
<at name="rowspan">1</at>
<at name="halign">default</at>
@@ -172,8 +172,8 @@
<object classname="com.jeta.forms.store.support.PropertyMap">
<at name="text">Instructions</at>
<at name="height">16</at>
- <at name="name"/>
<at name="width">772</at>
+ <at name="name">instructionsLabel</at>
<at name="fill">
<object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
<at name="name">fill</at>
@@ -213,7 +213,7 @@
<at name="cellconstraints">
<object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
<at name="column">2</at>
- <at name="row">13</at>
+ <at name="row">17</at>
<at name="colspan">3</at>
<at name="rowspan">1</at>
<at name="halign">default</at>
@@ -234,7 +234,7 @@
<at name="text"><p>For this task you need to indicate
whether each snippet of text contains any mentions of person names, and if so
which words these are. Click on words to highlight them, and your task is to
highlight all the words that form part of a person name.</p>
<p>If there are <i>no</i> person names within the snippet of
text, then do not highlight any words, instead tick the "there are no
person names in this sentence" checkbox to confirm that you have verified
this.</p></at>
<at name="scrollableTracksViewportWidth">true</at>
- <at name="height">313</at>
+ <at name="height">251</at>
<at name="width">753</at>
<at name="name">instructions</at>
<at name="selectionStart">468</at>
@@ -378,10 +378,11 @@
<at name="classname">com.jeta.forms.components.label.JETALabel</at>
<at name="properties">
<object classname="com.jeta.forms.store.support.PropertyMap">
+ <at name="horizontalAlignment">11</at>
<at name="text">Task caption</at>
<at name="height">16</at>
<at name="width">81</at>
- <at name="name"></at>
+ <at name="name">captionLabel</at>
<at name="horizontalTextPosition">10</at>
<at name="fill">
<object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
@@ -497,10 +498,11 @@
<at name="classname">com.jeta.forms.components.label.JETALabel</at>
<at name="properties">
<object classname="com.jeta.forms.store.support.PropertyMap">
+ <at name="horizontalAlignment">11</at>
<at name="text">Caption for "no entities" checkbox</at>
<at name="height">16</at>
<at name="width">217</at>
- <at name="name"></at>
+ <at name="name">noEntitiesCaptionLabel</at>
<at name="horizontalTextPosition">10</at>
<at name="fill">
<object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
@@ -619,7 +621,7 @@
<at name="text">Error message if "no entities" not
checked</at>
<at name="height">16</at>
<at name="width">264</at>
- <at name="name"></at>
+ <at name="name">noEntitiesErrorLabel</at>
<at name="horizontalTextPosition">10</at>
<at name="fill">
<object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
@@ -712,6 +714,236 @@
</object>
</at>
</item>
+ <item >
+ <at name="value">
+ <object classname="com.jeta.forms.store.memento.BeanMemento">
+ <super classname="com.jeta.forms.store.memento.ComponentMemento">
+ <at name="cellconstraints">
+ <object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+ <at name="column">2</at>
+ <at name="row">11</at>
+ <at name="colspan">1</at>
+ <at name="rowspan">1</at>
+ <at name="halign">right</at>
+ <at name="valign">default</at>
+ <at name="insets" object="insets">0,0,0,0</at>
+ </object>
+ </at>
+ <at
name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+ </super>
+ <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+ <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+ <at name="beanproperties">
+ <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+ <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+ <at name="properties">
+ <object classname="com.jeta.forms.store.support.PropertyMap">
+ <at name="text">Allow free-text comment</at>
+ <at name="height">16</at>
+ <at name="width">159</at>
+ <at name="name">commentCheckboxLabel</at>
+ <at name="fill">
+ <object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
+ <at name="name">fill</at>
+ </object>
+ </at>
+ <at name="border">
+ <object
classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ <at name="borders">
+ <object classname="java.util.LinkedList">
+ <item >
+ <at name="value">
+ <object
classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ </object>
+ </at>
+ </item>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </item>
+ <item >
+ <at name="value">
+ <object classname="com.jeta.forms.store.memento.BeanMemento">
+ <super classname="com.jeta.forms.store.memento.ComponentMemento">
+ <at name="cellconstraints">
+ <object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+ <at name="column">2</at>
+ <at name="row">13</at>
+ <at name="colspan">1</at>
+ <at name="rowspan">1</at>
+ <at name="halign">right</at>
+ <at name="valign">default</at>
+ <at name="insets" object="insets">0,0,0,0</at>
+ </object>
+ </at>
+ <at
name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+ </super>
+ <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+ <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+ <at name="beanproperties">
+ <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+ <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+ <at name="properties">
+ <object classname="com.jeta.forms.store.support.PropertyMap">
+ <at name="text">Comment field caption</at>
+ <at name="height">16</at>
+ <at name="width">144</at>
+ <at name="name">commentCaptionLabel</at>
+ <at name="fill">
+ <object
classname="com.jeta.forms.store.properties.effects.PaintProperty">
+ <at name="name">fill</at>
+ </object>
+ </at>
+ <at name="border">
+ <object
classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ <at name="borders">
+ <object classname="java.util.LinkedList">
+ <item >
+ <at name="value">
+ <object
classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ </object>
+ </at>
+ </item>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </item>
+ <item >
+ <at name="value">
+ <object classname="com.jeta.forms.store.memento.BeanMemento">
+ <super classname="com.jeta.forms.store.memento.ComponentMemento">
+ <at name="cellconstraints">
+ <object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+ <at name="column">4</at>
+ <at name="row">11</at>
+ <at name="colspan">1</at>
+ <at name="rowspan">1</at>
+ <at name="halign">default</at>
+ <at name="valign">default</at>
+ <at name="insets" object="insets">0,0,0,0</at>
+ </object>
+ </at>
+ <at
name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+ </super>
+ <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+ <at name="beanclass">javax.swing.JCheckBox</at>
+ <at name="beanproperties">
+ <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+ <at name="classname">javax.swing.JCheckBox</at>
+ <at name="properties">
+ <object classname="com.jeta.forms.store.support.PropertyMap">
+ <at name="selected">true</at>
+ <at name="height">20</at>
+ <at name="width">496</at>
+ <at name="name">commentCheckbox</at>
+ <at name="border">
+ <object
classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ <at name="borders">
+ <object classname="java.util.LinkedList">
+ <item >
+ <at name="value">
+ <object
classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ </object>
+ </at>
+ </item>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </item>
+ <item >
+ <at name="value">
+ <object classname="com.jeta.forms.store.memento.BeanMemento">
+ <super classname="com.jeta.forms.store.memento.ComponentMemento">
+ <at name="cellconstraints">
+ <object
classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+ <at name="column">4</at>
+ <at name="row">13</at>
+ <at name="colspan">1</at>
+ <at name="rowspan">1</at>
+ <at name="halign">default</at>
+ <at name="valign">default</at>
+ <at name="insets" object="insets">0,0,0,0</at>
+ </object>
+ </at>
+ <at
name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+ </super>
+ <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+ <at name="beanclass">javax.swing.JTextField</at>
+ <at name="beanproperties">
+ <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+ <at name="classname">javax.swing.JTextField</at>
+ <at name="properties">
+ <object classname="com.jeta.forms.store.support.PropertyMap">
+ <at name="text">Comment</at>
+ <at name="height">28</at>
+ <at name="width">496</at>
+ <at name="name">commentCaption</at>
+ <at name="border">
+ <object
classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ <at name="borders">
+ <object classname="java.util.LinkedList">
+ <item >
+ <at name="value">
+ <object
classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+ <super
classname="com.jeta.forms.store.properties.BorderProperty">
+ <at name="name">border</at>
+ </super>
+ </object>
+ </at>
+ </item>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </object>
+ </at>
+ </item>
</object>
</at>
<at name="properties">
@@ -769,7 +1001,7 @@
<at name="cellpainters">
<object classname="com.jeta.forms.store.support.Matrix">
<at name="rows">
- <object classname="[Ljava.lang.Object;" size="14">
+ <object classname="[Ljava.lang.Object;" size="18">
<at name="item" index="0">
<object classname="[Ljava.lang.Object;" size="5"/>
</at>
@@ -812,6 +1044,18 @@
<at name="item" index="13">
<object classname="[Ljava.lang.Object;" size="5"/>
</at>
+ <at name="item" index="14">
+ <object classname="[Ljava.lang.Object;" size="5"/>
+ </at>
+ <at name="item" index="15">
+ <object classname="[Ljava.lang.Object;" size="5"/>
+ </at>
+ <at name="item" index="16">
+ <object classname="[Ljava.lang.Object;" size="5"/>
+ </at>
+ <at name="item" index="17">
+ <object classname="[Ljava.lang.Object;" size="5"/>
+ </at>
</object>
</at>
</object>
Modified:
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/rest/CrowdFlowerClient.java
===================================================================
---
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/rest/CrowdFlowerClient.java
2014-09-04 01:19:45 UTC (rev 18289)
+++
gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/rest/CrowdFlowerClient.java
2014-09-04 12:14:12 UTC (rev 18290)
@@ -75,11 +75,14 @@
* task extracted from the entity annotation. This is
* expressed as a List of [value, description] two-element
* Lists, one for each option.
+ * @param commentCaption caption for the free-text "comment" field, or null
+ * if no comment field should be shown.
* @return the newly created job ID.
* @throws IOException
*/
public long createClassificationJob(String title, String instructions,
- String caption, List<List<String>> commonOptions) throws IOException
{
+ String caption, List<List<String>> commonOptions,
+ String commentCaption) throws IOException {
log.debug("Creating classification job");
log.debug("title: " + title);
log.debug("instructions: " + instructions);
@@ -124,6 +127,11 @@
}
}
cml.append("</cml:radios>\n");
+ if(commentCaption != null) {
+ cml.append("<cml:text name=\"comment\" label=\"");
+ StringEscapeUtils.escapeXml(cml, commentCaption);
+ cml.append("\"/>");
+ }
log.debug("cml: " + cml.toString());
@@ -316,11 +324,14 @@
* checkbox.
* @param noEntitiesError the error message to show to the user if they have
* not marked any annotations but have also not ticked the checkbox.
+ * @param commentCaption caption for the free-text "comment" field, or null
+ * if no comment field should be shown.
* @return the newly created job ID.
* @throws IOException
*/
public long createAnnotationJob(String title, String instructions,
- String caption, String noEntitiesCaption, String noEntitiesError)
+ String caption, String noEntitiesCaption, String noEntitiesError,
+ String commentCaption)
throws IOException {
log.debug("Creating annotation job");
log.debug("title: " + title);
@@ -378,6 +389,11 @@
cml.append("\" value=\"1\"\n"
+ " only-if=\"!answer:required\" validates=\"required\"/>\n"
+ "</div>\n");
+ if(commentCaption != null) {
+ cml.append("<cml:text name=\"comment\" label=\"");
+ StringEscapeUtils.escapeXml(cml, commentCaption);
+ cml.append("\"/>");
+ }
log.debug("cml: " + cml.toString());
log.debug("POSTing to CrowdFlower");
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Slashdot TV.
Video for Nerds. Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
GATE-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gate-cvs