MGeoマルチタスク・マルチモーダル・アドレス・プレトレーニング・ベース中国語ベース

この記事は約21分で読めます。

バージョン要求 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バージョン# 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マシンでインスタンスを実行し、ノートブックを作成して推論またはトレーニングコードを実行します。 最初の起動時には、インデックスを作成するため時間がかかる場合があります。

使用中に何か困難が生じた場合は、钉钉で検索し、質問応答グループに参加してください。グループ番号:44837352(公式質問応答)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モデルと現在のいくつかの主流プリトレーニングモデルの効果を評価しました。モデルサイズはすべてベースです。

門戸住所要素解析 地理エンティティアライメント 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、興味ポイント)検索は、マップアプリケーションのコア機能であり、ユーザーのクエリに応じてマップ上のPOIを見つける必要があります。POIの構成は通常、対応する住所の説明と緯度経度による説明です

住所クエリ成分分析 ユーザーは地図サービスで住所クエリを入力して、関連する地理要素情報を検索します。住所クエリは標準的な住所情報を含みますが、通常以下も含んでいます:

公共交通機関、地下鉄駅、路線情報; ブランド、ショッピングモール名; 修飾情報例如:24時間、安価; 語彙的な接続詞例如:助詞、疑問詞、接続詞、転換詞、需要詞、近接詞、数量詞。標準的な住所に比べて、住所クエリは表現が豊かで、情報量が大きいです。このタスクでは、住所クエリの成分分析を行う必要があります。 MGeoでトレーニングされたモデルは1クリックで使用でき、詳細はModelCardを参照してください:トレーニングされた住所クエリ成分分析モデルを試してみる

WhereWhat分割 1つの住所が複数の場所を記述する場合、通常それを分割し、元の住所をwhereとwhatの2部分に分けます。例えば:三里屯バーでは、この記述には2つの部分が含まれています:三里屯、バー。ユーザーの意図は三里屯近くのバーを探しだすことです。そのため、元の住所の「三里屯」をwhere部分、「バー」をwhat部分と識別する必要があります。このタスクの目標は、入力された住所をwhereとwhatに分割し、識別することです。 MGeoでトレーニングされたモデルは1クリックで使用でき、詳細はModelCardを参照してください:トレーニングされたWhereWhat分割モデルを試してみる

直接推論 MGeoを使用して、入力された住所を直接エンコードします。

python 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の門戸住所要素解析タスクを例にします。

python 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_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として保存することができます:

```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)を試してみませんか?

タイトルとURLをコピーしました