Table des matières
Code pur python pour l'analyse coréenne. Il vise à être une approche d'apprentissage non-MAP qui peut trouver des mots dans les données sans utiliser de données d'apprentissage, démonter des phrases avec des mots ou discriminer des parties de la parole.
WordExtractor ou NounExtractor fourni par SoynP Works à l'aide d'informations statistiques apprises à partir de plusieurs documents. Les approches non basées sur l'apprentissage non MAP extraient des mots en utilisant des modèles statistiques, de sorte qu'ils fonctionnent bien dans le même groupe de documents (documents homogènes) qui sont quelque peu plus grands que dans une phrase ou un document. Il est bon d'apprendre des extracteurs en ne collectant que des documents en utilisant les mêmes mots, tels que des commentaires de films ou des articles de presse de la journée. Les documents de groupes hétérogènes ne sont pas bien extraits lorsqu'ils les collectent ensemble.
Jusqu'à soynlp = 0,0,46, il n'y avait pas de règles dans les noms des paramètres, qui nécessitent la valeur minimale ou maximale, telle que MIN_SCORE, MINMUM_SCORE, L_LEN_MIN. Parmi le code que vous avez travaillé jusqu'à présent, vous pouvez confondre ceux qui ont réglé directement les paramètres, mais nous avons modifié le nom de la variable pour réduire les inconvénients qui se produiront plus tard avant qu'il ne soit plus tard .
Après 0,0,47, le nom de variable qui contient la signification du minimum et du maximum est réduit à Min et Max. Après cela, écrivez un nom pour quel élément est le paramètre de seuil. Unifiez le nom du paramètre avec les modèles suivants: Unifiez le nom avec {min, max} _ {nom, word} _ {score, seuil}. Si l'article est évident, vous pouvez l'omettre.
Le comptage des substances est souvent effectué dans SoynLP. Le paramètre associé à la fréquence est unifié à la pré-étude, pas à compter.
L'index et IDX sont unifiés avec IDX.
Num et n, ce qui signifie les nombres, sont unifiés avec Num.
$ pip install soynlpÀ la suite de diverses tentatives d'extraction de noms, de v1, d'actualités et de V2, trois versions ont été créées. La meilleure performance est V2.
WordExtractor doit apprendre les scores de frontières des mots en utilisant des statistiques et ne pas juger les parties de chaque mot. Parfois, vous devez connaître les parties de chaque mot. De plus, les nouveaux mots sont les plus courants dans les noms que les autres parties de la parole. Sur le côté droit du nom, certaines lettres apparaissent souvent, comme -Silver, -e et -. Si vous regardez la distribution de quelles lettres apparaissent sur le côté droit de la sous-chaîne sur le côté gauche des mots (unité standard basée sur l'espace), vous pouvez déterminer s'il s'agit ou non d'un nom. SoynLP propose deux types d'extracteurs de noms. Il est difficile de dire que quelque chose est meilleur parce que les deux sont au stade de développement, mais NewsnounExtractor contient plus de fonctionnalités. À l'avenir, l'extracteur de nom sera résumé comme une classe.
from soynlp . noun import LRNounExtractor
noun_extractor = LRNounExtractor ()
nouns = noun_extractor . train_extract ( sentences ) # list of str like
from soynlp . noun import NewsNounExtractor
noun_extractor = NewsNounExtractor ()
nouns = noun_extractor . train_extract ( sentences ) # list of str likeCeci est un exemple d'un nom appris de la nouvelle de 2016-10-2020.
덴마크 웃돈 너무너무너무 가락동 매뉴얼 지도교수
전망치 강구 언니들 신산업 기뢰전 노스
할리우드 플라자 불법조업 월스트리트저널 2022년 불허
고씨 어플 1987년 불씨 적기 레스
스퀘어 충당금 건축물 뉴질랜드 사각 하나씩
근대 투자주체별 4위 태권 네트웍스 모바일게임
연동 런칭 만성 손질 제작법 현실화
오해영 심사위원들 단점 부장조리 차관급 게시물
인터폰 원화 단기간 편곡 무산 외국인들
세무조사 석유화학 워킹 원피스 서장 공범
Des explications plus détaillées figurent dans le tutoriel.
Soynlp = 0.0.46+ offre un nom d'extracteur version 2. Il s'agit d'une version qui révise la précision de la version précédente des noms, la capacité de reconnaissance du nom synthétique et l'erreur des informations de sortie. L'utilisation est similaire à la version 1.
from soynlp . utils import DoublespaceLineCorpus
from soynlp . noun import LRNounExtractor_v2
corpus_path = '2016-10-20-news'
sents = DoublespaceLineCorpus ( corpus_path , iter_sent = True )
noun_extractor = LRNounExtractor_v2 ( verbose = True )
nouns = noun_extractor . train_extract ( sents )Les noms extraits sont le format {str: NamedTuple}.
print ( nouns [ '뉴스' ]) # NounScore(frequency=4319, score=1.0)_COMPOUNDS_COMPONENTS stocke les informations à partir de noms uniques qui composent des noms complexes. C'est en fait une forme complexe, comme «Corée» et «Green Growth», mais si elle est utilisée comme un seul nom, il est reconnu comme un seul nom.
list ( noun_extractor . _compounds_components . items ())[: 5 ]
# [('잠수함발사탄도미사일', ('잠수함', '발사', '탄도미사일')),
# ('미사일대응능력위원회', ('미사일', '대응', '능력', '위원회')),
# ('글로벌녹색성장연구소', ('글로벌', '녹색성장', '연구소')),
# ('시카고옵션거래소', ('시카고', '옵션', '거래소')),
# ('대한민국특수임무유공', ('대한민국', '특수', '임무', '유공')),LRGraph stocke la structure LR de l'effacement dans le corpus savant. Vous pouvez vérifier cela à l'aide de get_r et get_l.
noun_extractor . lrgraph . get_r ( '아이오아이' )
# [('', 123),
# ('의', 47),
# ('는', 40),
# ('와', 18),
# ('가', 18),
# ('에', 7),
# ('에게', 6),
# ('까지', 2),
# ('랑', 2),
# ('부터', 1)]Plus de détails sont dans le tutoriel 2.
En octobre 2016, il y a des mots tels que «deux fois» et «Iowa». Cependant, je n'ai jamais vu ces mots ce mot. Parce que de nouveaux mots sont toujours faits, il y a un problème de mots non enregistré (OOV) qui ne reconnaît pas les mots que vous n'avez pas appris. Cependant, si vous lisez plusieurs articles de presse de divertissement écrits pour le moment, vous pouvez voir que des mots tels que «deux fois» et «ioi» apparaissent, et les gens peuvent l'apprendre. Si nous définissons la chaleur du mot continu qui apparaît souvent dans l'ensemble de documents, nous pouvons l'extraire en utilisant des statistiques. Il existe de nombreuses façons d'apprendre des mots (limites) basés sur des statistiques. SoynLP fournit un score de cohésion, une entropie de ramification et une variété d'accessoires.
from soynlp . word import WordExtractor
word_extractor = WordExtractor ( min_frequency = 100 ,
min_cohesion_forward = 0.05 ,
min_right_branching_entropy = 0.0
)
word_extractor . train ( sentences ) # list of str or like
words = word_extractor . extract ()Les mots sont un dict qui contient un nom appelé Scores.
words [ '아이오아이' ]
Scores ( cohesion_forward = 0.30063636035733476 ,
cohesion_backward = 0 ,
left_branching_entropy = 0 ,
right_branching_entropy = 0 ,
left_accessor_variety = 0 ,
right_accessor_variety = 0 ,
leftside_frequency = 270 ,
rightside_frequency = 0
)Ceci est un exemple trié par le score du mot (cohésion * entropie de branchage) appris de l'article de presse de 2016-10-26.
단어 (빈도수, cohesion, branching entropy)
촬영 (2222, 1.000, 1.823)
서울 (25507, 0.657, 2.241)
들어 (3906, 0.534, 2.262)
롯데 (1973, 0.999, 1.542)
한국 (9904, 0.286, 2.729)
북한 (4954, 0.766, 1.729)
투자 (4549, 0.630, 1.889)
떨어 (1453, 0.817, 1.515)
진행 (8123, 0.516, 1.970)
얘기 (1157, 0.970, 1.328)
운영 (4537, 0.592, 1.768)
프로그램 (2738, 0.719, 1.527)
클린턴 (2361, 0.751, 1.420)
뛰어 (927, 0.831, 1.298)
드라마 (2375, 0.609, 1.606)
우리 (7458, 0.470, 1.827)
준비 (1736, 0.639, 1.513)
루이 (1284, 0.743, 1.354)
트럼프 (3565, 0.712, 1.355)
생각 (3963, 0.335, 2.024)
팬들 (999, 0.626, 1.341)
산업 (2203, 0.403, 1.769)
10 (18164, 0.256, 2.210)
확인 (3575, 0.306, 2.016)
필요 (3428, 0.635, 1.279)
문제 (4737, 0.364, 1.808)
혐의 (2357, 0.962, 0.830)
평가 (2749, 0.362, 1.787)
20 (59317, 0.667, 1.171)
스포츠 (3422, 0.428, 1.604)
Plus de détails figurent dans le tutoriel d'extraction des mots. Les fonctions fournies dans la version actuelle sont les suivantes:
Si vous avez appris un score de mot du Wordxtractor, vous pouvez l'utiliser pour décomposer la phrase en une chaleur de mot le long de la limite du mot. Soynlp propose trois chevaliers de couple. Si vous êtes doué pour l'espacement, vous pouvez utiliser Ltokenizer. Je pense que la structure de la langue coréenne est "l + [r]" comme "Noun + Survey".
L Les pièces peuvent être des noms / verbes / adjectifs / adverbes. Si seulement L ne reconnaît que L dans le mot, le reste est R. Ltokenizer entre dans le score du mot de parties en L.
from soynlp . tokenizer import LTokenizer
scores = { '데이' : 0.5 , '데이터' : 0.5 , '데이터마이닝' : 0.5 , '공부' : 0.5 , '공부중' : 0.45 }
tokenizer = LTokenizer ( scores = scores )
sent = '데이터마이닝을 공부한다'
print ( tokenizer . tokenize ( sent , flatten = False ))
#[['데이터마이닝', '을'], ['공부', '중이다']]
print ( tokenizer . tokenize ( sent ))
# ['데이터마이닝', '을', '공부', '중이다']Si vous calculez les scores de mots à l'aide de WordExtractor, vous pouvez créer des scores en choisissant l'un des scores de mots. Ci-dessous n'est le score de la cohésion avant. De plus, divers scores de mots peuvent être définis et utilisés.
from soynlp . word import WordExtractor
from soynlp . utils import DoublespaceLineCorpus
file_path = 'your file path'
corpus = DoublespaceLineCorpus ( file_path , iter_sent = True )
word_extractor = WordExtractor (
min_frequency = 100 , # example
min_cohesion_forward = 0.05 ,
min_right_branching_entropy = 0.0
)
word_extractor . train ( sentences )
words = word_extractor . extract ()
cohesion_score = { word : score . cohesion_forward for word , score in words . items ()}
tokenizer = LTokenizer ( scores = cohesion_score )Vous pouvez également utiliser le score du nom et la cohésion de l'extracteur de nom. Par exemple, si vous souhaitez utiliser le "score de cohésion + score du nom" comme score de mot, vous pouvez travailler comme suit.
from soynlp . noun import LRNounExtractor_2
noun_extractor = LRNounExtractor_v2 ()
nouns = noun_extractor . train_extract ( corpus ) # list of str like
noun_scores = { noun : score . score for noun , score in nouns . items ()}
combined_scores = { noun : score + cohesion_score . get ( noun , 0 )
for noun , score in noun_scores . items ()}
combined_scores . update (
{ subword : cohesion for subword , cohesion in cohesion_score . items ()
if not ( subword in combined_scores )}
)
tokenizer = LTokenizer ( scores = combined_scores )Si l'espacement n'est pas correctement observé, l'unité divisée par l'espacement de la phrase est la structure L + [R]. Cependant, les gens sont remarqués par des mots familiers dans des phrases qui ne sont pas des espaces gardés. MaxsCorEtokeEenizer, qui a déplacé ce processus vers le modèle, utilise également un score de mots.
from soynlp . tokenizer import MaxScoreTokenizer
scores = { '파스' : 0.3 , '파스타' : 0.7 , '좋아요' : 0.2 , '좋아' : 0.5 }
tokenizer = MaxScoreTokenizer ( scores = scores )
print ( tokenizer . tokenize ( '난파스타가좋아요' ))
# ['난', '파스타', '가', '좋아', '요']
print ( tokenizer . tokenize ( '난파스타가 좋아요' , flatten = False ))
# [[('난', 0, 1, 0.0, 1), ('파스타', 1, 4, 0.7, 3), ('가', 4, 5, 0.0, 1)],
# [('좋아', 0, 2, 0.5, 2), ('요', 2, 3, 0.0, 1)]]MaxSCorEtOKIZer utilise également les résultats de Wordxtractor et utilise les scores de manière appropriée comme l'exemple ci-dessus. S'il y a déjà un dictionnaire de mots connu, ces mots donnent une score plus importante que tout autre mot, et le mot est coupé en un mot.
Vous pouvez également faire un mot de chaleur sur la base des règles. Au point où la langue change, nous reconnaissons les limites des mots. Par exemple, "Oh haha ㅜ ㅜ ㅜ ㅜ ㅜ ㅜ ㅜ ㅜ ㅜ?" Les mots sont facilement divisés avec [oh, haha, ㅜㅜ, réel,?].
from soynlp . tokenizer import RegexTokenizer
tokenizer = RegexTokenizer ()
print ( tokenizer . tokenize ( '이렇게연속된문장은잘리지않습니다만' ))
# ['이렇게연속된문장은잘리지않습니다만']
print ( tokenizer . tokenize ( '숫자123이영어abc에섞여있으면ㅋㅋ잘리겠죠' ))
# ['숫자', '123', '이영어', 'abc', '에섞여있으면', 'ㅋㅋ', '잘리겠죠'] Si le mot dictionnaire est bien établi, vous pouvez l'utiliser pour créer un déterminant de la pièce pré-basée -speech. Cependant, parce qu'il ne s'agit pas d'analyser les morphèmes, «do», «da», «et« et »et» et sont tous des verbes. Lemmatizer est actuellement en développement et en organisation.
pos_dict = {
'Adverb' : { '너무' , '매우' },
'Noun' : { '너무너무너무' , '아이오아이' , '아이' , '노래' , '오' , '이' , '고양' },
'Josa' : { '는' , '의' , '이다' , '입니다' , '이' , '이는' , '를' , '라' , '라는' },
'Verb' : { '하는' , '하다' , '하고' },
'Adjective' : { '예쁜' , '예쁘다' },
'Exclamation' : { '우와' }
}
from soynlp . postagger import Dictionary
from soynlp . postagger import LRTemplateMatcher
from soynlp . postagger import LREvaluator
from soynlp . postagger import SimpleTagger
from soynlp . postagger import UnknowLRPostprocessor
dictionary = Dictionary ( pos_dict )
generator = LRTemplateMatcher ( dictionary )
evaluator = LREvaluator ()
postprocessor = UnknowLRPostprocessor ()
tagger = SimpleTagger ( generator , evaluator , postprocessor )
sent = '너무너무너무는아이오아이의노래입니다!!'
print ( tagger . tag ( sent ))
# [('너무너무너무', 'Noun'),
# ('는', 'Josa'),
# ('아이오아이', 'Noun'),
# ('의', 'Josa'),
# ('노래', 'Noun'),
# ('입니다', 'Josa'),
# ('!!', None)]Une utilisation plus détaillée est décrite dans le tutoriel, et les notes du processus de développement sont décrites ici.
Créez le document dans une matrice clairsemée à l'aide du chroneur de couple, ou en utilisant le châtiment du couple appris. Minimum / maximum de la durée de la fréquence de terme / fréquence du document peut être ajusté. Le mode verbeux imprime la situation vectorielle actuelle.
vectorizer = BaseVectorizer (
tokenizer = tokenizer ,
min_tf = 0 ,
max_tf = 10000 ,
min_df = 0 ,
max_df = 1.0 ,
stopwords = None ,
lowercase = True ,
verbose = True
)
corpus . iter_sent = False
x = vectorizer . fit_transform ( corpus )Si le document est grand ou pas immédiatement à l'aide d'une matrice clairsemée, vous pouvez l'enregistrer en tant que fichier sans le mettre sur la mémoire. Fit_to_file () ou to_file () La fonction enregistre le terme vecteur de fréquence pour un document dès que vous l'obtenez. Les paramètres disponibles dans le Vevectizer sont les mêmes.
vectorizer = BaseVectorizer ( min_tf = 1 , tokenizer = tokenizer )
corpus . iter_sent = False
matrix_path = 'YOURS'
vectorizer . fit_to_file ( corpus , matrix_path )Vous pouvez publier un document avec la liste des int au lieu de la matrice clairsemée. À l'heure actuelle, les mots qui ne sont pas appris dans Vectizer.Vocabulary_ ne seront pas encodants.
vectorizer . encode_a_doc_to_bow ( '오늘 뉴스는 이것이 전부다' )
# {3: 1, 258: 1, 428: 1, 1814: 1}La liste des int est possible avec la liste de Str.
vectorizer . decode_from_bow ({ 3 : 1 , 258 : 1 , 428 : 1 , 1814 : 1 })
# {'뉴스': 1, '는': 1, '오늘': 1, '이것이': 1}L'encodage est également disponible avec le sac de mots au format du dict.
vectorizer . encode_a_doc_to_list ( '오늘의 뉴스는 매우 심각합니다' )
# [258, 4, 428, 3, 333]Le sac de mots au format du dict peut être le décodage.
vectorizer . decode_from_list ([ 258 , 4 , 428 , 3 , 333 ])
[ '오늘' , '의' , '뉴스' , '는' , '매우' ]Il offre une fonction pour le résumé des émoticônes répétées dans les données de conversation, les commentaires et pour ne quitter que coréen ou texte.
from soynlp . normalizer import *
emoticon_normalize ( 'ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ쿠ㅜㅜㅜㅜㅜㅜ' , num_repeats = 3 )
# 'ㅋㅋㅋㅜㅜㅜ'
repeat_normalize ( '와하하하하하하하하하핫' , num_repeats = 2 )
# '와하하핫'
only_hangle ( '가나다ㅏㅑㅓㅋㅋ쿠ㅜㅜㅜabcd123!!아핫' )
# '가나다ㅏㅑㅓㅋㅋ쿠ㅜㅜㅜ 아핫'
only_hangle_number ( '가나다ㅏㅑㅓㅋㅋ쿠ㅜㅜㅜabcd123!!아핫' )
# '가나다ㅏㅑㅓㅋㅋ쿠ㅜㅜㅜ 123 아핫'
only_text ( '가나다ㅏㅑㅓㅋㅋ쿠ㅜㅜㅜabcd123!!아핫' )
# '가나다ㅏㅑㅓㅋㅋ쿠ㅜㅜㅜabcd123!!아핫'Des explications plus détaillées figurent dans le tutoriel.
Il offre une fonction pour calculer la matrice de cooccurrence pour l'analyse d'association et les informations mutuelles ponctuelles (PMI).
Vous pouvez créer une matrice à l'aide de la fonction Send_To_Word_Contexts_Matrix ci-dessous (mot, mots de contexte). X est scipy.sparse.csr_matrix, (n_vocabs, n_vocabs). Idx2Vocab est une liste de STR qui contient des mots correspondant à chaque ligne, colonne de x. Reconnaissez les mots des fenêtres avant et arrière comme un contexte de phrase et calculez uniquement les mots qui apparaissent comme la fréquence de min_tf ou plus. Dynamic_weight est pondéré inversement proportionnel à la longueur du contexte. Si les fenêtres sont 3, la cooccurrence de 1, 2 et 3 carrés est calculée comme 1, 2/3, 1/3.
from soynlp . vectorizer import sent_to_word_contexts_matrix
x , idx2vocab = sent_to_word_contexts_matrix (
corpus ,
windows = 3 ,
min_tf = 10 ,
tokenizer = tokenizer , # (default) lambda x:x.split(),
dynamic_weight = False ,
verbose = True
)Si vous entrez X, qui est une matrice de cooccurrence, dans PMI, PMI est calculé par chaque axe de ligne et de colonne. PMI_DOK est le format scipy.sparse.dok_matrix. Seule la valeur de min_pmi est stockée, et la valeur par défaut est min_pmi = 0, donc positif PMI (ppmi). Alpha est une entrée de paramètre de lissage à PMI (x, y) = p (x, y) / (p (p) * (p) + alpha). Le processus de calcul prend beaucoup de temps, alors définissez-le sur Verbose = VRAI pour sortir la progression actuelle.
from soynlp . word import pmi
pmi_dok = pmi (
x ,
min_pmi = 0 ,
alpha = 0.0001 ,
verbose = True
)Des explications plus détaillées figurent dans le tutoriel.
Il fournit des fonctions pour purifier les données de chevaux Sejong pour l'apprentissage du modèle de traitement du langage naturel. Il fournit une fonction qui crée un type de données d'apprentissage purifiées sous la forme de morphème et de parole, une fonction qui fait un tableau et fait une table, et une fonction qui simplifie les parties et le système de parole de Sejong Malm.
S'il y a une erreur d'espacement, il peut être facile d'analyser le texte en le supprimant. En fonction des données que vous souhaitez analyser, apprenez le moteur d'espacement et utilisez-les pour corriger l'erreur d'espacement.
Sans avoir à apprendre un couple de couple ou un extracteur de mots, vous pouvez extraire des mots clés à partir du graphique de substring à l'aide de l'algorithme Hits.
Extracteur de mots clés. Il propose deux types d'extracteurs de mots clés, en utilisant des modèles et des modèles basés sur les statistiques en utilisant la régression logistique. Il prend en charge le format matriciel clairsemé et le format de fichier texte dans scipy.sparse.