<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Eolya Consulting &#187; Lucene / Solr</title>
	<atom:link href="http://www.eolya.fr/category/lucene/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.eolya.fr</link>
	<description>Moteurs de recherche d&#039;entreprise et verticaux</description>
	<lastBuildDate>Thu, 24 Nov 2011 10:52:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>MySolrServer propose l&#8217;hébergement d&#8217;instances Solr</title>
		<link>http://www.eolya.fr/2011/06/05/mysolrserver-propose-lhebergement-dinstances-solr/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mysolrserver-propose-lhebergement-dinstances-solr</link>
		<comments>http://www.eolya.fr/2011/06/05/mysolrserver-propose-lhebergement-dinstances-solr/#comments</comments>
		<pubDate>Sun, 05 Jun 2011 14:32:25 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Hébergement]]></category>
		<category><![CDATA[Lucene / Solr]]></category>
		<category><![CDATA[Moteur de recherche]]></category>
		<category><![CDATA[Sites à découvrir]]></category>
		<category><![CDATA[hosted]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.zoonix.fr/?p=921</guid>
		<description><![CDATA[MySorlServer est un nouveau service web qui propose l&#8217;hébergement d&#8217;instances Solr sous la forme d&#8217;abonnements. Solr en mode SaaS répond entre autres à la difficulté pour un propriétaire de blog ou CMS de pouvoir utiliser les plugins ou extensions existantes pour Solr. En effet, disposer d&#8217;un hébergement Tomcat ou Jetty pour accueillir un serveur Solr [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zoonix.fr/uploads/2011/06/mysolrserver.png"><img class="alignleft size-full wp-image-933" title="mysolrserver" src="http://www.zoonix.fr/uploads/2011/06/mysolrserver.png" alt="" width="302" height="63" /></a><a href="http://www.mysolrserver.com">MySorlServer</a> est un nouveau service web qui propose l&#8217;hébergement d&#8217;instances <strong>Solr</strong> sous la forme d&#8217;abonnements. <strong>Solr en mode SaaS</strong> répond entre autres à la difficulté pour un propriétaire de blog ou CMS de pouvoir utiliser les plugins ou extensions existantes pour <strong>Solr</strong>. En effet, disposer d&#8217;un hébergement <strong>Tomcat</strong> ou <strong>Jetty</strong> pour accueillir un serveur Solr est souvent compliqué voir impossible sans recourir à la location d&#8217;un hébergement mutualisé complémentaire ou d&#8217;un serveur dédié.</p>
<p><strong>MySolrServer</strong> gère la mise en place et le paramétrage des instances <strong>Solr</strong> de façon transparente et ne nécessite donc pas de compétences <strong>Solr</strong> particulières. En quelques cliques de souris, une instance pré-paramétrée pour les plugins ou extensions <strong>Solr</strong> de <strong>WordPress</strong>, <strong>Joomla</strong>, <strong>eZ Publish</strong> ou <strong>Drupal</strong> est déployée et prête à l&#8217;emploi.</p>
<p><span id="more-921"></span></p>
<p>Pour l&#8217;utilisation avec d&#8217;autres <strong>CMS</strong> ou pour des besoins très spécifiques, il est possible de créée une instance de type <strong>API</strong> (ou plutôt RESTful).</p>
<p>L&#8217;utilisateur garde le contrôle total des fichiers de paramétrages <strong>Solr</strong> (synonymes, mots vides, &#8230;) au moyen d&#8217;une interface Web d&#8217;administration (le manager).</p>
<p>Cerise sur le gâteau, <strong>MySolrServer</strong> propose des instances de type <strong>Crawler</strong> afin d&#8217;indexer des sites web et disposer d&#8217;une interface de recherche complète. <strong>MySolrServer</strong> utilise le crawler <a href="http://www.crawl-anywhere.com/">Crawl Anywhere</a>.</p>
<p>Si vous souhaitez en savoir plus sur  <strong>MySolrServer</strong>, vous pouvez consulter <a href="http://www.mysolrserver.com/features/" target="_self">la liste des fonctionnalites</a>.</p>
<p>Si vous souhaitez voir des copies d&#8217;écran de l&#8217;interface web d&#8217;administration, vous pouvez consulter <a href="http://www.mysolrserver.com/documentation/">la documentation</a>.</p>
<p><strong>MySolrServer</strong> est actuellement en mode bêta avec quelques <a href="http://www.mysolrserver.com/testing-and-beta-periods-agenda-and-specific-use-conditions/">conditions d&#8217;utilisation temporaires durant cette période</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eolya.fr/2011/06/05/mysolrserver-propose-lhebergement-dinstances-solr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solr et curl</title>
		<link>http://www.eolya.fr/2011/01/28/solr-et-curl/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solr-et-curl</link>
		<comments>http://www.eolya.fr/2011/01/28/solr-et-curl/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 17:45:14 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Lucene / Solr]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.zoonix.fr/?p=806</guid>
		<description><![CDATA[&#160; &#160; &#160; &#160; Voici quelques commandes simples et bien utiles utilisant curl afin de manipuler un index Solr. Supprimer un document &#224; partir de sa valeur de cl&#233; unique Supprimer un document &#224; partir d&#39;une requ&#234;te Vider totalement un index Forcer un commit d&#39;un index Forcer un optimize d&#39;un index Supprimer un document &#224; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zoonix.fr/uploads/2010/03/solr.jpg"><img alt="solr" class="alignleft size-full wp-image-477" height="75" src="http://www.zoonix.fr/uploads/2010/03/solr.jpg" title="solr" width="105" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Voici quelques commandes simples et bien utiles utilisant <strong>curl</strong> afin de manipuler un index <strong>Solr</strong>.</p>
<ul>
<li>Supprimer un document &agrave; partir de sa valeur de cl&eacute; unique</li>
<li>Supprimer un document &agrave; partir d&#39;une requ&ecirc;te</li>
<li>Vider totalement un index</li>
<li>Forcer un commit d&#39;un index</li>
<li>Forcer un optimize d&#39;un index</li>
</ul>
<p><span id="more-806"></span></p>
<p><strong>Supprimer un document &agrave; partir de sa valeur de cl&eacute; unique :</strong></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">curl <span style="color: #ddbb00;">&amp;quot;</span>http://server:port/solrpath/solrcore/update<span style="color: #ddbb00;">&amp;quot;</span> -H <span style="color: #ddbb00;">&amp;quot;</span>Content-Type: text/xml<span style="color: #ddbb00;">&amp;quot;</span> --data-binary <span style="color: #ddbb00;">&amp;quot;&amp;lt;</span>delete<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>id<span style="color: #ddbb00;">&amp;gt;</span>SP2514N<span style="color: #ddbb00;">&amp;lt;</span>/id<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>/delete<span style="color: #ddbb00;">&amp;gt;&amp;quot;</span></pre></div></div>

<p><strong>Supprimer un document &agrave; partir d&#39;une requ&ecirc;te :</strong></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">curl <span style="color: #ddbb00;">&amp;quot;</span>http://server:port/solrpath/solrcore/update<span style="color: #ddbb00;">&amp;quot;</span> -H <span style="color: #ddbb00;">&amp;quot;</span>Content-Type: text/xml<span style="color: #ddbb00;">&amp;quot;</span> --data-binary <span style="color: #ddbb00;">&amp;quot;&amp;lt;</span>delete<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>query<span style="color: #ddbb00;">&amp;gt;</span>type:book<span style="color: #ddbb00;">&amp;lt;</span>/query<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>/delete<span style="color: #ddbb00;">&amp;gt;&amp;quot;</span></pre></div></div>

<p><strong>Vider totalement un index :</strong></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">curl <span style="color: #ddbb00;">&amp;quot;</span>http://server:port/solrpath/solrcore/update<span style="color: #ddbb00;">&amp;quot;</span> -H <span style="color: #ddbb00;">&amp;quot;</span>Content-Type: text/xml<span style="color: #ddbb00;">&amp;quot;</span> --data-binary <span style="color: #ddbb00;">&amp;quot;&amp;lt;</span>delete<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>query<span style="color: #ddbb00;">&amp;gt;</span>*:*<span style="color: #ddbb00;">&amp;lt;</span>/query<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>/delete<span style="color: #ddbb00;">&amp;gt;&amp;quot;</span></pre></div></div>

<p><strong>Forcer un commit d&#39;un index :</strong></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">curl <span style="color: #ddbb00;">&amp;quot;</span>http://server:port/solrpath/solrcore/update<span style="color: #ddbb00;">&amp;quot;</span> -H <span style="color: #ddbb00;">&amp;quot;</span>Content-Type: text/xml<span style="color: #ddbb00;">&amp;quot;</span> --data-binary <span style="color: #ddbb00;">&amp;quot;&amp;lt;</span>commit/<span style="color: #ddbb00;">&amp;gt;&amp;quot;</span></pre></div></div>

<p><strong>Forcer un optimize d&#39;un index :</strong></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">curl <span style="color: #ddbb00;">&amp;quot;</span>http://server:port/solrpath/solrcore/update<span style="color: #ddbb00;">&amp;quot;</span> -H <span style="color: #ddbb00;">&amp;quot;</span>Content-Type: text/xml<span style="color: #ddbb00;">&amp;quot;</span> --data-binary <span style="color: #ddbb00;">&amp;quot;&amp;lt;</span>optimize/<span style="color: #ddbb00;">&amp;gt;&amp;quot;</span></pre></div></div>

<p>&nbsp;</p>
<p>Pour plus d&#39;exemples, vous pouvez consulter cette page du <strong>Wiki Solr</strong> : <a href="http://wiki.apache.org/solr/UpdateXmlMessages" target="_blank">http://wiki.apache.org/solr/UpdateXmlMessages</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.eolya.fr/2011/01/28/solr-et-curl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Appliquer un patch à Solr</title>
		<link>http://www.eolya.fr/2011/01/24/appliquer-un-patch-a-solr/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=appliquer-un-patch-a-solr</link>
		<comments>http://www.eolya.fr/2011/01/24/appliquer-un-patch-a-solr/#comments</comments>
		<pubDate>Mon, 24 Jan 2011 15:53:50 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Lucene / Solr]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.zoonix.fr/?p=793</guid>
		<description><![CDATA[Le temps qui s&#39;&#233;coule entre 2 versions de Solr est plut&#244;t long. Dans l&#39;interval, de nombreux correctifs sont r&#233;alis&#233;s voir m&#234;me de nouvelles fonctionnalit&#233;s impl&#233;ment&#233;es. Il est donc parfois n&#233;cessaire d&#39;appliquer un patch &#224; Solr (par exemple avec la version 1.4.1, si on veux que le composant spellchecker fonctionne en recherche distribu&#233;e, il faut appliquer [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zoonix.fr/uploads/2010/03/solr.jpg"><img alt="solr" class="alignleft size-full wp-image-477" height="75" src="http://www.zoonix.fr/uploads/2010/03/solr.jpg" title="solr" width="105" /></a>Le temps qui s&#39;&eacute;coule entre 2 versions de Solr est plut&ocirc;t long. Dans l&#39;interval, de nombreux correctifs sont r&eacute;alis&eacute;s voir m&ecirc;me de nouvelles fonctionnalit&eacute;s impl&eacute;ment&eacute;es. Il est donc parfois n&eacute;cessaire d&#39;appliquer un patch &agrave; Solr (par exemple avec la version 1.4.1, si on veux que le composant spellchecker fonctionne en recherche distribu&eacute;e, il faut appliquer le patch <a class="external" href="https://issues.apache.org/jira/browse/SOLR-785">SOLR-785</a>).</p>
<p>Voici la m&eacute;thode pour int&eacute;grer le patch suivant : <a class="external" href="https://issues.apache.org/jira/browse/SOLR-785">https://issues.apache.org/jira/browse/SOLR-785</a></p>
<ul>
<li>Commencer par r&eacute;cup&eacute;rer une distribution des sources de Solr (<a class="external" href="http://www.apache.org/dyn/closer.cgi/lucene/solr/">http://www.apache.org/dyn/closer.cgi/lucene/solr/</a>).</li>
<li>D&eacute;compresser l&#39;archive dans un r&eacute;pertoire. Pour l&#39;exemple on utilise /tmp, ce qui donne un r&eacute;pertoire /tmp/apache-solr-1.4.1</li>
<li>Dans /tmp/apache-solr-1.4.1, placer le fichier correspondant au patch (pour le patch SOLR-785, c&#39;est SOLR-785.patch)</li>
<li>Patcher<br />
		<code>cd /tmp/apache-solr-1.4.1<br />
		patch -p0 -i SOLR-785.patch</code></li>
<li>Recompiler<br />
		<code>ant clean<br />
		ant dist</code></li>
</ul>
<p>Le war compil&eacute; est dans le r&eacute;pertoire dist</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eolya.fr/2011/01/24/appliquer-un-patch-a-solr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crawl Anywhere version 1.1.0 est disponible</title>
		<link>http://www.eolya.fr/2011/01/03/crawl-anywhere-version-1-1-0-est-disponible/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=crawl-anywhere-version-1-1-0-est-disponible</link>
		<comments>http://www.eolya.fr/2011/01/03/crawl-anywhere-version-1-1-0-est-disponible/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 10:04:58 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Lucene / Solr]]></category>
		<category><![CDATA[Moteur de recherche]]></category>
		<category><![CDATA[Crawler]]></category>
		<category><![CDATA[pipeline]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.zoonix.fr/?p=743</guid>
		<description><![CDATA[Crawl Anywhere est un crawler web, un pipeline de traitement des documents et un indexer Solr. Il offre une interface Web d&#39;administration qui permet de facilement g&#233;rer les diff&#233;rentes sources (sites web) &#224; crawler et indexer. Apr&#232;s plusieurs mises en production chez des clients et les diff&#233;rents retours d&#39;exp&#233;riences, un certain nombre de nouvelles fonctionnalit&#233;s [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zoonix.fr/uploads/2010/10/logo_small.jpg"><img alt="" class="alignleft size-full wp-image-689" height="54" src="http://www.zoonix.fr/uploads/2010/10/logo_small.jpg" title="logo_small" width="65" /></a><a href="http://www.crawl-anywhere.com/" target="_blank">Crawl Anywhere</a> est un crawler web, un pipeline de traitement des documents et un indexer Solr. Il offre une interface Web d&#39;administration qui permet de facilement g&eacute;rer les diff&eacute;rentes sources (sites web) &agrave; crawler et indexer.</p>
<p>Apr&egrave;s plusieurs mises en production chez des clients et les diff&eacute;rents retours d&#39;exp&eacute;riences, un certain nombre de nouvelles fonctionnalit&eacute;s ont &eacute;t&eacute; ajout&eacute;es &agrave; Crawl Anywhere. Une liste des principales nouvelles fonctionnalit&eacute;s est disponible sur le wiki dans la <a href="http://www.wiizio.com/confluence/display/CRAWLUSERS/Release+notes+v1.1.0">release note</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eolya.fr/2011/01/03/crawl-anywhere-version-1-1-0-est-disponible/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solr et PHP</title>
		<link>http://www.eolya.fr/2010/11/06/solr-et-php/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solr-et-php</link>
		<comments>http://www.eolya.fr/2010/11/06/solr-et-php/#comments</comments>
		<pubDate>Sat, 06 Nov 2010 09:19:32 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Lucene / Solr]]></category>
		<category><![CDATA[Moteur de recherche]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.zoonix.fr/?p=730</guid>
		<description><![CDATA[Voici une pr&#233;sentation slideshare de Solr ainsi que des exemples de code PHP avec l&#39;extension Apache Solr PECL. Un bon rappel des concepts de base. [slideshare id=5658889&#38;doc=zendconsolrphp-101103144414-phpapp02]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zoonix.fr/uploads/2010/03/solr.jpg"><img alt="solr" class="alignleft size-full wp-image-477" height="75" src="http://www.zoonix.fr/uploads/2010/03/solr.jpg" title="solr" width="105" /></a>Voici une pr&eacute;sentation <strong>slideshare</strong> de <a href="http://lucene.apache.org/solr/" target="_blank"><strong>Solr</strong></a> ainsi que des exemples de code PHP avec l&#39;extension Apache Solr PECL.</p>
<p>Un bon rappel des concepts de base.</p>
<p>[slideshare id=5658889&amp;doc=zendconsolrphp-101103144414-phpapp02]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eolya.fr/2010/11/06/solr-et-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparaison de moteurs de recherche open source</title>
		<link>http://www.eolya.fr/2010/11/04/comparaison-de-moteurs-de-recherche-open-source/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=comparaison-de-moteurs-de-recherche-open-source</link>
		<comments>http://www.eolya.fr/2010/11/04/comparaison-de-moteurs-de-recherche-open-source/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 18:14:18 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Lucene / Solr]]></category>
		<category><![CDATA[Moteur de recherche]]></category>

		<guid isPermaLink="false">http://www.zoonix.fr/?p=724</guid>
		<description><![CDATA[Je signale l&#8217;int&#233;ressante &#233;tude A Comparison of Open Source Search Engines (PDF) de Christian Middleton et Ricardo Baeza-Yates parue en 2008. Les moteurs analys&#233;s sont : ht://Dig, Indri, IXE, Lucene, MG4J, IBM OmniFind Yahoo! Edition, Omega, SWISH-E, SWISH++, Terrier, XMLSearch et Zettair. Les moteurs qui sortent du lot sont pour un environnement Java: MG4J, Terrier [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zoonix.fr/uploads/2010/10/logo_small.jpg"><img alt="" class="alignleft size-full wp-image-689" height="54" src="http://www.zoonix.fr/uploads/2010/10/logo_small.jpg" title="logo_small" width="65" /></a>Je signale l&rsquo;int&eacute;ressante &eacute;tude <a href="http://wrg.upf.edu/WRG/dctos/Middleton-Baeza.pdf" target="_blank">A Comparison of Open Source Search Engines</a> (PDF) de Christian Middleton et Ricardo Baeza-Yates parue en 2008. Les moteurs analys&eacute;s sont : ht://Dig, Indri, IXE, Lucene, MG4J, IBM OmniFind Yahoo! Edition, Omega, SWISH-E, SWISH++, Terrier, XMLSearch et Zettair. Les moteurs qui sortent du lot sont pour un environnement Java: MG4J, Terrier ou Lucene, et pour un environnement C/C++: Swish-E, Swish++, ht://Dig, XMLSearch ou Zettair.</p>
<p>Lucene se distingue dans tous les domaines sauf celui d&#39;indexer une collection de document de 10 Go. Au vu des progr&egrave;s r&eacute;alis&eacute;s par Lucene ces derni&egrave;res ann&eacute;es, je pense que la version actuelle n&#39;aurait aucun probl&egrave;me. <br />
	&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eolya.fr/2010/11/04/comparaison-de-moteurs-de-recherche-open-source/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Obtenir une compilation nocturne de Solr 3.1 ou Solr 4.0</title>
		<link>http://www.eolya.fr/2010/11/03/obtenir-une-compilation-nocturne-de-lucene-4-0-et-solr-4-0/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=obtenir-une-compilation-nocturne-de-lucene-4-0-et-solr-4-0</link>
		<comments>http://www.eolya.fr/2010/11/03/obtenir-une-compilation-nocturne-de-lucene-4-0-et-solr-4-0/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 18:11:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Lucene / Solr]]></category>
		<category><![CDATA[Moteur de recherche]]></category>
		<category><![CDATA[Technique]]></category>
		<category><![CDATA[nightly build]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.zoonix.fr/?p=710</guid>
		<description><![CDATA[Depuis le début de l&#8217;année les sources de Lucene et Solr ont fusionnées. La prochaine version commune aura pour numéro 4.0. Pour ceux qui veulent déjà tester la version en cours de développement, il faut en récupérer les sources et les compiler (java 1.6 requis). En effet, les liens de téléchargement des compilations nocturnes ne [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zoonix.fr/uploads/2010/03/solr.jpg"><img class="alignleft size-full wp-image-477" title="solr" src="http://www.zoonix.fr/uploads/2010/03/solr.jpg" alt="solr" width="105" height="75" /></a>Depuis le début de l&#8217;année les sources de Lucene et Solr ont fusionnées. La prochaine version commune aura pour numéro 4.0. Pour ceux qui veulent déjà tester la version en cours de développement, il faut en récupérer les sources et les compiler (java 1.6 requis). En effet, les liens de téléchargement des compilations nocturnes ne fonctionnent pas. En prérequis, il faut disposer de <strong>svn</strong> client et de <strong>ant</strong>.</p>
<p>Il existe actuellement 2 versions en cours de développement : Solr 3.1 et Solr 4.0. Ma compréhension est que :</p>
<ul>
<li>Solr 3.1 est une version plutôt stable qui devrait la prochaine version de Solr et embarquent Lucene 3.1. Sortie possible : mars ou avril 2011.</li>
<li>Solr 4.0 est la version de développement (trunk) moins stable et dont le disponibilité dervait être pour 2012.</li>
</ul>
<p>Pour une explication sur ces 2 versions des sources de Solr, lire ce message de <strong>Uwe Schindler</strong> : <a href="http://lucene.472066.n3.nabble.com/Lucene-3-x-branch-created-td777485.html" target="_blank">Lucene 3.x branch created</a> et cette discussion : <a href="http://lucene.472066.n3.nabble.com/Solr-3-1-td1522319.html" target="_blank">Solr 3.1</a><span id="more-710"></span></p>
<h3>Solr 3.1</h3>
<p>Créer un répertoire de travail :</p>
<pre>mkdir ~/solr-3.1</pre>
<p>Se placer dans ce répertoire et récupérer les sources :</p>
<pre>cd ~/solr-3.1
svn co http://svn.apache.org/repos/asf/lucene/dev/branches/branch_3x</pre>
<p>Compiler les sources :</p>
<pre>cd ~/solr-3.1/branch_3x/lucene
ant dist
cd ~/solr-3.1/branch_3x/solr
ant dist</pre>
<p>La javadoc est disponible ici : <a href="https://hudson.apache.org/hudson/job/Lucene-3.x/javadoc/all/index.html" target="_blank">https://hudson.apache.org/hudson/job/Lucene-3.x/javadoc/all/index.html</a></p>
<h3>Solr 4.0</h3>
<p>Créer un répertoire de travail :</p>
<pre>mkdir ~/solr-4.0</pre>
<p>Se placer dans ce répertoire et récupérer les sources :</p>
<pre>cd ~/solr-4.0
svn co http://svn.apache.org/repos/asf/lucene/dev/trunk</pre>
<p>Compiler les sources :</p>
<pre>cd ~/solr-4.0/trunk/modules
ant compile
cd ~/solr-4.0/trunk/lucene
ant dist
cd ~/solr-4.0/trunk/solr
ant dist</pre>
<p>La javadoc est disponible ici : <a href="https://hudson.apache.org/hudson/job/Lucene-3.x/javadoc/all/index.html" target="_blank">https://hudson.apache.org/hudson/job/Lucene-trunk/javadoc/all/index.html</a></p>
<h3>Note du 2/11/2011 :</h3>
<p>Le meilleur endroit pour récupérer les builds nocturnes ainsi que les liens vers les javadoc est : <a href="http://wiki.apache.org/solr/NightlyBuilds">http://wiki.apache.org/solr/NightlyBuilds</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.eolya.fr/2010/11/03/obtenir-une-compilation-nocturne-de-lucene-4-0-et-solr-4-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crawl Anywhere a son propre site</title>
		<link>http://www.eolya.fr/2010/10/31/crawl-anywhere-a-son-propre-site/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=crawl-anywhere-a-son-propre-site</link>
		<comments>http://www.eolya.fr/2010/10/31/crawl-anywhere-a-son-propre-site/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 14:45:25 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Lucene / Solr]]></category>
		<category><![CDATA[Moteur de recherche]]></category>
		<category><![CDATA[Sites à découvrir]]></category>
		<category><![CDATA[Crawler]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.zoonix.fr/?p=687</guid>
		<description><![CDATA[Dans un article pr&#233;c&#233;dent, j&#39;ai parl&#233; de Crawl Anywhere un crawler Web que j&#39;ai &#233;cris dans le cadre du projet Hurisearch (www.hurisearch.org). Crawl Anywhere ayant suscit&#233; l&#39;int&#233;r&#234;t, j&#39;ai d&#233;cid&#233; de cr&#233;er son propre site tout en anglais pour en faire la promotion : http://www.crawl-anywhere.com/. Si un crawler web avec une vrai interface d&#39;administration vous int&#233;resse, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zoonix.fr/uploads/2010/10/logo_small.jpg"><img alt="" class="alignleft size-full wp-image-689" height="54" src="http://www.zoonix.fr/uploads/2010/10/logo_small.jpg" title="logo_small" width="65" /></a>Dans un article pr&eacute;c&eacute;dent, j&#39;ai parl&eacute; de Crawl Anywhere un crawler Web que j&#39;ai &eacute;cris dans le cadre du projet Hurisearch (www.hurisearch.org). Crawl Anywhere ayant suscit&eacute; l&#39;int&eacute;r&ecirc;t, j&#39;ai d&eacute;cid&eacute; de cr&eacute;er son propre site tout en anglais pour en faire la promotion : <a href="http://www.crawl-anywhere.com">http://www.crawl-anywhere.com/</a>.</p>
<p>Si un crawler web avec une vrai interface d&#39;administration vous int&eacute;resse, je vous invite &agrave; lire ou relire l&#39;article que j&#39;ai &eacute;cris il y a quelques mois : &quot;<a href="http://www.zoonix.fr/2010/03/07/un-crawler-web-pour-solr/">Crawl Anywhere : un crawler Web pour Solr</a>&quot; et &agrave; aller sur <a href="http://http://www.crawl-anywhere.com/">www.crawl-anywhere.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eolya.fr/2010/10/31/crawl-anywhere-a-son-propre-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Détection de la langue d’un texte (3)</title>
		<link>http://www.eolya.fr/2010/03/26/detection-de-la-langue-d%e2%80%99un-texte-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=detection-de-la-langue-d%25e2%2580%2599un-texte-3</link>
		<comments>http://www.eolya.fr/2010/03/26/detection-de-la-langue-d%e2%80%99un-texte-3/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 00:17:00 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Lucene / Solr]]></category>
		<category><![CDATA[Technique]]></category>
		<category><![CDATA[n-gram]]></category>
		<category><![CDATA[ngp]]></category>
		<category><![CDATA[ngramj]]></category>

		<guid isPermaLink="false">http://www.zoonix.fr/?p=569</guid>
		<description><![CDATA[Dans un premier article sur le sujet, je décris une méthode de détection de la langue d&#8217;un texte basée sur un calcul statistique de présence de n-gram dans le texte.  Cette distribution statistique est alors comparée à des distributions types pré-calculées sur des corpus de texte dans différentes langues. La langue du texte est alors [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zoonix.fr/uploads/2010/03/java.jpg"><img class="alignleft size-full wp-image-608" title="java" src="http://www.zoonix.fr/uploads/2010/03/java.jpg" alt="java" width="78" height="124" /></a>Dans <a href="http://www.zoonix.fr/2008/02/20/detection-de-la-langue-dun-texte/">un premier article sur le sujet</a>, je décris une méthode de détection de la langue d&#8217;un texte basée sur un calcul statistique de présence de n-gram dans le texte.  Cette distribution statistique est alors comparée à des distributions types pré-calculées sur des corpus de texte dans différentes langues. La langue du texte est alors à priori celle du corpus présentant la distribution la plus proche. Comme je l&#8217;ai expliqué dans mon premier article, j’ai utilisé <a onclick="javascript:pageTracker._trackPageview('/outbound/article/ngramj.sourceforge.net');" href="http://ngramj.sourceforge.net/" target="_blank">NgramJ</a>,  une librairie Java open source. Après différents tests avec d&#8217;autres librairies, NgramJ reste pour moi la plus efficace.</p>
<p>Cependant, cette méthode n&#8217;est pas fiable à 100% et <strong>NgramJ</strong> est limitée  dans sa version actuelle à 26 langues détectables : Bulgare (bg), Tchèque (cz), Danois (da), Allemand (de), Grec (el), Anglais (en) Espagnol (es), Estonien (et), Finlandais (fi), Français (fr), Hongrois (hu), Islandais (is), Italien (it), Lituanien (lt), Letton (lv), Maltais (mt) , Néerlandais (nl), Norvégien (no), Polonais (pl), Portugais (pt), Roumain (ro), Russe (ru) , Slovaque (sk), Slovène (sl), Suédois (sv) et Thaï (th).</p>
<p>Je voudrais proposer 2 pistes pour améliorer NGramJ : la fiabilité de la détection et le nombre de langues détectables.<span id="more-569"></span></p>
<h3>La fiabilité de la détection</h3>
<p><strong>NgramJ</strong> utilise un algorithme complexe de calcul statistique sur les n-grams et je n&#8217;ai pas la prétention de l&#8217;améliorer. Par contre, on peut facilement fournir des informations complémentaire à <strong>NGramJ</strong> afin qu&#8217;il oriente sa détection sur un sous-ensemble restreint de langues et non pas sur toutes les langues qu&#8217;il gère (surtout si on veut en augmenter le nombre).</p>
<p>Que connait-on du texte que l&#8217;on veut analyser ? On connait l&#8217;encodage de ses caractères (iso-8859-1, iso-8859-5, windows-1252, &#8230; et souvent unicode ou utf-8). Chacun de ces jeux de caractères permet d&#8217;écrire un ensemble plus ou moins important de langues (voir <a href="http://en.wikipedia.org/wiki/Character_encoding" target="_blank">Character encoding</a>). Unicode est particulier car il permet de coder toutes les langues, par contre une ou plusieurs langues partagent un sous ensemble d&#8217;unicode qu&#8217;il est facile d&#8217;identifier (voir <a href="http://unicode.org/charts/" target="_blank">Unicode 5.2 Character Code Charts</a>). On peut donc pour un texte donné se limiter à la détection des langues couvertes par le sous ensemble unicode qu&#8217;il utilise.</p>
<p>Par exemple, pour un texte codé en iso-8859-5 (caractères cyrilliques) les langues possibles sont : Bulgare (bg), Biélorusse (be), Macédonien (mk), Russe (ru), Serbe (sr) et Ukrainien (uk). La seule langue que devrait donc nous proposer <strong>NGramJ</strong> si on lui demande de se retreindre à ces langes est le Russe. Ce n&#8217;est pas satisfaisant. En effet, je ne veux pas que <strong>NgramJ</strong> me dise qu&#8217;un texte Bulgare est du Russe. Plus loin dans cet article, on verra comment &laquo;&nbsp;appendre&nbsp;&raquo; de nouvelles langues à <strong>NgramJ</strong>.</p>
<p>Encore mieux, on peut sans même le demander à <strong>NgramJ</strong> connaitre la langue d&#8217;une texte. En effet, certains jeux de caractères permettent de coder une seule langue : iso-8859-15 (Estonien), iso-8859-9 (Turc), iso-8859-7 (Grec), &#8230;</p>
<p>En conclusion, même si on parvient à apprendre à <strong>NgramJ</strong> la totalité des langues existantes (et pourquoi pas), on pourra toujours lui indiquer de travailler sur un sous-ensemble réduit de deux à une dizaine de langues en fonction de l&#8217;encodage du texte.</p>
<p>Un point auquel il faut porter attention est qu&#8217;un même jeux de caractères peut avoir plusieurs noms voisins. On trouve sur le site de l&#8217;<a href="http://www.iana.org/assignments/character-sets" target="_blank">INIA</a>, l&#8217;ensemble des jeux de caractères avec leur nom préféré et leurs alias.<br class="spacer_" /></p>
<p>Pour traiter cet aspect préliminaire à l&#8217;utilisation de NGramJ, j&#8217;ai développé une classe utilitaire <strong>CharsetLanguages</strong> qui permet de :</p>
<ul>
<li>Obtenir le nom préféré d&#8217;un jeux de caractères.</li>
<li>Obtenir les blocs unicode utilisé pour l&#8217;écriture d&#8217;un texte</li>
<li>Obtenir les langues associées à un jeu de caractères</li>
<li>Obtenir les langues associées aux blocs unicode détectés dans un texte</li>
</ul>
<p>Pour simplifier l&#8217;utilisation de <strong>NgramJ</strong>, j&#8217;ai également développé une classe <strong>LanguageRecognizerCngram</strong> qui permet de :</p>
<ul>
<li>Initialiser un contexte de détection en spécifiant le répertoire ou sont les fichiers de définitions des langues (fichiers modèles) et la liste des langues que l&#8217;on veut pouvoir détecter (si on sait à l&#8217;avance que les documents que l&#8217;on va traiter se limitent à ces langues) </li>
<li>lancer la reconnaissance d&#8217;une langue dans un texte</li>
</ul>
<p>Le code source de ces classes est fournie sous la forme d&#8217;un projet Eclipse. je fournie également la version compilée de <strong>NGramJ</strong> modifié. Ces modifications ont été transmises à l&#8217;auteur qui s&#8217;est proposé de les intégrer à la version officielle.</p>
<p>Voici un exemple de code pour l&#8217;utilisation de ces classes :</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399; font-weight: bold;">String</span> getLanguage <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">String</span> content, <span style="color: #003399; font-weight: bold;">String</span> charSet<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #003399; font-weight: bold;">String</span> language = <span style="color: #006600; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Define the maximum length for the text to be analyzed</span>
<span style="color: #006600; font-weight: bold;">int</span> languageDetectionLength = <span style="color: #cc66cc;">2048</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Define a list of candidate languages for the text</span>
<span style="color: #003399; font-weight: bold;">String</span> languageDetectionList = <span style="color: #0000ff;">&quot;bg, ru, sr, uk&quot;</span><span style="color: #339933;">;</span>
&nbsp;
content = content.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #003399; font-weight: bold;">Math</span>.<span style="color: #006633;">min</span><span style="color: #009900;">&#40;</span>content.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, languageDetectionLength<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Create the language detector</span>
LanguageRecognizerCngram lrCnGram = <span style="color: #000000; font-weight: bold;">new</span> LanguageRecognizerCngram<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>lrCnGram<span style="color: #339933;">!</span>=<span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Set the directory for the language models</span>
    lrCnGram.<span style="color: #006633;">setLanguageModelsDir</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/Data/ngramj/ngp/ngp&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>languageDetectionList<span style="color: #339933;">!</span>=<span style="color: #006600; font-weight: bold;">null</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #339933;">!</span><span style="color: #0000ff;">&quot;&quot;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>languageDetectionList<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Create a list for the candidate languages</span>
        <span style="color: #003399; font-weight: bold;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> tab = languageDetectionList.<span style="color: #006633;">split</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;,&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399; font-weight: bold;">ArrayList</span><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>String<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> arr = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">ArrayList</span><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>String<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Arrays</span>.<span style="color: #006633;">asList</span><span style="color: #009900;">&#40;</span>tab<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000;  font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">int</span> i=<span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>arr.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>i++<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
           arr.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span>i, arr.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Set the candidate languages</span>
        lrCnGram.<span style="color: #006633;">setCandidateLanguages</span><span style="color: #009900;">&#40;</span>arr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000;  font-weight: bold;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Try to get a candidate languages list according to the charset</span>
        <span style="color: #003399; font-weight: bold;">ArrayList</span><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>String<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> charSetCanditateLanguages<span style="color: #339933;">;</span>
        CharsetLanguages csu = <span style="color: #000000; font-weight: bold;">new</span> CharsetLanguages<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>charSet == <span style="color: #006600; font-weight: bold;">null</span> || <span style="color: #0000ff;">&quot;&quot;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>charSet<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
            charSet =<span style="color: #0000ff;">&quot;utf-8&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000000;  font-weight: bold;">else</span>
            charSet = csu.<span style="color: #006633;">getCharsetCanonicalName</span><span style="color: #009900;">&#40;</span>charSet<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;utf-8&quot;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>charSet<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #003399; font-weight: bold;">String</span> s = csu.<span style="color: #006633;">getUnicodeBlockDistribution</span> <span style="color: #009900;">&#40;</span>content<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            charSetCanditateLanguages = csu.<span style="color: #006633;">getUnicodeBlockLanguages</span><span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000;  font-weight: bold;">else</span>
        <span style="color: #009900;">&#123;</span>
            charSetCanditateLanguages = csu.<span style="color: #006633;">getCharsetLanguages</span><span style="color: #009900;">&#40;</span>charSet<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Only one possible language so nothing else to do</span>
        <span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>charSetCanditateLanguages<span style="color: #339933;">!</span>=<span style="color: #006600; font-weight: bold;">null</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> charSetCanditateLanguages.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>==<span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
            <span style="color: #000000; font-weight: bold;">return</span> charSetCanditateLanguages.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Set the candidate languages</span>
        lrCnGram.<span style="color: #006633;">setCandidateLanguages</span><span style="color: #009900;">&#40;</span>charSetCanditateLanguages<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Process the recognition</span>
    language = lrCnGram.<span style="color: #006633;">RecognizeLanguage</span><span style="color: #009900;">&#40;</span> content, <span style="color: #cc66cc;">0.5</span>, <span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> language<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Ajouter des langues à la liste de celles détectables par NGramJ</h3>
<p>Pour ce travail, je me suis inspiré de l&#8217;article suivant &laquo;&nbsp;<a href="http://blog.afterthedeadline.com/2009/12/04/generating-a-plain-text-corpus-from-wikipedia/" target="_blank">Generating a Plain Text Corpus from Wikipedia</a>&laquo;&nbsp;.</p>
<p>Pour ajouter une nouvelle langue, les étapes sont :</p>
<ul>
<li>Récupérer un corpus significatif de texte écrit dans cette langue</li>
<li>Nettoyer le texte</li>
<li>Créer le fichier modèle avec NGramJ</li>
</ul>
<h4>Obtenir un corpus</h4>
<p>Pour obtenir un corpus dans une langue donnée, il est possible de télécharger la totalité des articles de wikipedia dans cette langue. L&#8217;adresse dépend du code ISO de la langue :</p>
<p>http://download.wikimedia.org/&lt;code iso&gt;wiki/latest/&lt;code iso&gt;wiki-latest-pages-articles.xml.bz2</p>
<p>Par exemple, pour l&#8217;arabe, on récupère une archive et on la décompresse comme ceci :</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">curl -O http://download.wikimedia.org/arwiki/latest/arwiki-latest-pages-articles.xml.bz2
bunzip2 arwiki-latest-pages-articles.xml.bz2</pre></div></div>

<h4>Nettoyer le corpus</h4>
<p>Pour nettoyer le fichier xml, je me suis inspiré <a href="http://wiki.apertium.org/wiki/Talk:Calculating_coverage#wikicat2.sh" target="_blank">de ce script</a>.</p>
<p>Ma version est plus violent mais ne supprime pas ce qui n&#8217;est pas iso-8859-1.</p>
<p><em>wikicat2.sh :<br />
 </em></p>

<div class="wp_syntax"><div class="code"><pre class="sed" style="font-family:monospace;">#!/bin/sh
# http://wiki.apertium.org/wiki/Talk:Calculating_coverage#wikicat2.sh
# clean up wiki for running through apertium-destxt
# Use $ ./wikicat2.sh blah-pages-articles.xml.bz2
&nbsp;
# awk prints full lines, make sure each html element has one
#bzcat &quot;$@&quot; | sed 's/&amp;gt;/&amp;gt;n/g' | sed 's/&lt;!--n&lt;/g' |
cat &quot;$@&quot; | sed 's/--&gt;/&amp;gt;n/g' | sed 's/&lt;!--n&lt;/g' |
# want only stuff between &lt;text...--&gt; and
awk '
//,/&amp;lt;/text&amp;gt;/ { print $0 }
' |
&nbsp;
sed 's/[[([a-z]{2,3}):[^]]+]]//g' |
# Drop all transwiki links
&nbsp;
sed 's/[[[^]|]*|//g' | sed 's/]]//g' | sed 's/[[//g' |
# wiki markup, retain bar and fie from [[foo|bar]] [[fie]]
&nbsp;
sed 's/[http[^ ]*([^]]*)]/1/g' |
# wiki markup, retain `bar fie' from [http://foo bar fie]
&nbsp;
sed 's/&amp;amp;.*;/ /g' |
# remove entities greedily, so as to get rid of hidden html too
&nbsp;
# Keep only lines starting with a capital letter, removing tables with style info etc.
# grep '^[ t]*[A-ZÆØÅ]' # Your alphabet here
grep -vE '^([|{=}!]|[a-z]{2,3}:)' |
&nbsp;
# some other cleanup
grep -vE '^([a-z]{1,4}-[a-z]{1,4}:)' |
grep -vE '^([a-z]{1,4}-[a-z]{1,4}-[a-z]{1,4}:)' |
grep -vE '^s*[a-z]{0,2}s*$' |
grep -vE '^s*$' |
grep -vE &quot;([|]|'{3})&quot; |
&nbsp;
# keep a raisonnable corpus size
head -n 2000</pre></div></div>

<p>Et donc, pour générer un fichier nettoyé la commande est :</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">wikicat2.sh arwiki-latest-pages-articles.xml &amp;gt;ar.txt</pre></div></div>

<p>Ce script peut être à améliorer en fonction de résultat obtenu. Quoi qu&#8217;il en soit, il faut tout faire pour nettoyer au mieux le texte et même terminer le travail à la main si nécessaire.</p>
<h4>Créer le fichier model</h4>
<p>Le fichier modèle est généré à partir du texte nettoyé avec la commande suivante :</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">java -jar cngram.jar -create ar ar.txt &quot;UTF-8&quot;</pre></div></div>

<p>On peut enchainer automatiquement toutes ces taches en prenant soin de ne télécharger le corpus de wikipedia que si on ne l&#8217;a pas déjà. Voici comment préparer un environnement de travail et un script shell qui va enchainer toutes les opérations automatiquement pour une liste de langues.</p>
<p>1. dans un répertoire, on place cngram.jar et wikicat2.sh.</p>
<p>2. on y créer buildngp.sh</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">#!/bin/bash
&nbsp;
mkdir data &amp;gt; /dev/null 2&amp;gt;&amp;amp;1
cd  data
mkdir ngp &amp;gt; /dev/null 2&amp;gt;&amp;amp;1
&nbsp;
# for all these languages
for i in fr fa ar be mk sr uk; do
    echo $i
&nbsp;
    # download file from wikipedia only if necessary
    if [ -f ${i}wiki-latest-pages-articles.xml ];
    then
        echo &quot;${i}wiki-latest-pages-articles.xml exists in local&quot;
    else
        # download
        curl -O http://download.wikimedia.org/${i}wiki/latest/${i}wiki-latest-pages-articles.xml.bz2
        # unzip the file
        bunzip2 ${i}wiki-latest-pages-articles.xml.bz2
    fi
&nbsp;
    # cleanup the xml file to text file
    ../wikicat2.sh ${i}wiki-latest-pages-articles.xml &amp;gt; ${i}.txt
&nbsp;
    # create cngram ngp file
    java -jar ../cngram.jar -create ${i} ${i}.txt &quot;UTF-8&quot;
    mv ${i}.ngp ngp/${i}.ngp
done</pre></div></div>

<p>On lance le script ainsi en se positionnant dans le répertoire de travail :</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">./buildngp.sh</pre></div></div>

<p>Les données sont téléchargées dans le sous-répertoire data et les fichiers ngp créés dans data/ngp. Dans le script, la ligne suivante permet de définir la liste des langues pour lesquels ont va générer un fichier NPG.</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">for i in fr fa ar be mk sr uk; do</pre></div></div>

<h3>Téléchargements<br class="spacer_" /></h3>
<p>Télécharger le projet Eclipse <a href="http://www.zoonix.fr/uploads/2010/03/charsetlanguagestar.gz">CharsetLanguages</a></p>
<p>Télécharger les scripts de génération de fichier NGP pour NgramJ <a href="http://www.zoonix.fr/uploads/2010/03/buildngptar.gz">BuildNGP</a></p>
<p><br class="spacer_" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.eolya.fr/2010/03/26/detection-de-la-langue-d%e2%80%99un-texte-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tika 0.6 : compilation et dépendances</title>
		<link>http://www.eolya.fr/2010/03/11/tika-06-compilation-et-dependances/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tika-06-compilation-et-dependances</link>
		<comments>http://www.eolya.fr/2010/03/11/tika-06-compilation-et-dependances/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 20:48:55 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Lucene / Solr]]></category>
		<category><![CDATA[Technique]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[tika]]></category>

		<guid isPermaLink="false">http://www.zoonix.fr/?p=544</guid>
		<description><![CDATA[Tika est une librairie Java qui a pour but l&#8217;extraction du texte de toutes sortes de formats de fichiers : PDF, office,  html, &#8230; (la liste complète est disponible ici). Afin d&#8217;utiliser cette librairie dans vos projets java, il faut en récupérer les sources, les compiler et également récupérer les librairies dont dépend Tika. Voici [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zoonix.fr/uploads/2010/03/tika.png"><img class="alignleft size-full wp-image-550" title="tika" src="http://www.zoonix.fr/uploads/2010/03/tika.png" alt="tika" width="185" height="41" /></a>Tika est une librairie Java qui a pour but l&#8217;extraction du texte de toutes sortes de formats de fichiers : PDF, office,  html, &#8230; (la liste complète est disponible <a href="http://lucene.apache.org/tika/0.6/formats.html" target="_blank">ici</a>). Afin d&#8217;utiliser cette librairie dans vos projets java, il faut en récupérer les sources, les compiler et également récupérer les librairies dont dépend Tika. Voici la procédure à suivre ainsi qu&#8217;une astuce pour palier à un problème de compilation.<span id="more-544"></span></p>
<h3>Etape 1 : Récupérer les sources</h3>
<p>Les sources sont disponibles à partir de la page <a href="http://lucene.apache.org/tika/download.html" target="_blank">http://lucene.apache.org/tika/download.html</a></p>
<p>Décompresser l&#8217;archive dans un répertoire de travail /tmp/tika-0.6</p>
<h3>Etape 2 : Compilation.</h3>
<p>Le moyen le plus simple est d&#8217;utiliser <a href="http://maven.apache.org/" target="_blank">maven 2</a>.</p>
<p>On se place dans le répertoire de travail</p>
<pre style="padding-left: 30px;">cd /tmp/tika-0.6</pre>
<p>On positionne la variable d&#8217;environnement LC_ALL afin de ne pas avoir d&#8217;erreur durant la compilation (l&#8217;astuce) et on alloue par la même occasion suffisamment de mémoire de pour maven</p>
<pre style="padding-left: 30px;">export LC_ALL=en_US.UTF-8
export MAVEN_OPTS="-Xmx2048m"</pre>
<p>On lance la compilation</p>
<pre style="padding-left: 30px;">mvn install</pre>
<p>4 fichiers jar sont générés</p>
<pre style="padding-left: 30px;">find . -name *.jar -print</pre>
<pre style="padding-left: 30px;">./tika-app/target/tika-app-0.6.jar
./tika-bundle/target/tika-bundle-0.6.jar
./tika-core/target/tika-core-0.6.jar
./tika-parsers/target/tika-parsers-0.6.jar</pre>
<p>Pour utiliser Tika dans une application, seules les 2 jars suivants sont indispensables :</p>
<p>./tika-core/target/tika-core-0.6.jar<br />
 ./tika-parsers/target/tika-parsers-0.6.jar</p>
<p>Par contre, tika-parser-0.6.jar requière un certain nombre de librairies tierces. Les récupérer est la troisième étape.</p>
<h3>Etape 3 : Récupération des dépendances</h3>
<p>On se place dans le répertoire des sources de tika-parser</p>
<pre style="padding-left: 30px;">cd tika-parsers</pre>
<p>On demande à maven de récupérer les dépendances</p>
<pre style="padding-left: 30px;">mvn dependency:copy-dependencies</pre>
<p>Les dépendances sont disponibles dans le sous-répertoire target/dependency et il s&#8217;agit de:</p>
<pre style="padding-left: 30px;">./target/dependency/asm-3.1.jar
./target/dependency/commons-compress-1.0.jar
./target/dependency/commons-logging-1.1.1.jar
./target/dependency/dom4j-1.6.1.jar
./target/dependency/fontbox-0.8.0-incubator.jar
./target/dependency/geronimo-stax-api_1.0_spec-1.0.1.jar
./target/dependency/hamcrest-core-1.1.jar
./target/dependency/jempbox-0.8.0-incubator.jar
./target/dependency/junit-3.8.1.jar
./target/dependency/log4j-1.2.14.jar
./target/dependency/metadata-extractor-2.4.0-beta-1.jar
./target/dependency/mockito-core-1.7.jar
./target/dependency/objenesis-1.0.jar
./target/dependency/pdfbox-0.8.0-incubating.jar
./target/dependency/poi-3.6.jar
./target/dependency/poi-ooxml-3.6.jar
./target/dependency/poi-ooxml-schemas-3.6.jar
./target/dependency/poi-scratchpad-3.6.jar
./target/dependency/tagsoup-1.2.jar
./target/dependency/xml-apis-1.0.b2.jar
./target/dependency/xmlbeans-2.3.0.jar</pre>
<p><br class="spacer_" /></p>
<p><br class="spacer_" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.eolya.fr/2010/03/11/tika-06-compilation-et-dependances/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

