8.11 明示的セマンティック分析
oml.esa
クラスは、ドキュメントのコーパスからテキストベースの特徴を抽出し、ドキュメントの類似度比較を実行します。
明示的セマンティック分析(ESA)は、特徴抽出のための教師なしアルゴリズムです。ESAは、潜在的な特徴は検出しませんが、既存のナレッジ・ベースに基づく明示的特徴を使用します。
明示的ナレッジは、多くの場合テキスト・フォームで存在します。複数のナレッジ・ベースを、テキスト・ドキュメントのコレクションとして使用できます。これらのナレッジ・ベースは、Wikipediaなど一般的なものでもドメイン固有のものでもかまいません。データ準備は、テキストを、属性と概念の関連性を取得するベクターに変換します。
ESAでは、特異値分解やLatent Dirichlet Allocationなどの潜在的セマンティック分析手法により導出される潜在特徴ではなく、既存のナレッジ・ベースの概念が特徴として使用されます。たとえば、トレーニング・データ内のドキュメントの各行が特徴、つまり概念にマップされます。ESAには、テキスト処理、最も顕著な意味的関連性(類似度)および明示的トピック・モデリングの分野の複数のアプリケーションがあります。テキスト類似度のユースケースには、履歴書の照合、類似するブログ投稿の検索などが含まれる場合があります。
oml.esa
クラスの属性およびメソッドの詳細は、help(oml.esa)
を呼び出すか、Oracle Machine Learning for Python APIリファレンスを参照してください。
明示的セマンティック分析モデルの設定
次の表は、ESAモデルの設定のリストです。
表8-9 明示的セマンティック分析の設定
設定名 | 設定値 | 説明 |
---|---|---|
|
負でない数値 |
入力行に必要なゼロ以外のエントリの最小数を決定します。デフォルト値はテキスト入力の場合は100、テキスト以外の入力の場合は0です。 |
|
正の整数 |
属性ごとの特徴の最大数を制御します。デフォルト値は |
|
負でない数値 |
変換されたビルド・データの属性の重みに対してしきい値を小さい値に設定します。デフォルト値は |
FEAT_NUM_FEATURES |
|
抽出する特徴の数。 デフォルト値は、アルゴリズムによって概算されます。マトリックスのランクがこの数よりも小さい場合、返される特徴は少なくなります。 |
関連項目:
例8-11 oml.esaクラスの使用方法
この例では、ESAモデルを作成し、oml.esa
クラスのメソッドの一部を使用します。
import oml
from oml import cursor
import pandas as pd
# Create training data and test data.
dat = oml.push(pd.DataFrame(
{'COMMENTS':['Aids in Africa: Planning for a long war',
'Mars rover maneuvers for rim shot',
'Mars express confirms presence of water at Mars south pole',
'NASA announces major Mars rover finding',
'Drug access, Asia threat in focus at AIDS summit',
'NASA Mars Odyssey THEMIS image: typical crater',
'Road blocks for Aids'],
'YEAR':['2017', '2018', '2017', '2017', '2018', '2018', '2018'],
'ID':[1,2,3,4,5,6,7]})).split(ratio=(0.7,0.3), seed = 1234)
train_dat = dat[0]
test_dat = dat[1]
# Specify settings.
cur = cursor()
cur.execute("Begin ctx_ddl.create_policy('DMDEMO_ESA_POLICY'); End;")
cur.close()
odm_settings = {'odms_text_policy_name': 'DMDEMO_ESA_POLICY',
'"ODMS_TEXT_MIN_DOCUMENTS"': 1,
'"ESAS_MIN_ITEMS"': 1}
ctx_settings = {'COMMENTS':
'TEXT(POLICY_NAME:DMDEMO_ESA_POLICY)(TOKEN_TYPE:STEM)'}
# Create an oml ESA model object.
esa_mod = oml.esa(**odm_settings)
# Fit the ESA model according to the training data and parameter settings.
esa_mod = esa_mod.fit(train_dat, case_id = 'ID',
ctx_settings = ctx_settings)
# Show model details.
esa_mod
# Use the model to make predictions on test data.
esa_mod.predict(test_dat,
supplemental_cols = test_dat[:, ['ID', 'COMMENTS']])
esa_mod.transform(test_dat,
supplemental_cols = test_dat[:, ['ID', 'COMMENTS']],
topN = 2).sort_values(by = ['ID'])
esa_mod.feature_compare(test_dat,
compare_cols = 'COMMENTS',
supplemental_cols = ['ID'])
esa_mod.feature_compare(test_dat,
compare_cols = ['COMMENTS', 'YEAR'],
supplemental_cols = ['ID'])
# Change the setting parameter and refit the model.
new_setting = {'ESAS_VALUE_THRESHOLD': '0.01',
'ODMS_TEXT_MAX_FEATURES': '2',
'ESAS_TOPN_FEATURES': '2'}
esa_mod.set_params(**new_setting).fit(train_dat, 'ID', case_id = 'ID',
ctx_settings = ctx_settings)
cur = cursor()
cur.execute("Begin ctx_ddl.drop_policy('DMDEMO_ESA_POLICY'); End;")
cur.close()
この例のリスト
>>> import oml
>>> from oml import cursor
>>> import pandas as pd
>>>
>>> # Create training data and test data.
... dat = oml.push(pd.DataFrame(
... {'COMMENTS':['Aids in Africa: Planning for a long war',
... 'Mars rover maneuvers for rim shot',
... 'Mars express confirms presence of water at Mars south pole',
... 'NASA announces major Mars rover finding',
... 'Drug access, Asia threat in focus at AIDS summit',
... 'NASA Mars Odyssey THEMIS image: typical crater',
... 'Road blocks for Aids'],
... 'YEAR':['2017', '2018', '2017', '2017', '2018', '2018', '2018'],
... 'ID':[1,2,3,4,5,6,7]})).split(ratio=(0.7,0.3), seed = 1234)
>>> train_dat = dat[0]
>>> test_dat = dat[1]
>>>
>>> # Specify settings.
... cur = cursor()
>>> cur.execute("Begin ctx_ddl.create_policy('DMDEMO_ESA_POLICY'); End;")
>>> cur.close()
>>>
>>> odm_settings = {'odms_text_policy_name': 'DMDEMO_ESA_POLICY',
... '"ODMS_TEXT_MIN_DOCUMENTS"': 1,
... '"ESAS_MIN_ITEMS"': 1}
>>>
>>> ctx_settings = {'COMMENTS':
... 'TEXT(POLICY_NAME:DMDEMO_ESA_POLICY)(TOKEN_TYPE:STEM)'}
>>>
>>> # Create an oml ESA model object.
... esa_mod = oml.esa(**odm_settings)
>>>
>>> # Fit the ESA model according to the training data and parameter settings.
... esa_mod = esa_mod.fit(train_dat, case_id = 'ID',
... ctx_settings = ctx_settings)
>>>
>>> # Show model details.
... esa_mod
Algorithm Name: Explicit Semantic Analysis
Mining Function: FEATURE_EXTRACTION
Settings:
setting name setting value
0 ALGO_NAME ALGO_EXPLICIT_SEMANTIC_ANALYS
1 ESAS_MIN_ITEMS 1
2 ESAS_TOPN_FEATURES 1000
3 ESAS_VALUE_THRESHOLD .00000001
4 ODMS_DETAILS ODMS_ENABLE
5 ODMS_MISSING_VALUE_TREATMENT ODMS_MISSING_VALUE_AUTO
6 ODMS_SAMPLING ODMS_SAMPLING_DISABLE
7 ODMS_TEXT_MAX_FEATURES 300000
8 ODMS_TEXT_MIN_DOCUMENTS 1
9 ODMS_TEXT_POLICY_NAME DMDEMO_ESA_POLICY
10 PREP_AUTO ON
Global Statistics:
attribute name attribute value
0 NUM_ROWS 4
Attributes:
COMMENTS
YEAR
Partition: NO
Features:
FEATURE_ID ATTRIBUTE_NAME ATTRIBUTE_VALUE COEFFICIENT
0 1 COMMENTS.AFRICA None 0.342997
1 1 COMMENTS.AIDS None 0.171499
2 1 COMMENTS.LONG None 0.342997
3 1 COMMENTS.PLANNING None 0.342997
... ... ... ... ...
24 6 COMMENTS.ODYSSEY None 0.282843
25 6 COMMENTS.THEMIS None 0.282843
26 6 COMMENTS.TYPICAL None 0.282843
27 6 YEAR 2018 0.707107
>>> # Use the model to make predictions on test data.
... esa_mod.predict(test_dat,
... supplemental_cols = test_dat[:, ['ID', 'COMMENTS']])
ID COMMENTS FEATURE_ID
0 4 NASA announces major Mars rover finding 3
1 6 NASA Mars Odyssey THEMIS image: typical crater 2
2 7 Road blocks for Aids 5
>>>
>>> esa_mod.transform(test_dat,
... supplemental_cols = test_dat[:, ['ID', 'COMMENTS']],
... topN = 2).sort_values(by = ['ID'])
COMMENTS TOP_1 TOP_1_VAL \
0 4 NASA announces major Mars rover finding 3 0.647065
1 6 NASA Mars Odyssey THEMIS image: typical crater 2 0.766237
2 7 Road blocks for Aids 5 0.759125
TOP_2 TOP_2_VAL
0 1 0.590565
1 2 0.616672
2 2 0.632604
>>>
>>> esa_mod.feature_compare(test_dat,
compare_cols = 'COMMENTS',
supplemental_cols = ['ID'])
ID_A ID_B SIMILARITY
0 4 6 0.946469
1 4 7 0.871994
2 6 7 0.954565
>>> esa_mod.feature_compare(test_dat,
... compare_cols = ['COMMENTS', 'YEAR'],
... supplemental_cols = ['ID'])
ID_A ID_B SIMILARITY
0 4 6 0.467644
1 4 7 0.377144
2 6 7 O.952857
>>> # Change the setting parameter and refit the model.
... new_setting = {'ESAS_VALUE_THRESHOLD': '0.01',
... 'ODMS_TEXT_MAX_FEATURES': '2',
... 'ESAS_TOPN_FEATURES': '2'}
>>> esa_mod.set_params(**new_setting).fit(train_dat, case_id = 'ID',
... ctx_settings = ctx_settings)
Algorithm Name: Explicit Semantic Analysis
Mining Function: FEATURE_EXTRACTION
Settings:
setting name setting value
0 ALGO_NAME ALGO_EXPLICIT_SEMANTIC_ANALYS
1 ESAS_MIN_ITEMS 1
2 ESAS_TOPN_FEATURES 2
3 ESAS_VALUE_THRESHOLD 0.01
4 ODMS_DETAILS ODMS_ENABLE
5 ODMS_MISSING_VALUE_TREATMENT ODMS_MISSING_VALUE_AUTO
6 ODMS_SAMPLING ODMS_SAMPLING_DISABLE
7 ODMS_TEXT_MAX_FEATURES 2
8 ODMS_TEXT_MIN_DOCUMENTS 1
9 ODMS_TEXT_POLICY_NAME DMDEMO_ESA_POLICY
10 PREP_AUTO ON
Global Statistics:
attribute name attribute value
0 NUM_ROWS 4
Attributes:
COMMENTS
YEAR
Partition: NO
Features:
FEATURE_ID ATTRIBUTE_NAME ATTRIBUTE_VALUE COEFFICIENT
0 1 COMMENTS.AIDS None 0.707107
1 1 YEAR 2017 0.707107
2 2 COMMENTS.MARS None 0.707107
3 2 YEAR 2018 0.707107
4 3 COMMENTS.MARS None 0.707107
5 3 YEAR 2017 0.707107
6 5 COMMENTS.AIDS None 0.707107
7 5 YEAR 2018 0.707107
>>>
>>> cur = cursor()
>>> cur.execute("Begin ctx_ddl.drop_policy('DMDEMO_ESA_POLICY'); End;")
>>> cur.close()