2009-10-22 6 views
16

Je voudrais que la recherche en texte intégral de MySQL fonctionne avec du texte japonais et chinois, ainsi qu'avec n'importe quelle autre langue. Le problème est que ces langues et probablement d'autres n'ont normalement pas d'espace entre les mots. La recherche n'est pas utile lorsque vous devez taper la même phrase que dans le texte.Rupture de mot dans les langues sans espaces entre les mots (par exemple, asiatique)?

Je ne peux pas simplement mettre un espace entre chaque caractère car l'anglais doit aussi fonctionner. Je voudrais résoudre ce problème avec PHP ou MySQL. Puis-je configurer MySQL pour reconnaître les caractères qui devraient être leurs propres unités d'indexation? Existe-t-il un module PHP capable de reconnaître ces caractères afin que je puisse juste les entourer d'espaces pour l'index?

Mise à jour

Une solution partielle:

$string_with_spaces = 
    preg_replace("/[".json_decode('"\u4e00"')."-".json_decode('"\uface"')."]/", 
    " $0 ", $string_without_spaces); 

Cela fait une classe de caractères à partir d'au moins quelques-uns des personnages que je dois traiter spécialement. Je devrais probablement mentionner, il est acceptable de munge le texte indexé.

Est-ce que quelqu'un connaît toutes les plages de caractères dont j'ai besoin pour insérer des espaces autour?

De plus, il doit y avoir une meilleure manière portable de représenter ces caractères en PHP? Le code source dans Unicode littéral n'est pas idéal. Je ne reconnaîtrai pas tous les personnages; ils ne peuvent pas rendre sur toutes les machines que je dois utiliser.

+3

Les autres langues modernes qui n'utilisent pas d'espaces entre les mots sont Thai, Lao, Khmer (Cambodge), et la Birmanie (Myanmar). En vietnamien, il existe un problème connexe: les espaces sont utilisés entre toutes les syllabes sauf pour les mots étrangers. – hippietrail

Répondre

15

mot rupture pour les langues mentionnées nécessitent une approche linguistique , par exemple celui qui utilise un dictionnaire avec une compréhension de base découlant des règles. J'ai entendu parler d'applications de recherche en texte intégral relativement réussies qui divisaient simplement chaque caractère en un mot distinct, en chinois, en appliquant simplement la même "tokenisation" des critères de recherche fournis par les utilisateurs finaux. Le moteur de recherche fournit alors un meilleur classement pour les documents qui fournissent les mots-caractères dans le même ordre que les critères de recherche. Je ne suis pas sûr que cela puisse être étendu à la langue comme le japonais, car les jeux de caractères Hirakana et Katagana rendent le texte plus proche des langues européennes avec un alphabet court.

EDIT:
Ressources
Ce mot problème de rupture, ainsi que des questions connexes, est si non trivial que des livres entiers sont écrits à ce sujet. Voir par exemple CJKV Information Processing (CJKV signifie chinois, japonais, coréen et vietnamien, vous pouvez également utiliser le mot-clé CJK, car dans de nombreux textes, le vietnamien n'est pas abordé). Voir aussi Word Breaking in Japanese is hard pour un one-pager sur ce sujet. De manière compréhensible, la majorité du matériel couvrant ce sujet est écrit dans l'une des langues natives sous-jacentes, et est donc d'une utilisation limitée pour les personnes sans une maîtrise relative de ces langues. Pour cette raison, et aussi pour vous aider à valider le moteur de recherche une fois que vous commencez à implémenter la logique de disjoncteur de mots, vous devriez demander l'aide d'un locuteur natif ou deux.

Diverses idées
Votre idée de caractères identifiant qui implique systématiquement un mot briser (disons guillemets, entre parenthèses, des personnages comme trait d'union et tels) est bon et qui est probablement l'une heuristique utilisée par certains des disjoncteurs de mot de qualité professionnelle. Pourtant, vous devriez chercher une source faisant autorité pour une telle liste, plutôt que d'en assembler une de toutes pièces, basée sur des résultats anecdotiques.
Une idée connexe est de briser les mots au Kana-à-Kanji transitions (mais je devine pas l'inverse), et peut-être à transitions Hiragana-à-Katakana ou vice-versa.
Sans lien avec la rupture de mot proprement dite, l'index peut [-ou ne peut pas ;-)] bénéficier de la conversion systématique de chaque caractère, disons, hiragana au caractère katakana correspondant. Juste une idée sans instruction! Je ne connais pas assez la langue japonaise pour savoir si cela aiderait; intuitivement, cela s'apparenterait vaguement à la conversion systématique de lettres accentuées et autres à la lettre non accentuée correspondante, telle qu'elle est pratiquée avec plusieurs langues européennes. Peut-être que l'idée que j'ai mentionnée plus haut, d'indexer systématiquement les caractères individuels (et de classer les résultats de recherche en fonction de leur proximité avec les critères de recherche) peut être légèrement modifiée, par exemple en conservant des caractères kana consécutifs. et puis d'autres règles ... et produisent un moteur de recherche imparfait mais pratique. Ne soyez pas déçu si ce n'est pas le cas ... Comme indiqué, c'est loin d'être trivial, et cela peut vous faire économiser du temps et de l'argent, à long terme, en faisant une pause et en lisant un livre ou deux. Une autre raison pour essayer d'en apprendre davantage sur la « théorie » et les meilleures pratiques, est que pour le moment, vous semblez être concentré sur mot rupture mais bientôt, le moteur de recherche peut également bénéficier de provenant de conscience ; En effet, ces deux questions sont, au moins sur le plan linguistique, liées et pourraient bénéficier d'un traitement en tandem.

Bonne chance pour ce vexant mais digne effort.

+0

Il est totalement acceptable pour moi de séparer les mots composés. J'ai juste besoin de savoir quand scinder des symboles. Voir ma prochaine mise à jour pour une solution partielle. –

+0

Pardonnez-moi. Je voulais aussi dire merci pour votre temps. :) –

+0

@ Joe: Vous êtes les bienvenus. Il se trouve que je m'intéresse à la linguistique et à la PNL, mais très, très, très peu de connaissances spécifiques aux langues CJK. Lisez ma modification car j'ai ajouté quelques mots-clés et références en ligne qui pourraient vous aider dans votre quête.Bonne chance :-) – mjv

1

Un an plus tard, et vous n'avez probablement pas besoin de ce plus, mais le code sur la page suivante pourriez avoir quelques conseils pour ce que vous voulez (ndlr) à faire:

http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/spamfilter/japanese-tokenizer.el.txt

Si vous fait des progrès après les messages ci-dessus dans votre propre recherche, je suis sûr que d'autres seraient intéressés à savoir.

(sous la direction de dire qu'il ya une meilleure réponse ici: How to classify Japanese characters as either kanji or kana?)

+1

Il s'est avéré que la reconnaissance de la plage de caractères dans l'exemple de la mise à jour de ma question a résolu le problème dans tous les cas qui sont survenus jusqu'à présent. Au moins, notre petit nombre d'utilisateurs à qui cela compte a été satisfait. –

+0

J'attends avec impatience le jour où cette solution ne suffira plus et je pourrai résoudre le problème de façon plus complète et plus intéressante. –

+0

Merci pour votre temps. –

Questions connexes