バージョン要件
ModelScopeのバージョンは1.2.0以上が必要です。
推奨インストール方法
GPUバージョン
conda create -n py37testmaas python=3.7
pip install cryptography==3.4.8 tensorflow-gpu==1.15.5 torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0
pip install "modelscope[nlp]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
CPUバージョン
conda create -n py37testmaas python=3.7
pip install cryptography==3.4.8 tensorflow==1.15.5 torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0
pip install "modelscope[nlp]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
インストール不要での使用
右上にある「体験」ボタンをクリックし、CPUまたはGPUマシンでインスタンスを実行し、notebookを作成して推論またはトレーニングコードを実行します。 初回起動時は、インデックスを作成するため時間がかかります。
使用中に何か困難が生じた場合は、钉钉で検索し、Q&Aグループに参加してください。グループ番号:44837352(公式Q&A)26735013283(技術交流)
住所情報処理とは
住所情報処理とは、住所に関するテキストの自動掘り出し、理解、関連付けを行なう技術です。この技術は、社会のあらゆる場面で幅広く応用されています。例えば、私たちがよく使う地図アプリでは、多くの住所情報処理技術を使用してPOIライブラリを構築し、POIの検索と推薦を実現しています。フードデリバリーや物流業界では、住所の解析や正確な位置指定の向上は、直接運送コストの大幅な削減にもつながります。現在では、車を動かす、コールアウト、アラームなど多くの場面でも、住所の自動処理技術が採用されており、オペレーターが事故発生地を特定するのにかかる時間を大幅に節約しています。小売業でも、住所は会員システム管理の核心的な要素です。応用シーン
MGeo多目的多モーダル住所事前トレーニングベース
住所はその豊かな表現とマップと連動する多モーダル属性のため、常に自動処理の難問と言えます。ダモアカデミーはアリババと共同で、多目的多モーダル住所事前トレーニングベースのMGeoモデルを発表しました。このモデルはマップ-テキストの多モーダルアーキテクチャに基づいており、多目的事前トレーニング(MOMETAS)技術を用いて、注意対抗事前トレーニング(ASA)、文対事前トレーニング(MaSTS)、多モーダル事前トレーニングを融合させ、多種の住所タスクに適した事前トレーニングベースをトレーニングし、ダウンストリームの広範な住所処理タスクの性能向上に貢献しています。
MOMETAS:複数の事前トレーニング目標を動的に融合し、より汎用的な事前トレーニングベースを得る技術で、EMNLP2022(論文リンク)に発表されました。 ASA:事前トレーニング時の自己注意を対抗的攻撃トレーニングし、局所情報への過剰な注意を避けます。技術はAAAI2023(論文リンク)に発表されました。 MaSTS:文対之间的关系を捉えるのに適した事前トレーニング技術で、CLUE語義マッチングのトップを独占し、汎用版モデルはすでにオープンソース化(モデルリンク)されています。 マップ-テキスト多モーダル事前トレーニング:業界初のマップのモデル表示とマップ-テキストのクロスモーダル融合を実装しました(論文リンク)。 ModelScopeでは、オープンソースの住所データおよびオープンソースマップのOpenStreetMapを使用してトレーニングされたMGeo事前トレーニングベースとそのGeoGLUE地理語義評価ボードの複数のタスクのダウンストリームモデルをオープンソース化しています。
MGeoモデル構造
住所情報処理には多くのNLPタスクが含まれており、入力の形태から分けると以下のように分けられます。
文単体タスク:入力は1つの住所です。 文対タスク:入力は2つの住所です。 多モーダルタスク:入力は住所およびマップです。 私たちはこの3つの入力形態に対処するために、3つの事前トレーニングタスクを設計しました:注意対抗事前トレーニング(ASA)、文対事前トレーニング(MaSTS)、多モーダル事前トレーニング。そして、多目的事前トレーニング(MOMETAS)技術を用いて、これらの3つの事前トレーニングタスクを動的に組み合わせ、多種の住所タスクに適した事前トレーニングベースをトレーニングしました。
モデル構造
モデル効果 私たちはインターネットで公開されている地理語義データとオープンソースマップを使用して、MGeoコミュニティ版をトレーニングし、GeoGLUEでMGeoモデルと現在のいくつかの主流的事前トレーニングモデルの効果を評価しました。モデルのサイズはすべてbaseです。
住所要素解析 地理エンティティアライメント Query-POIライブラリリコール Query-POI関連性ソート 住所Query成分分析 WhereWhat分割 Bert 90.41 78.88 24.59 81.52 65.06 69.65 Roberta 90.79 78.84 39.37 83.20 64.65 66.44 Ernie 90.63 79.44 24.03 81.82 66.48 67.73 Nezha 91.17 79.77 35.31 81.38 67.70 70.13 StructBert 91.22 78.83 43.10 83.51 67.47 68.74 MGeoコミュニティ版 92.39 79.99 54.18 86.09 70.19 79.55 直接にMGeoの訓練済みのダウンストリームモデルを使用して推論を行う 住所処理技術コミュニティの発展を促進するために、一般的な住所処理タスクを精製し、地理語義理解能力評価基準GeoGLUEを確立しました。私たちはMGeoベースをGeoGLUEで提供されるタスクデータセットでトレーニングし、上記のモデル効果を参照のトレーニング効果を確認しました。トレーニング済みのモデルは現在、1クリックでお試しいただけます。
住所要素解析
一般的な住所は、郵便物やフードデリバリーサービスでのユーザーの位置を表すために使用されており、通常、以下のいくつかの情報を含むことがあります。
行政区分情報、例えば省、市、郡、町の情報; 道路網情報、例えば路名、路番号、道路施設など; 詳細な地理情報、例えばPOI(興味ポイント)、建物番号、部屋番号など; 非地理情報、例えば補足説明、誤入力など; このタスクでは、住所を独立した意味の要素に分割し、これらの要素をタイプ別に識別する必要があります。 MGeoでトレーニングされたモデルは1クリックで使用できます。詳細についてはModelCardを参照してください:トレーニング済みの住所要素解析モデルを試してください。
地理エンティティアライメント 日常生活で入力される地理テキストは以下のいくつかの形態をとることができます。
4つの行政区分と路名、路番号、POIを含む標準的な地理テキスト; 要素が欠落した標準的な地理テキスト、例えば路名+路番号のみ、POIのみ; 非標準的な地理テキスト、話し言葉の地理情報の説明、例えばアリシシシ园区の東門脇の親オレンジです; すべての地理テキストの表現は、現実世界の道路、村、POIなどのエンティティにマッピングできます。地理エンティティアライメントタスクは、2つの地理テキストが同じ地理エンティティを指しているかどうかを判断する必要があります。このタスクは、地理情報知識ベースを構築するコア技術です。
MGeoでトレーニングされたモデルは1クリックで使用できます。詳細についてはModelCardを参照してください:トレーニング済みの地理エンティティアライメントモデルを試してください。
Query-POI関連性ソート
POI(Point Of Interest、興味ポイント)検索は、マップアプリケーションのコア機能であり、ユーザーのqueryに基づいて対応するマップ上のPOIを見つける必要があります。POIは通常、対応する住所の説明と緯度経度での説明から構成されます。このタスクでは、与えられたユーザーqueryと候補POIリストに基づいて、POIとqueryの関連性を元にPOIをソートする必要があります。 MGeoでトレーニングされたモデルは1クリックで使用できます。詳細についてはModelCardを参照してください:トレーニング済みのQuery-POI関連性ソートを試してください。
住所Query成分分析
ユーザーはマップサービスで住所queryを入力して、関連する地理要素情報を検索します。住所queryは標準的な住所情報だけでなく、通常以下も含みます。
公共交通機関、地下鉄駅、路線情報; ブランド、商業エリア名; 修飾情報:24時間、安い; 語義接続詞:助詞、疑問詞、接続詞、転折詞、需要詞、近接詞、数量詞。 標準的な住所と比較して、住所queryの表現はより豊かで、情報量が大きいです。このタスクでは、住所queryを成分別に分析する必要があります。 MGeoでトレーニングされたモデルは1クリックで使用できます。詳細についてはModelCardを参照してください:トレーニング済みの住所Query成分分析モデルを試してください。
WhereWhat分割
1つの住所が複数の場所の説明を含んでいる場合、通常それを分割し、元の住所をwhereとwhatの2部分に切り分けます。例えば:サンリトンバー「この説明は2つの部分を含んでいます:サンリトン、バー。ユーザーの意図はサンリトンの近くのバーを探しることです。そのため、元の住所の「サンリトン」をwhere部分、「バー」をwhat部分と識別する必要があります。このタスクの目標は、入力された住所をwhereとwhatで分割し、識別することです。 MGeoでトレーニングされたモデルは1クリックで使用できます。詳細についてはModelCardを参照してください:トレーニング済みのWhereWhat分割モデルを試してください。
直接推論
MGeoを使用して、入力された住所を直接エンコードします。
from modelscope.models import Model
from modelscope.utils.constant import Tasks
from modelscope.preprocessors.nlp import Tokenize
model_id = 'damo/mgeo_backbone_chinese_base'
model = Model.from_pretrained(model_id, task=Tasks.backbone)
tokenizer = Tokenize.from_pretrained(model_id)
text = '文一西路'
output = tokenizer(text, return_tensors='pt')
enc_res = model(**output)
print(enc_res)
カスタムトレーニング ユーザーが独自に標付けしたデータを持っている場合、MGeoベースでトレーニングすることができます。私たちは、シーケンスラベル付け、分類、ソートの3つのタスクのサンプルコードを提供しています。
シーケンスラベル付け GeoGLUEの住所要素解析タスクを例にしています。
import os
from modelscope.msdatasets import MsDataset
from modelscope.metainfo import Trainers, Preprocessors
from modelscope.utils.constant import ModelFile, Tasks
from modelscope.trainers import build_trainer
tmp_dir = 'tmp_dir'
def finetune(model_id,
train_dataset,
eval_dataset,
name=Trainers.nlp_text_ranking_trainer,
cfg_modify_fn=None,
**kwargs):
kwargs = dict(
model=model_id,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
work_dir=tmp_dir,
cfg_modify_fn=cfg_modify_fn,
**kwargs)
os.environ['LOCAL_RANK'] = '0'
trainer = build_trainer(name=name, default_args=kwargs)
trainer.train()
results_files = os.listdir(tmp_dir)
def cfg_modify_fn(cfg):
cfg.task = 'token-classification'
cfg['dataset'] = {
'train': {
'labels': label_enumerate_values,
'first_sequence': 'tokens',
'label': 'ner_tags',
'sequence_length': 128
}
}
cfg['preprocessor'] = {
'type': 'token-cls-tokenizer',
'padding': 'max_length'
}
cfg.train.max_epochs = 1
cfg.train.dataloader.batch_size_per_gpu = 32
cfg.train.optimizer.lr = 3e-5
cfg.train.hooks = [
{
'type': 'CheckpointHook',
'interval': 1
},
{
'type': 'TextLoggerHook',
'interval': 100
}, {
'type': 'IterTimerHook'
}, {
'type': 'EvaluationHook',
'by_epoch': True
}]
cfg.train.lr_scheduler.total_iters = int(len(train_dataset) / 32) * cfg.train.max_epochs
return cfg
def get_label_list(labels):
unique_labels = set()
for label in labels:
unique_labels = unique_labels | set(label)
label_list = list(unique_labels)
label_list.sort()
return label_list
# load dataset
train_dataset = MsDataset.load('GeoGLUE', subset_name='GeoETA', split='train', namespace='damo')
dev_dataset = MsDataset.load('GeoGLUE', subset_name='GeoETA', split='validation', namespace='damo')
label_enumerate_values = get_label_list(train_dataset._hf_ds['train']['ner_tags'] + dev_dataset._hf_ds['validation']['ner_tags'])
model_id = 'damo/mgeo_backbone_chinese_base'
finetune(
model_id=model_id,
train_dataset=train_dataset['train'],
eval_dataset=dev_dataset['validation'],
cfg_modify_fn=cfg_modify_fn,
name='nlp-base-trainer')
output_dir = os.path.join(tmp_dir, ModelFile.TRAIN_OUTPUT_DIR)
print(f'model is saved to {output_dir}')
もしローカルからユーザー独自のデータを読み込む必要がある場合は、データを以下の形式に加工して、train.jsonおよびdev.jsonとして保存します。
{"tokens": ["浙", "江", "杭", "州", "市", "江", "干", "区", "九", "堡", "镇", "三", "村", "村", "一", "区"], "ner_tags": ["B-prov", "E-prov", "B-city", "I-city", "E-city", "B-district", "I-district", "E-district", "B-town", "I-town", "E-town", "B-community", "I-community", "E-community", "B-poi", "E-poi"]}
その後、元の流れのtrain_datasetおよびdev_datasetを以下のように置き換えます。
local_train = 'train.json'
local_test = 'dev.json'
train_dataset = MsDataset.load('json', data_files={'train': [local_train]})
dev_dataset = MsDataset.load('json', data_files={'validation': [local_test]})
分類タスク GeoGLUEの地理エンティティアライメントタスクを例にしています。
import os
from modelscope.msdatasets import MsDataset
from modelscope.metainfo import Trainers, Preprocessors
from modelscope.utils.constant import ModelFile, Tasks
from modelscope.trainers import build_trainer
tmp_dir = 'tmp_dir'
def finetune(model_id,
train_dataset,
eval_dataset,
name=Trainers.nlp_text_ranking_trainer,
cfg_modify_fn=None,
**kwargs):
kwargs = dict(
model=model_id,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
work_dir=tmp_dir,
cfg_modify_fn=cfg_modify_fn,
**kwargs)
os.environ['LOCAL_RANK'] = '0'
trainer = build_trainer(name=name, default_args=kwargs)
trainer.train()
results_files = os.listdir(tmp_dir)
def cfg_modify_fn(cfg):
cfg.task = Tasks.sentence_similarity
cfg['preprocessor'] = {'type': Preprocessors.sen_sim_tokenizer}
cfg.train.dataloader.batch_size_per_gpu = 64
cfg.evaluation.dataloader.batch_size_per_gpu = 64
cfg.train.optimizer.lr = 2e-5
cfg.train.max_epochs = 1
cfg['dataset'] = {
'train': {
'labels': ['not_match', 'partial_match', 'exact_match'],
'first_sequence': 'sentence1',
'second_sequence': 'sentence2',
'label': 'label',
'sequence_length': 128
}
}
cfg['evaluation']['metrics'] = "seq-cls-metric"
cfg.train.hooks = [
{
'type': 'CheckpointHook',
'interval': 1
},
{
'type': 'TextLoggerHook',
'interval': 100
}, {
'type': 'IterTimerHook'
}, {
'type': 'EvaluationHook',
'by_epoch': True
}]
cfg.train.lr_scheduler.total_iters = int(len(train_dataset) / 32) * cfg.train.max_epochs
return cfg
# load dataset
train_dataset = MsDataset.load('GeoGLUE', subset_name='GeoEAG', split='train',
namespace='damo')
dev_dataset = MsDataset.load('GeoGLUE', subset_name='GeoEAG', split='validation', namespace='damo')
model_id = 'damo/mgeo_backbone_chinese_base'
finetune(
model_id=model_id,
train_dataset=train_dataset['train'],
eval_dataset=dev_dataset['validation'],
cfg_modify_fn=cfg_modify_fn,
name='nlp-base-trainer')
output_dir = os.path.join(tmp_dir, ModelFile.TRAIN_OUTPUT_DIR)
print(f'model is saved to {output_dir}')
もしローカルからユーザー独自のデータを読み込む必要がある場合は、データを以下の形式に加工して、train.jsonおよびdev.jsonとして保存します。
{"sentence1": "兰花小区四小区五幢五单元", "sentence2": "乌兰小区四区5栋乌兰小区4区5栋", "label": "not_match"}
sentence2フィールドがない場合は、そのフィールドを削除してください。元のコードのlabelsフィールドを新しいデータセットのラベルに更新してください:
cfg['dataset'] = {
'train': {
'labels': ['not_match', 'partial_match', 'exact_match'],
'first_sequence': 'sentence1',
'second_sequence': 'sentence2',
'label': 'label',
'sequence_length': 128
}
}
その後、元の流れのtrain_datasetおよびdev_datasetを以下のように置き換えます。
local_train = 'train.json'
local_test = 'dev.json'
train_dataset = MsDataset.load('json', data_files={'train': [local_train]})
dev_dataset = MsDataset.load('json', data_files={'validation': [local_test]})
ソーティングタスク GeoGLUEのQuery-POIソーティングタスクを例にしています。
import os
from modelscope.msdatasets import MsDataset
from modelscope.metainfo import Trainers, Preprocessors
from modelscope.utils.constant import ModelFile, Tasks
from modelscope.trainers import build_trainer
tmp_dir = 'tmp_dir'
def finetune(model_id,
train_dataset,
eval_dataset,
name=Trainers.nlp_text_ranking_trainer,
cfg_modify_fn=None,
**kwargs):
kwargs = dict(
model=model_id,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
work_dir=tmp_dir,
cfg_modify_fn=cfg_modify_fn,
**kwargs)
os.environ['LOCAL_RANK'] = '0'
trainer = build_trainer(name=name, default_args=kwargs)
trainer.train()
results_files = os.listdir(tmp_dir)
def cfg_modify_fn(cfg):
neg_sample = 19
cfg.task = 'text-ranking'
cfg['preprocessor'] = {'type': 'mgeo-ranking'}
cfg.train.optimizer.lr = 5e-5
cfg['dataset'] = {
'train': {
'type': 'mgeo',
'query_sequence': 'query',
'pos_sequence': 'positive_passages',
'neg_sequence': 'negative_passages',
'text_fileds': ['text', 'gis'],
'qid_field': 'query_id',
'neg_sample': neg_sample,
'sequence_length': 64
},
'val': {
'type': 'mgeo',
'query_sequence': 'query',
'pos_sequence': 'positive_passages',
'neg_sequence': 'negative_passages',
'text_fileds': ['text', 'gis'],
'qid_field': 'query_id'
},
}
cfg.evaluation.dataloader.batch_size_per_gpu = 16
cfg.train.dataloader.batch_size_per_gpu = 3
cfg.train.dataloader.workers_per_gpu = 16
cfg.evaluation.dataloader.workers_per_gpu = 16
cfg['evaluation']['metrics'] = "mrr@1"
cfg.train.max_epochs = 1
cfg.model['neg_sample'] = neg_sample
cfg.model['gis_num'] = 2
cfg.model['finetune_mode'] = 'multi-modal'
cfg.train.hooks = [{
'type': 'CheckpointHook',
'interval': 1
}, {
'type': 'TextLoggerHook',
'interval': 100
}, {
'type': 'IterTimerHook'
}, {
'type': 'EvaluationHook',
'by_epoch': True
}]
# lr_schedulerの設定
cfg.train.lr_scheduler = {
"type": "LinearLR",
"start_factor": 1.0,
"end_factor": 0.5,
"total_iters": int(len(train_ds) / cfg.train.dataloader.batch_size_per_gpu) * cfg.train.max_epochs,
"options": {
"warmup": {
"type": "LinearWarmup",
"warmup_iters": int(len(train_ds) / cfg.train.dataloader.batch_size_per_gpu)
},
"by_epoch": False
}
}
return cfg
# load dataset
train_dataset = MsDataset.load('GeoGLUE', subset_name='GeoTES-rerank', split='train', namespace='damo')
dev_dataset = MsDataset.load('GeoGLUE', subset_name='GeoTES-rerank', split='validation', namespace='damo')
train_ds = train_dataset['train']
dev_ds = dev_dataset['validation']
model_id = 'damo/mgeo_backbone_chinese_base'
finetune(
model_id=model_id,
train_dataset=train_ds,
eval_dataset=dev_ds,
cfg_modify_fn=cfg_modify_fn,
name=Trainers.mgeo_ranking_trainer)
output_dir = os.path.join(tmp_dir, ModelFile.TRAIN_OUTPUT_DIR)
print(f'model is saved to {output_dir}')
もしローカルからユーザー独自のデータを読み込む必要がある場合は、データを以下の形式に加工して、train.jsonおよびdev.jsonとして保存します。
{"query_id": 0, "query": "丽华公寓(通惠中路)向北检验检疫科学研究所", "query_gis": "[[], [], [], [], [], "120.59443087451544,30.315515932852602"]", "idx": "0", "positive_passages": [{"text": "杭州中新街(惠港二路)76饶平县检验检疫局", "gis": "[[], [], [], [], [], "120.20509044775532,30.076259797983873"]"}], "negative_passages": [{"text": "杭州中新街", "gis": "[[], [], [], [], [], "120.20509044775532,30.076259797983873"]"}]}
例のgis情報が欠損している場合は、ユーザーが独自のgis情報を追加することができます。モデルはgis情報の有无にかかわらず推論を行うことができますが、gis情報の追加はモデルの性能を向上させます。元のコードのneg_sampleの数量をカスタムトレーニングセットのネガティブ例の数に更新してください。
その後、元の流れのtrain_dsおよびdev_dsを以下のように置き換えます。
local_train = 'train.json'
local_test = 'dev.json'
train_dataset = MsDataset.load('json', data_files={'train': [local_train]})
dev_dataset = MsDataset.load('json', data_files={'validation': [local_test]})
train_ds = train_dataset.to_hf_dataset()
dev_ds = dev_dataset.to_hf_dataset()
ドルフィンAIは言語学習アプリケーションのためのプロフェッショナルな発音評価API(pronunciation assessment api)ソリューションを提供します。音素、単語、文章、チャプター、発音矯正、単語矯正、クイズ、フリーダイアログ、多肢選択問題など幅広く提供しています。当社の発音評価製品(pronunciation assessment)は、英語と中国語、クラウドAPI、オンプレミス、オフラインデバイスの展開をサポートしています。当社の発音評価API(pronunciation assessment api)は、正確性、流暢性、完全性、リズムの次元をカバーする豊富な評価指標を提供し、音素、単語、文の異なるレベルの評価スコアも提供します。また、音素、単語、文の異なるレベルでの評価スコアも提供します。数千万人のユーザーに安定した効率的で安全なサービスを提供しています。ドルフィンAIの発音評価製品(pronunciation assessment)を試してみませんか?