Skip to content

Commit

Permalink
chemin de fer d'intérêt local
Browse files Browse the repository at this point in the history
  • Loading branch information
glorieux-f committed Dec 4, 2024
1 parent 4964a62 commit 401362c
Show file tree
Hide file tree
Showing 10 changed files with 152 additions and 51 deletions.
17 changes: 17 additions & 0 deletions .classpath
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,22 @@
<attribute name="org.eclipse.jst.component.nondependency" value=""/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="target/generated-sources/annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>
4 changes: 4 additions & 0 deletions .settings/org.eclipse.m2e.core.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1
6 changes: 6 additions & 0 deletions .settings/org.eclipse.wst.common.component
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">

<wb-module deploy-name="alix">

<wb-resource deploy-path="/" source-path="/src/main/java"/>

<wb-resource deploy-path="/" source-path="/src/main/resources"/>
<wb-resource deploy-path="/" source-path="/target/generated-sources/annotations"/>

</wb-module>

</project-modules>
Binary file modified alix-cli/lib/alix-0.9.1-SNAPSHOT.jar
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ public TokenStreamComponents createComponents(String field)
TokenStream ts = tokenizer; // segment words
ts = new FilterAposHyphenFr(ts); // fr split on ’ and -
ts = new FilterLemmatize(ts); // provide lemma+pos
// compounds: parce que (quite expensive, 20% time)
// ts = new FilterLocution(ts); StackOverflowError
// compounds: parce que
ts = new FilterLocution(ts);
// link unknown names is bad
// result = new FilterFrPersname(result);
ts = new FilterCloud(ts);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ public void clear()

public void copyTo(AttributeSource target, final int position)
{
if (size < 1) {
throw new ArrayIndexOutOfBoundsException("size=0, no element to copy");
}
if (position < 0 || position >= size) {
throw new ArrayIndexOutOfBoundsException("position=" + position + ", not in [0," + size +"[");
}
data[pointer(position)].copyTo(target);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import com.github.oeuvres.alix.fr.Tag;
import com.github.oeuvres.alix.lucene.analysis.FrDics.LexEntry;
import com.github.oeuvres.alix.lucene.analysis.tokenattributes.CharsAttImpl;
import com.github.oeuvres.alix.lucene.analysis.tokenattributes.LemAtt;
import com.github.oeuvres.alix.lucene.analysis.tokenattributes.OrthAtt;

/**
Expand All @@ -61,15 +62,16 @@ public class FilterLocution extends TokenFilter
/** A normalized orthographic form (ex : capitalization) */
private final CharsAttImpl orthAtt = (CharsAttImpl) addAttribute(OrthAtt.class);
/** A lemma when possible */
private final CharsAttImpl lemAtt = (CharsAttImpl) addAttribute(CharTermAttribute.class);
private final CharsAttImpl lemAtt = (CharsAttImpl) addAttribute(LemAtt.class);
/** A stack of states */
private AttributeQueue queue;
/** A term used to concat a compound */
private CharsAttImpl compound = new CharsAttImpl();
/** past paticiples to not take as infinitives */
public static final HashSet<CharsAttImpl> EXCEPTIONS = new HashSet<CharsAttImpl>();
// parti pris, prise de conscience
static {
for (String w : new String[] { "pris", "prise'", "prises" }) {
for (String w : new String[] { }) {
EXCEPTIONS.add(new CharsAttImpl(w));
}
}
Expand All @@ -80,7 +82,7 @@ public class FilterLocution extends TokenFilter
*/
public FilterLocution(TokenStream input) {
super(input);
queue = new AttributeQueue(10, this);
// here, “this” has not all its attributes, AttributeQueue.copyTo() will bug
}

/**
Expand Down Expand Up @@ -110,47 +112,56 @@ public String toString(LinkedList<State> stack)
@Override
public final boolean incrementToken() throws IOException
{
System.out.println("call ");
if (queue == null) {
queue = new AttributeQueue(10, this);
}
clearAttributes();
// restart compound at each call
compound.setEmpty();
// flag up to exhaust queue before getting new token
boolean exhaust = true;

int startOffset = offsetAtt.startOffset();

boolean verbSeen = false;
// a dead end has not conclude as a locution, exhaust states recorded in queue
// let’s start to explore the queue
do {
// first call in loop, queu has to be exhausted
if (exhaust && !queue.isEmpty()) {
queue.removeFirst(this);
startOffset = offsetAtt.startOffset();
System.out.println("restore first " + termAtt);
}
else {
boolean hasToken = input.incrementToken();
if (queue.isEmpty() && !hasToken) return false;
else if(!hasToken) {
System.out.println("End problem " + queue);
return false;
}
System.out.println("incrementToken " + termAtt);

// start with a token
int queuePos = 0;
if (!queue.isEmpty()) {
queue.peekFirst(this);
queuePos++;
}
else {
boolean hasToken = input.incrementToken();
if(!hasToken) {
return false;
}
// next iteration should append
exhaust = false;
}
int startLoc = offsetAtt.startOffset();

// let’s start to find a locution
do {
/*
System.out.println("loop\t"
+ termAtt.toString() + "\t"
+ Tag.name(flagsAtt.getFlags()) + "\t"
// + orthAtt.toString() + "|\t|"
+ offsetAtt.startOffset() + "\t"
+ offsetAtt.endOffset() + "\t"
+ queue + "\t"
// + posIncAttribute.getPositionIncrement() + "\t"
+ "orth:" + orthAtt.toString() + "\t"
+ "lem:" + lemAtt.toString() + "\t"
);
*/
final int tag = flagsAtt.getFlags();
// if token is pun, end of branch, exit
if (Tag.PUN.sameParent(flagsAtt.getFlags()) || termAtt.length() == 0) {
compound.clear();
if (Tag.PUN.sameParent(tag) || tag == Tag.XML.flag || termAtt.length() == 0) {
// after the loop, the queue logic before exit
break;
}
// append a ' ' to last token (if any) for compound test
if (!compound.isEmpty() && !compound.endsWith('\'')) { // append separator before the term
compound.append(' ');
}
// choose version of form to append for test, according to its pos
int tag = flagsAtt.getFlags();
// forms to keep as is
if (orthAtt.length() != 0 && EXCEPTIONS.contains(orthAtt)) {
compound.append(orthAtt);
Expand Down Expand Up @@ -180,16 +191,12 @@ else if (orthAtt.length() != 0) {
}
final Integer nodeType = FrDics.TREELOC.get(compound);

System.out.println("compound=" + compound + " type=" + nodeType + " queue=" + queue);
// System.out.println("compound=" + compound + " type=" + nodeType + " isVerb=" + Tag.VERB.sameParent(tag) + " queue=" + queue);


// dead end
if (nodeType == null) {
// restore first token in queue (may be also the last)
// if (!queue.isEmpty()) // should be never empty
// if (!queue.isEmpty()) queue.peekFirst(this);
queue.addLast(this);
queue.removeFirst(this);
// the queue logic after the loop
break;
}

Expand All @@ -208,7 +215,7 @@ else if (orthAtt.length() != 0) {
orthAtt.setEmpty().append(entry.orth);
}
else {
orthAtt.setEmpty();
orthAtt.setEmpty().append(compound);
}
if (entry.lem != null) {
lemAtt.setEmpty().append(entry.lem);
Expand All @@ -224,23 +231,55 @@ else if (orthAtt.length() != 0) {
lemAtt.setEmpty();
}
// set offset
offsetAtt.setOffset(startOffset, offsetAtt.endOffset());
// no more locution candidate starting with same prefix
offsetAtt.setOffset(startLoc, offsetAtt.endOffset());

// no more locution candidate starting with same prefix, send
if ((nodeType & FrDics.BRANCH) == 0) {
break;
queue.clear();
return true;
}
// store this locution in the queue, try to go ahead ((chemin de fer) d’intérêt local)
queue.clear();
queue.addLast(this);
continue;
}
// should be a part of a compound, store state in case dead end, for rewind
else if ((nodeType & FrDics.BRANCH) > 0) {
// store this state
queue.addLast(this);
// here we should be in a branch
if ((nodeType & FrDics.BRANCH) == 0) {
throw new IOException("### not a branch ?" + queue);
}
} while (true); // a compound bigger than 10 should hurt queue
// queue.removeFirst(this);
// get another token, from queue
if (queue.size() > queuePos) {
queue.copyTo(this, queuePos);
queuePos++;
}
// get another token, from stream
else {
// current token should be new, record it
if (queue.isEmpty()) {
queue.addLast(this);
}
boolean hasToken = input.incrementToken();
// no more token to explore branch, exhaust queue
if (!hasToken) {
queue.removeFirst();
return true;
}
System.out.println(queue);
// lets try to append to compound
}


} while (true); // a compound bigger than queue should hurt and avoid infinite loop
// nothing stored, new token, not starting a locution, send it
if (queue.isEmpty()) {
}
// a restored token at first call, empty it and send it
else if (queuePos > 0) {
queue.removeFirst();
}
// more than one token to restore
else { // if (queue.size() > 1)
queue.addLast(this);
queue.removeFirst(this);
}
return true;
}

Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/com/github/oeuvres/alix/fr/locutions.csv
Original file line number Diff line number Diff line change
Expand Up @@ -1148,6 +1148,7 @@ parce qu',CONJsub,parce que,
parole d'honneur,SUB,,
part time,SUB,,
parti pris,SUB,parti-pris,
parti prendre,SUB,parti-pris,
pas plus que,PREP,,
pas plus tard que,PREP,,
paso doble,SUB,,
Expand Down Expand Up @@ -1234,6 +1235,7 @@ presse écrite,SUB,,
prêt à,PREP,,
prime time,SUB,,
prise de conscience,SUB,,
prendre de conscience,SUB,prise de conscience,
prix Nobel,SUB,,
proche de,PREP,,
procureur du roi,SUB,,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

import static org.junit.Assert.*;

import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
Expand All @@ -29,8 +33,16 @@ public class TokenStreamsTest {
@Test
public void locution() throws IOException
{
String text = "Le chemin de Fer d’utilité locale";
Analyzer ana = new AnalyzerLocution();
String text = "";
// File file = new File("src/test/resources/article.xml");
// String text = Files.readString(Paths.get(file.getAbsolutePath()), StandardCharsets.UTF_8);
text = "<h1 class=\"head\">Avant-propos\n"
+ "<br class=\"lb\"/>de la seconde édition<a class=\"bookmark\" href=\"#body\"> </a>\n"
+ " </h1>\n"
+ " <p class=\"noindent p\">C’est souvent à la fois un plaisir et une désillusion"
;
text = "Le chemin de Fer d’intérêt local dont j’ai pris conscience dernièrement.";
Analyzer ana = new AnalyzerAlix();
analyze(ana.tokenStream("_cloud", text), text);
ana.close();
}
Expand Down
15 changes: 15 additions & 0 deletions src/test/resources/article.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<article>
<h1 class="head">Avant-propos
<br class="lb"/>de la seconde édition<a class="bookmark" href="#body"> </a>
</h1>
<p class="noindent p">C’est souvent à la fois un plaisir et une désillusion que d’être conduit à donner une seconde édition d’un ouvrage. Un plaisir parce que cela semble être l’indice que les idées auxquelles on tient se sont répandues et ont été discutées. Mais une désillusion parce que, à être contraint de se relire, on aperçoit mieux que jamais la pauvreté de ce que l’on a fait par rapport à ce que l’on rêvait.</p>
<p class="p">Le petit livre dont nous donnons une réédition devait être un recueil de travaux préliminaires, sur les échanges de pensée et la compréhension verbale de l’enfant, préparant une étude d’ensemble sur le même sujet. Or notre étude d’ensemble n’a pas encore vu le jour et nous sommes resté attaché, plus ou moins dogmatiquement, aux hypothèses initiales qui étaient destinées à servir de charpente et devaient être abandonnées au fur et à mesure de la construction véritable.</p>
<p class="p">Aussi, en acceptant de publier une seconde édition, notre premier projet a-t-il été de remanier le texte de la première et de remettre au point ce qui avait donné lieu à de légitimes critiques. Malheureusement, on ne refait pas un livre, surtout lorsqu’il s’agit d’un livre à thèses ! Par respect pour le lecteur, il vaut mieux</p>
<p class="p">ou écrire un nouvel ouvrage ou redonner tels quels ses essais primitifs, plutôt que de chercher à réparer l’irréparable et de livrer une série d’ébauches successives sans intérêt pour la science.</p>
<p class="p">La présente édition reproduit donc la première, à part quelques retouches de détail, sans importance en ce qui concerne la pensée elle-même.</p>
<p class="p">Cependant, pour répondre, ainsi qu’il convenait, aux observations qu’on nous a présentées concernant le contenu de cet ouvrage, nous sommes-nous résolu à publier un troisième volume de ces « Etudes sur la logique de l’enfant ». Ce tome III, qui s’intitulera « Nouvelles recherches sur la logique de l’enfant », comprendra, outre la réédition de certains articles épuisés, parus dans diverses revues, quelques pages inédites relatives à la mesure du langage égocentrique. Nos recherches initiales n’ont porté que sur le langage des enfants entre eux, observés dans le milieu scolaire très particulier de la Maison des Petits de l’Institut J. J. Rousseau. Or M<sup>πe</sup> M. Müchow, M. D. Katz, MM. Gali et Maso et M. A. Luria, en étudiant, du même point de vue, des enfants de milieux scolaires différents, en Allemagne, en Espagne et en Russie, et en étudiant surtout les conversations d’enfants dans la famille, sont arrivés sur certains points à des résultats assez différents des nôtres : alors que les petits écoliers, dans leurs conversations, présentent des coefficients d’égocentrisme plus ou moins analogues à ceux que nous avions observés, les enfants de M. Katz, parlant entre eux ou à leurs parents, se comportent au contraire tout</p>
<p class="p">différemment. C’est le problème du langage de l’enfant avec l’adulte que nous comptons reprendre, en collaboration avec M<sup>me</sup> Leuzinger-Schuler, qui a bien voulu se livrer à des recherches approfondies sur ce point.</p>
<p class="p">D’autre part, un certain nombre de critiques générales, dues à M<sup>me</sup> Isaacs, MM. Stern, Blondel, Wallon, Bourjade et bien d’autres, nous ont engagé à préciser nos thèses en une discussion que l’on trouvera également dans ce troisième volume.</p>
<p class="p">Mais, répétons-le, les études contenues dans ce volume, ainsi que dans « Le <i>Jugement et le Raisonnement chez l’Enfant</i> » et les « <i>Nouvelles recherches sur la Logique de l’Enfant », ne</i> constituent que des travaux d’approche, relatifs aux conditions sociales du développement de la pensée. Il nous reste — et nous y travaillons — à étudier chez l’enfant la formation de la raison en elle-même et pour elle-même.</p>
<p class="p">Genève, 1930.</p>
</article>

0 comments on commit 401362c

Please sign in to comment.