目次
韓国分析のための純粋なPythonコード。学習データを使用せずにデータに単語を見つけることができ、単語で文章を分解したり、スピーチの部分を差別せずにデータに単語を見つけることができる非マップ学習アプローチであることを目指しています。
soynlpによって提供されるwordextractorまたはnounextractorは、複数のドキュメントから学習した統計情報を使用して動作します。非マップ学習ベースのアプローチは、統計パターンを使用して単語を抽出するため、1つの文またはドキュメントよりもやや大きい同じドキュメント(均質なドキュメント)のグループでうまく機能します。映画のコメントやその日のニュース記事など、同じ単語を使用してドキュメントのみを収集することで、抽出者を学ぶのは良いことです。不均一なグループの文書は、それらを一緒に収集するときによく抽出されません。
Soynlp = 0.0.46まで、min_score、minimol_score、l_len_minなどの最小値または最大値を必要とするパラメーターの名前にルールはありませんでした。これまでに作業してきたコードの中で、パラメーターを直接設定している人を混乱させることができますが、変数の名前を変更して、後で前に発生する不便を減らすことができました。
0.0.47以降、最小値と最大値の意味を含む変数名はMinとMaxに減少します。その後、どのアイテムがしきい値パラメーターであるかの名前を書きます。次のパターンでパラメーター名を統合します。{min、max} _ {noun、word} _ {score、threshold}で名前を統合します。アイテムが明らかな場合は、省略できます。
サブストリングカウントは、多くの場合、soynlpで行われます。周波数に関連付けられたパラメーターは、カウントされず、前足で統一されています。
インデックスとIDXはIDXで統一されています。
数字を意味するnumとnは、numで統一されています。
$ pip install soynlp名詞を抽出しようとするさまざまな試みの結果、V1、ニュース、およびV2 3つのバージョンが作成されました。最高のパフォーマンスはV2です。
wordextractorは、統計を使用して単語の境界スコアを学習し、各単語の部分を判断しないことです。時々、各単語のパーティーを知る必要があります。さらに、新しい単語は、言語の他の部分よりも名詞で最も一般的です。名詞の右側には、-silver、-e、および - など、特定の文字がよく表示されます。単語の左側のサブストリングの右側(空間ベースの標準単位)の右側に表示される文字の分布を見ると、名詞であるかどうかを判断できます。 SOYNLPは、2種類の名詞抽出器を提供しています。両方が開発段階にあるので、何かが良いと言うのは難しいですが、NewsNounounextractorにはより多くの機能が含まれています。将来、名詞抽出器は1つのクラスとして要約されます。
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 likeこれは、2016-10-20のニュースから学んだ名詞の例です。
덴마크 웃돈 너무너무너무 가락동 매뉴얼 지도교수
전망치 강구 언니들 신산업 기뢰전 노스
할리우드 플라자 불법조업 월스트리트저널 2022년 불허
고씨 어플 1987년 불씨 적기 레스
스퀘어 충당금 건축물 뉴질랜드 사각 하나씩
근대 투자주체별 4위 태권 네트웍스 모바일게임
연동 런칭 만성 손질 제작법 현실화
오해영 심사위원들 단점 부장조리 차관급 게시물
인터폰 원화 단기간 편곡 무산 외국인들
세무조사 석유화학 워킹 원피스 서장 공범
より詳細な説明はチュートリアルにあります。
SOYNLP = 0.0.46+は名詞抽出器バージョン2を提供します。これは、名詞の以前のバージョンの精度、合成名詞認識能力、および出力情報の誤差を修正するバージョンです。使用法はバージョン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 )抽出された名詞は{str:namedtuple}形式です。
print ( nouns [ '뉴스' ]) # NounScore(frequency=4319, score=1.0)_compounds_components複雑な名詞を構成する単一の名詞から情報を保存します。実際には、「韓国」や「緑の成長」などの複雑な形ですが、単一の名詞として使用すると、単一の名詞として認識されます。
list ( noun_extractor . _compounds_components . items ())[: 5 ]
# [('잠수함발사탄도미사일', ('잠수함', '발사', '탄도미사일')),
# ('미사일대응능력위원회', ('미사일', '대응', '능력', '위원회')),
# ('글로벌녹색성장연구소', ('글로벌', '녹색성장', '연구소')),
# ('시카고옵션거래소', ('시카고', '옵션', '거래소')),
# ('대한민국특수임무유공', ('대한민국', '특수', '임무', '유공')),Lrgraphは、学習したコーパスに消去のLR構造を保存します。 get_rとget_lを使用してこれを確認できます。
noun_extractor . lrgraph . get_r ( '아이오아이' )
# [('', 123),
# ('의', 47),
# ('는', 40),
# ('와', 18),
# ('가', 18),
# ('에', 7),
# ('에게', 6),
# ('까지', 2),
# ('랑', 2),
# ('부터', 1)]詳細については、チュートリアル2を参照してください。
2016年10月には、「2回」や「アイオワ」などの言葉があります。しかし、私はこの言葉を見たことがありません。新しい単語は常に作られているため、学んだことのない単語を認識していない未登録の単語問題(OOV)があります。ただし、現時点で書かれたいくつかのエンターテイメントニュース記事を読むと、「2回」や「IOI」などの単語が表示され、人々がそれを学ぶことができることがわかります。ドキュメントセットに頻繁に表示される連続単語の熱を定義する場合、統計を使用して抽出することができます。統計に基づいて単語(境界)を学ぶ方法はたくさんあります。 SOYNLPは、結束スコア、分岐エントロピー、およびアクセサの多様性を提供します。
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 ()単語は、スコアと呼ばれる名前の付いたdictです。
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
)これは、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)
詳細については、抽出チュートリアルという単語をご覧ください。現在のバージョンで提供される関数は次のとおりです。
WordXtractorから単語スコアを学んだ場合、それを使用して、単語の境界に沿った単語の熱に文を分解することができます。 Soynlpは3つのトルクナイトを提供しています。間隔が得意な場合は、Ltokenizerを使用できます。韓国語の構造は「l + [r]」のような「noun + survey」のようなものだと思います。
L部品は名詞/動詞/形容詞/副詞である場合があります。 Lのみが単語のLのみを認識している場合、残りはR部品です。 Ltokenizerは、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 ))
# ['데이터마이닝', '을', '공부', '중이다']WordExtractorを使用して単語スコアを計算すると、単語スコアの1つを選択することでスコアを作成できます。以下は、前方結束のスコアのみです。さらに、さまざまな単語スコアを定義および使用できます。
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 )名詞抽出器の名詞スコアと凝集を使用することもできます。たとえば、「Cohesion Score + Nounスコア」を単語スコアとして使用する場合は、次のように作業できます。
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 )間隔が適切に観察されていない場合、単位を文の間隔基準で割ったものをl + [r]構造に分けます。しかし、人々は、空間を保持していない文の馴染みのある言葉から気づかれます。このプロセスをモデルに移動したMaxScoretokeEnizerは、単語スコアも使用します。
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)]]MaxScoretokenizerは、WordXtractorの結果も使用し、上記の例のようにスコアを適切に使用します。すでに既知の単語辞書がある場合、これらの単語は他のどの単語よりも大きなスコアを与え、単語は1つの単語にカットされます。
ルールに基づいて単語の熱を作ることもできます。言語が変わるポイントでは、単語の境界を認識します。たとえば、「ああ、ハハㅜㅜ?本当に?」単語は[ああ、ハハ、ㅜㅜ、リアル?]で簡単に分割されます。
from soynlp . tokenizer import RegexTokenizer
tokenizer = RegexTokenizer ()
print ( tokenizer . tokenize ( '이렇게연속된문장은잘리지않습니다만' ))
# ['이렇게연속된문장은잘리지않습니다만']
print ( tokenizer . tokenize ( '숫자123이영어abc에섞여있으면ㅋㅋ잘리겠죠' ))
# ['숫자', '123', '이영어', 'abc', '에섞여있으면', 'ㅋㅋ', '잘리겠죠'] 辞書という単語が十分に確立されている場合は、それを使用して、事前にベースのパーツ-of -sepeech決定要因を作成できます。ただし、「do」、 'da'、 'and' and 'and'はすべて動詞を分析することではないためです。 Lemmatizerは現在、開発および組織化されています。
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)]より詳細な使用法については、チュートリアルで説明し、開発プロセスのメモについて説明します。
トルクナイターを使用して、または学習したトルクナイターを使用して、ドキュメントをスパースマトリックスに作成します。期間の最小 /最大期間頻度 /ドキュメント頻度を調整できます。冗長モードは、現在のベクトル状の状況を印刷します。
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 )ドキュメントがスパースマトリックスをすぐに使用している場合、またはすぐに使用しない場合は、メモリに置かずにファイルとして保存できます。 FIT_TO_FILE()またはto_file()関数は、1つのドキュメントの周波数ベクトルを取得するとすぐに記録します。 Basevectorizerで利用可能なパラメーターは同じです。
vectorizer = BaseVectorizer ( min_tf = 1 , tokenizer = tokenizer )
corpus . iter_sent = False
matrix_path = 'YOURS'
vectorizer . fit_to_file ( corpus , matrix_path )スパースマトリックスの代わりに、intのリストを使用して1つのドキュメントを出力できます。現時点では、vectorizer.vocabulary_で学習されていない単語はエンコードされません。
vectorizer . encode_a_doc_to_bow ( '오늘 뉴스는 이것이 전부다' )
# {3: 1, 258: 1, 428: 1, 1814: 1}intのリストは、strのリストで可能です。
vectorizer . decode_from_bow ({ 3 : 1 , 258 : 1 , 428 : 1 , 1814 : 1 })
# {'뉴스': 1, '는': 1, '오늘': 1, '이것이': 1}Encodingは、Dict形式の単語の袋でも利用できます。
vectorizer . encode_a_doc_to_list ( '오늘의 뉴스는 매우 심각합니다' )
# [258, 4, 428, 3, 333]DICT形式の単語のバッグはデコードできます。
vectorizer . decode_from_list ([ 258 , 4 , 428 , 3 , 333 ])
[ '오늘' , '의' , '뉴스' , '는' , '매우' ]会話データ、コメントで繰り返される絵文字の要約のための関数を提供し、韓国語またはテキストのみを離れるようにします。
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!!아핫'より詳細な説明はチュートリアルにあります。
関連分析とポイントごとの相互情報(PMI)のための共起マトリックスを計算するための関数を提供します。
以下のsent_to_word_contexts_matrix関数を使用してマトリックスを作成できます(word、context words)。 xはscipy.sparse.csr_matrix、(n_vocabs、n_vocabs)サイズです。 idx2vocabは、xの各行に対応する単語を含むstrのリストです。フロントとリアウィンドウの単語を文のコンテキストとして認識し、min_tf以上の頻度として表示される単語のみを計算します。 dynamic_weightは、コンテキストの長さに反比例する重みです。 Windowsが3の場合、1、2、および3の正方形の共起が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
)共起行列であるXを入力すると、PMIでPMIは行と列の各軸によって計算されます。 PMI_DOKはscipy.sparse.dok_matrix形式です。 min_pmiの値のみが保存され、デフォルトはmin_pmi = 0であるため、正のpmi(ppmi)です。アルファは、PMI(x、y)= p(x、y) /(p(p) *(p) + alpha)へのpmi(x、y)= p(x、y) /(alpha)への平滑化パラメーター入力です。計算プロセスには長い時間がかかるため、現在の進行状況を出力するために冗長=真に設定します。
from soynlp . word import pmi
pmi_dok = pmi (
x ,
min_pmi = 0 ,
alpha = 0.0001 ,
verbose = True
)より詳細な説明はチュートリアルにあります。
自然言語処理モデルの学習のためのセジョン馬データを浄化するための機能を提供します。モーフェムと音声の形で精製されたタイプの学習データ、テーブルを作成してテーブルを作成する関数、およびセジョンマルムの部分と音声システムを簡素化する関数を作成する関数を提供します。
間隔エラーがある場合、テキストを削除して簡単に分析することができます。分析するデータに基づいて、間隔エンジンを学習し、それを使用して間隔エラーを修正します。
トルクナイカーや単語抽出器を学習せずに、ヒットアルゴリズムを使用してサブストリンググラフからキーワードを抽出できます。
キーワード抽出器。モデルとロジスティック回帰を使用した統計ベースのモデルを使用して、2種類のキーワード抽出器を提供します。 Scipy.sparseのスパースマトリックス形式とテキストファイル形式をサポートします。