Flutter功能未知插件fmatch的潜在使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter功能未知插件fmatch的潜在使用

描述

FMatch 是一个模糊文本匹配引擎,用于实体筛查或人员筛查,例如与BIS实体名单进行对比。

实际上,这只是一个文本匹配引擎,而不是针对拒绝名单的筛查系统。你可能需要将结果与拒绝名单结合起来以实现实际应用。 这是一个具有本地Web API或Dart API的子系统。

特性

  • 使用Levenshtein距离进行模糊术语匹配。
  • 将查询项分段并与单个列表项进行匹配。
  • 模糊查询匹配考虑术语相似性、术语顺序和术语重要性(IDF)。
  • 完美匹配模式禁用模糊匹配,以减少某些情况下的误报。
  • 支持拉丁字符、汉字、片假名字符等。
  • 对传统和简化汉字进行规范化,使匹配不受字符简化的影响。
  • 规范化法律实体类型的拼写变体,如“Limitd”和“Ltd.”,使匹配不受拼写变体的影响。
  • 白名单查询避免筛查自己的公司并减少误报。
  • 结果缓存提高时间性能。
  • Web服务器接受单独查询以供交互式UI使用。
  • Web服务器接受并并行处理批量查询以供批处理应用使用。
  • 提供文本规范化API以供外部较大系统加入拒绝名单的结果。
  • 其他功能。

使用方法

获取公共拒绝名单(可选)

dart bin/fetch_public_lists.dart 

这将从美国政府的综合筛选名单(https://www.trade.gov/consolidated-screening-list)和日本经济产业省外国用户名单(https://www.meti.go.jp/policy/anpo/law05.html#user-list)获取名单。

编译本地Web服务器

dart compile exe -v bin/wserver.dart -o bin/wserver

注意:JIT模式由于某些原因无法工作。参见 dart-lang/sdk#50082。

启动本地Web服务器

bin/wserver

发送查询并接收结果

$ http -b --unsorted ':4049?q=abc'
{
    "serverId": 2,
    "start": "2022-11-10T12:21:22.736901Z",
    "durationInMilliseconds": 16,
    "inputString": "abc",
    "rawQuery": "ABC",
    "cachedResult": {
        "cachedQuery": {
            "letType": "na",
            "terms": [
                "ABC"
            ],
            "perfectMatching": false
        },
        "queryScore": 0.8325604366063432,
        "queryFallenBack": false,
        "matchedEntiries": [
            {
                "entry": "ABC LLC",
                "score": 0.8325604366063432
            },
            {
                "entry": "ABMC THAI SOUTH SUDAN CONSTRUCTION",
                "score": 0.6244203274547574
            },
            {
                "entry": "ABMC THAI-SOUTH SUDAN CONSTRUCTION COMPANY LIMITED",
                "score": 0.6244203274547574
            }
        ]
    },
    "message": ""
}

请记住对查询进行百分比编码。

完美匹配

将整个查询用双引号括起来:

$ http -b --unsorted ':4049?q="abc"'
{
    "serverId": 1,
    "start": "2022-11-11T00:39:16.506794Z",
    "durationInMilliseconds": 2,
    "inputString": "\"abc\"",
    "rawQuery": "ABC",
    "cachedResult": {
        "cachedQuery": {
            "letType": "na",
            "terms": [
                "ABC"
            ],
            "perfectMatching": true
        },
        "queryScore": 1.0,
        "queryFallenBack": false,
        "matchedEntiries": [
            {
                "entry": "ABC LLC",
                "score": 1.0
            }
        ]
    },
    "message": "Cached result"
}

通过JSON发送查询并接收结果

$ http -b --unsorted :4049 'Content-type:application/json; charset=utf-8' '[]=abc' '[]="def"'
[
    {
        "serverId": 2,
        "start": "2022-11-11T00:40:34.971122Z",
        "durationInMilliseconds": 2,
        "inputString": "abc",
        "rawQuery": "ABC",
        "cachedResult": {
            "cachedQuery": {
                "letType": "na",
                "terms": [
                    "ABC"
                ],
                "perfectMatching": false
            },
            "queryScore": 0.8325604366063432,
            "queryFallenBack": false,
            "matchedEntiries": [
                {
                    "entry": "ABC LLC",
                    "score": 0.8325604366063432
                },
                {
                    "entry": "ABMC THAI SOUTH SUDAN CONSTRUCTION",
                    "score": 0.6244203274547574
                },
                {
                    "entry": "ABMC THAI-SOUTH SUDAN CONSTRUCTION COMPANY LIMITED",
                    "score": 0.6244203274547574
                }
            ]
        },
        "message": "Cached result"
    },
    {
        "serverId": 0,
        "start": "2022-11-11T00:40:34.970496Z",
        "durationInMilliseconds": 2,
        "inputString": "\"def\"",
        "rawQuery": "DEF",
        "cachedResult": {
            "cachedQuery": {
                "letType": "na",
                "terms": [
                    "DEF"
                ],
                "perfectMatching": true
            },
            "queryScore": 1.0,
            "queryFallenBack": false,
            "matchedEntiries": [
                {
                    "entry": "SAZEMANE SANAYE DEF",
                    "score": 1.0
                }
            ]
        },
        "message": ""
    }
]

运行示例批量处理

$ ls batch
queries.csv
$ dart bin/batchwb.dart -i batch/queries.csv
 ...
$ ls batch
queries.csv
queries_results.csv

刷新服务器

http :4049/restart

这将使服务器重新加载数据库,重新读取配置和设置,并清除结果缓存。 当拒绝名单更新或配置/设置修改时,这非常有用。

获取规范化文本作为与拒绝名单结合的键

$ http -b ':4049/normalize?q=abc'
"ABC"

这对于准备外部分析系统加入拒绝名单的结果非常有用。

注意,此子系统的输出结果也进行了相同的规范化处理。

许可证

在AGPL-3.0或更高版本下发布。参见 LICENSE 文件。

如果你需要其他不同的许可证,请联系我。


示例代码

import 'dart:convert';

import 'package:fmatch/fmatch.dart';

Future<void> main(List<String> args) async {
  print('Start Batch');
  var matcher = FMatcher();
  await matcher.init();

  var result = await matcher.fmatch('abc');

  final resultJsonObject = result.toJson();
  final jsonEncorder = JsonEncoder.withIndent('  ');
  final resultJsonString = jsonEncorder.convert(resultJsonObject);
  print(resultJsonString);
}

更多关于Flutter功能未知插件fmatch的潜在使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能未知插件fmatch的潜在使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


针对帖子中提到的Flutter功能未知插件 fmatch 的潜在使用,由于 fmatch 并非一个广泛认知或官方支持的Flutter插件,我无法提供确切的文档或官方用例。不过,基于插件名称和一些常见的Flutter插件功能推测,fmatch 可能用于某种匹配或过滤功能。

在没有具体文档的情况下,我将提供一个假设性的代码案例,展示如何在Flutter中创建一个自定义插件或功能,用于字符串匹配或过滤,这可以作为一个关于如何实现类似功能的示例。请注意,这只是一个假设性的实现,并不针对实际的 fmatch 插件。

假设性代码案例:字符串匹配插件

1. 创建Flutter插件项目

首先,你需要创建一个Flutter插件项目。这里假设你已经有一个Flutter项目,并且想要添加一个自定义的本地平台插件。

flutter create --template=plugin fmatch_plugin
cd fmatch_plugin

2. 实现平台特定代码

对于iOS,编辑 ios/Classes/FmatchPlugin.m

#import <Flutter/Flutter.h>

@interface FmatchPlugin : NSObject<FlutterPlugin>
- (BOOL)matchesPattern:(NSString *)string pattern:(NSString *)pattern;
@end

@implementation FmatchPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
    FlutterMethodChannel* channel = [FlutterMethodChannel
                                     methodChannelWithName:@"fmatch_plugin"
                                     binaryMessenger:[registrar messenger]];
    FmatchPlugin* instance = [[FmatchPlugin alloc] init];
    [channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
        if ([call.method isEqualToString:@"matchesPattern"]) {
            NSString *string = call.arguments[@"string"];
            NSString *pattern = call.arguments[@"pattern"];
            BOOL match = [instance matchesPattern:string pattern:pattern];
            result(match);
        } else {
            result(FlutterMethodNotImplemented);
        }
    }];
}

- (BOOL)matchesPattern:(NSString *)string pattern:(NSString *)pattern {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    return [predicate evaluateWithObject:string];
}
@end

对于Android,编辑 android/src/main/kotlin/com/example/fmatch_plugin/FmatchPlugin.kt

package com.example.fmatch_plugin

import android.content.Context
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import java.util.regex.Pattern

class FmatchPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
    private lateinit var channel: MethodChannel
    private var context: Context? = null

    override fun onAttachedToEngine(flutterPluginBinding: FlutterPluginBinding) {
        channel = MethodChannel(flutterPluginBinding.binaryMessenger, "fmatch_plugin")
        channel.setMethodCallHandler(this)
    }

    override fun onMethodCall(call: MethodCall, result: Result) {
        if (call.method == "matchesPattern") {
            val string: String? = call.argument("string")
            val pattern: String? = call.argument("pattern")
            if (string != null && pattern != null) {
                val regex = Pattern.compile(pattern)
                val matcher = regex.matcher(string)
                result.success(matcher.matches())
            } else {
                result.error("INVALID_ARGUMENT", "Invalid arguments passed", null)
            }
        } else {
            result.notImplemented()
        }
    }

    override fun onDetachedFromEngine(binding: FlutterPluginBinding) {
        channel.setMethodCallHandler(null)
    }

    override fun onAttachedToActivity(binding: ActivityPluginBinding) {
        context = binding.activity
    }

    override fun onDetachedFromActivityForConfigChanges() {
        context = null
    }

    override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
        context = binding.activity
    }

    override fun onDetachedFromActivity() {
        context = null
    }
}

3. 在Flutter项目中使用插件

在你的Flutter项目中的 pubspec.yaml 文件中添加对本地插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  fmatch_plugin:
    path: ../fmatch_plugin

然后在你的Dart代码中调用这个插件:

import 'package:flutter/material.dart';
import 'package:fmatch_plugin/fmatch_plugin.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _result = '';

  Future<void> _checkMatch() async {
    String string = 'hello123';
    String pattern = r'hello\d+';
    bool match = await FmatchPlugin.matchesPattern(string, pattern);
    setState(() {
      _result = match ? 'Matched' : 'Not Matched';
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fmatch Plugin Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Pattern Match Result: $_result'),
              ElevatedButton(
                onPressed: _checkMatch,
                child: Text('Check Match'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  • 上述代码仅作为示例,展示如何在Flutter中创建和使用一个自定义的字符串匹配插件。
  • 实际的 fmatch 插件可能有完全不同的功能和实现方式。
  • 在没有具体文档或源代码的情况下,无法提供针对 fmatch 插件的确切使用指南。

如果你确实在使用 fmatch 插件,并且需要具体的帮助,建议查阅该插件的官方文档或源代码,或联系插件的开发者获取支持。

回到顶部