Ces dernières années, le développement de la technologie de traitement du langage naturel a été remarquable et son application est encouragée dans divers domaines. Je fais souvent un travail qui utilise la technologie de traitement du langage naturel et l'IA, mais le travail le plus gênant (mais important) est lié à divers prétraitements.
Certains des principaux prétraitements que vous effectuerez pour la plupart des tâches comprennent:
J'utilise principalement Python, mais je n'avais pas de bibliothèque appropriée pour les ** sauts de phrase japonais **, donc j'ai fini par écrire du code similaire à chaque fois. Je suis sûr qu'il y a environ 100 personnes dans le monde qui ont des problèmes similaires, j'ai donc décidé d'écrire ma propre bibliothèque et de la publier en tant que OSS, mais c'était au début de 2019. Il était temps. Cependant, je n'ai pas pu obtenir suffisamment de temps et de motivation, et cela a été retardé, mais j'ai finalement pu commencer par fixer la limite d'écriture d'articles sur le calendrier de l'Avent.
Je pense que les éléments suivants sont plus couramment utilisés comme de simples délimiteurs de phrases.
Cependant, il existe de nombreux documents réels qui ne peuvent pas être bien séparés par les règles simples ci-dessus.
Par exemple, «J'ai répondu:« Oui, c'est vrai ». Si vous séparez simplement le texte comme `par ponctuation, il sera divisé comme suit:
Je pense qu'il y a de bonnes situations, mais j'ai répondu: "Oui, c'est vrai." Vous voudrez peut-être le traiter comme une phrase, `.
Par exemple, vous pouvez avoir une pause au milieu d'une phrase comme indiqué ci-dessous car elle ne tient pas sur un seul écran (en particulier pour les documents d'une entreprise).
Dans le traitement du langage naturel, ~ omis ~
Il est couramment utilisé.
Si cela est séparé par un saut de ligne, il sera divisé en deux phrases, mais dans le traitement du langage naturel, il est courant d'utiliser ~ omis ~. Vous pouvez le séparer en une seule phrase, `.
Dans l'exemple ci-dessus, si vous supprimez les sauts de ligne, puis que vous les séparez par des signes de ponctuation, vous pouvez faire quelque chose, mais ** contient des phrases qui n'ont pas de signes de ponctuation **, ce qui le rend beaucoup plus gênant. (~~ Veuillez ajouter quelques signes de ponctuation ... ~~)
>>J'avais l'intention d'aller au salon de coiffure demain, mais "pressé
>>Modifiez l'horaire. Par conséquent, de la réunion
>>Permettez-moi de changer le programme. ".
J'ai reconnu.
Cas où il y a des symboles inutiles au début des lignes et des sauts de ligne au milieu d'une phrase. Il existe une théorie selon laquelle il s'agit du cas le plus courant dans les documents d'entreprise (subjectif). L'approche la plus simple consiste à supprimer d'abord les symboles et les sauts de ligne, puis à les traiter. Cependant, il est rare que vous souhaitiez les combiner tout en supprimant les symboles inutiles et en laissant l'information qu'ils sont un bloc de guillemets.
GiNZA GiNZA est une bibliothèque qui peut être utilisée pour séparer des phrases japonaises en Python. Les sauts de phrase à l'aide de GiNZA peuvent être effectués comme suit.
import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('On m'a dit: "Je ne peux pas répondre à vos pensées. Je veux que vous frappiez les autres." Étourdi\n Je n'avais pas d'autre choix que de rester là, mais je veux toujours y croire!')
for sent in doc.sents:
print(sent)
J'ai dit: "Je ne peux pas répondre à vos pensées.
Je veux que tu frappes l'autre.
"Ils ont dit!
J'étais abasourdi et n'avais pas d'autre choix que de rester là
Je veux toujours croire!
L'avantage de l'utilisation de GiNZA est qu'il peut détecter les sauts de phrase avec une grande précision même s'il y a un saut de ligne au milieu d'une phrase ou si un signe de ponctuation est omis car l'analyse des dépendances est effectuée correctement. .. Bien que ce soit une classe lourde, je pense que c'est une bonne option si vous utilisez également d'autres fonctions de GiNZA.
sentence-splitter C'est un outil créé par Node.js, mais il y a aussi sentence-splitter.
echo -e "Il a dit: "Je ne peux pas répondre à vos pensées. Je veux que vous frappiez les autres." Étourdi\n Je n'avais pas d'autre choix que de rester là, mais je veux toujours y croire!" | sentence-splitter
Sentence 0:On m'a dit: "Je ne peux pas répondre à vos pensées. Je veux que vous frappiez les autres."
Sentence 1:Étourdi
Je n'avais pas d'autre choix que de rester là, mais je veux toujours y croire!
Cet outil utilise également l'analyseur utilisé à l'intérieur de textlint pour une analyse avancée, il est donc précis même s'il y a une pause au milieu de la phrase. Il est divisé haut. De plus, il est intéressant que j'aime la manipulation de "" etc. et que les performances de traitement soient assez rapides. (Si ce n'était pas Node.js, je l'aurais adopté)
Pragmatic Segmenter Bien qu'il s'agisse d'une bibliothèque Ruby, il existe un Pragmatic Segmenter. Il s'agit d'une bibliothèque de délimiteurs de phrases basée sur des règles, et son principal avantage est qu'elle prend en charge ** plusieurs langues **. Il est également attrayant car il n'effectue pas d'analyse compliquée et est rapide à traiter.
Puisque les règles de saut de phrase japonaises sont proches de mon goût, le but de cet outil de développement est "de pouvoir casser des phrases japonaises égales ou meilleures que le Segmenteur Pragmatique".
Une démo en direct (https://www.tm-town.com/natural-language-processing) est disponible pour cet outil, et les résultats que j'ai essayés là-bas sont indiqués ci-dessous.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wrapper>
<s>On m'a dit: "Je ne peux pas répondre à vos pensées. Je veux que vous frappiez les autres."</s>
<s>Étourdi</s>
<s>Je n'avais pas d'autre choix que de rester là, mais je veux toujours y croire!</s>
</wrapper>
Au fait, un portage Python de ce Segmenteur Pragmatique a été développé sous le nom de pySBD. Malheureusement, il semble que les règles pour le japonais n'aient pas encore été portées.
Donc, la bibliothèque que j'ai créée cette fois est ouverte au public à ↓. https://github.com/wwwcojp/ja_sentence_segmenter
En créant la bibliothèque, je l'ai développée avec les objectifs suivants.
Il s'agit de Publish to PyPI, vous pouvez donc facilement l'installer avec pip. Il prend en charge Python 3.6 et supérieur, et il n'y a pas de bibliothèques dépendantes jusqu'à présent.
$ pip install ja-sentence-segmenter
import functools
from ja_sentence_segmenter.common.pipeline import make_pipeline
from ja_sentence_segmenter.concatenate.simple_concatenator import concatenate_matching
from ja_sentence_segmenter.normalize.neologd_normalizer import normalize
from ja_sentence_segmenter.split.simple_splitter import split_newline, split_punctuation
split_punc2 = functools.partial(split_punctuation, punctuations=r"。!?")
concat_tail_te = functools.partial(concatenate_matching, former_matching_rule=r"^(?P<result>.+)(main)$", remove_former_matched=False)
segmenter = make_pipeline(normalize, split_newline, concat_tail_te, split_punc2)
text1 = """
On m'a dit: "Je ne peux pas répondre à vos pensées. Je veux que vous frappiez les autres." Étourdi
Je n'avais pas d'autre choix que de rester là, mais je veux toujours y croire!
"""
print(list(segmenter(text1)))
['On m'a dit: "Je ne peux pas répondre à vos pensées. Je veux que vous frappiez les autres."!', 'J'étais abasourdi et je n'avais pas d'autre choix que de rester là, mais je veux toujours croire!']
import functools
from ja_sentence_segmenter.common.pipeline import make_pipeline
from ja_sentence_segmenter.concatenate.simple_concatenator import concatenate_matching
from ja_sentence_segmenter.normalize.neologd_normalizer import normalize
from ja_sentence_segmenter.split.simple_splitter import split_newline, split_punctuation
split_punc2 = functools.partial(split_punctuation, punctuations=r"。!?")
concat_mail_quote = functools.partial(concatenate_matching,
former_matching_rule=r"^(\s*[>]+\s*)(?P<result>.+)$",
latter_matching_rule=r"^(\s*[>]+\s*)(?P<result>.+)$",
remove_former_matched=False,
remove_latter_matched=True)
segmenter = make_pipeline(normalize, split_newline, concat_mail_quote, split_punc2)
text2 = """
>>J'avais l'intention d'aller au salon de coiffure demain, mais "pressé
>>Modifiez l'horaire. Par conséquent, de la réunion
>>Permettez-moi de changer le programme. ".
J'ai reconnu.
"""
print(list(segmenter(text2)))
['>>J'avais l'intention d'aller au salon de coiffure demain, mais il a dit: "Je vais changer mon horaire rapidement. S'il vous plaît laissez-moi changer le calendrier de la réunion."', 'J'ai reconnu.']
Je suis presque épuisé, je terminerai donc en exposant les prochains numéros.
~~ Pourquoi avez-vous fait une chose aussi sobre dans l'article du Calendrier de l'Avent ... ~~
Recommended Posts