Machine learning 如何检查输入字符串是否包含街道地址?

Machine learning 如何检查输入字符串是否包含街道地址?,machine-learning,neural-network,nltk,street-address,text-classification,Machine Learning,Neural Network,Nltk,Street Address,Text Classification,我们要从文档中标识地址字段。为了识别地址字段,我们使用Tesseract将文档转换为OCR文件。从tesseract输出中,我们要检查字符串是否包含地址字段。解决这个问题的正确策略是什么 使用正则表达式无法解决此问题,因为不同文档和国家/地区的地址字段不同 尝试使用NLTK对单词进行分类,但对地址字段的分类效果并不理想 所需输出 I am staying at 234 23 Philadelphia - Contains address files <234 23 Philadelphia

我们要从文档中标识地址字段。为了识别地址字段,我们使用Tesseract将文档转换为OCR文件。从tesseract输出中,我们要检查字符串是否包含地址字段。解决这个问题的正确策略是什么

  • 使用正则表达式无法解决此问题,因为不同文档和国家/地区的地址字段不同
  • 尝试使用NLTK对单词进行分类,但对地址字段的分类效果并不理想
  • 所需输出

    I am staying at 234 23 Philadelphia - Contains address files <234 23 Philadelphia>
    
    I am looking for a place to stay - Not contains address 
    
    我住在费城234 23号-包含地址文件
    我在找一个住的地方-不包括地址
    

    提供解决此问题的建议

    与许多ML问题一样,存在多种可能的解决方案,重要的部分(通常影响更大的部分)不是使用哪种算法或模型,而是特征工程、数据预处理和标准化等。我想到了第一个解决方案(这只是一个想法,我会测试它,看看它的性能如何),它:

  • 获取您的培训集示例,列出所有示例(即您的词汇表)中最常用的“N”个单词,该列表将包含“N”个最常用单词中的每一个,每个单词将由一个数字表示(列表索引)
  • 转换您的培训示例:阅读每个培训示例并更改其表示形式,将每个单词替换为词汇表中的单词数
  • 最后,对于每个培训示例,创建一个与词汇表大小相同的特征向量,对于词汇表中的每个单词,您的特征向量将为0(对应的单词在示例中不存在)或1(它存在),或者该单词出现的次数(同样,这是特征工程)
  • 训练多个分类器、各种算法、参数、训练集大小等,并进行交叉验证以选择最佳模型

  • 然后保留标准的ML工作流…

    如果您只想检查是或否,而不想提取完整的地址,可以使用一个简单的解决方案

    您可以尝试检查文本是否包含位置

    例如:

    import nltk 
    def check_location(text):
        for chunk in nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(text))):
            if hasattr(chunk, "label"):
                if chunk.label() == "GPE" or chunk.label() == "GSP":
                    return "True"
        return "False"
    
    text="I am staying at 234 23 Philadelphia."
    print(text+" - "+check_location(text))
    
    text="I am looking for a place to stay."
    print(text+" - "+check_location(text))
    
    输出:

    # I am staying at 234 23 Philadelphia. - True 
    # I am looking for a place to stay. - False
    
    如果你想提取完整的地址,你需要训练你自己的模型


    您可以检查:,。

    为什么说正则表达式不起作用

    基本上,以正则表达式的形式定义可能遇到的所有不同形式的地址。然后,只需匹配表达式。

    你是对的

    有些API将尝试为您提取地址。这些API并不总是保证从字符串中提取地址,但它们会尽最大努力。街道地址提取API的一个示例来自SmartyStreets。和

    需要考虑的是,即使你的例子(<代码>我停留在234 23费城)不包含一个完整的地址。缺少州或邮政编码字段。这使得以编程方式确定是否存在地址非常困难。一旦有一个州或邮政编码添加到该示例字符串中(
    我住在宾夕法尼亚州费城234 23
    ),就可以通过编程更容易地确定字符串中是否包含地址


    免责声明:我为SmartyStreets工作

    执行此任务的更好方法如下:

  • 培训您自己的自定义NER模型(扩展预先培训过的
    SpaCy的
    模型或构建您自己的
    CRF++
    /
    CRF biLSTM
    模型,如果您有注释数据)或使用预先培训过的模型,如
    SpaCy的
    大型模型或geopandas等

  • 根据问题陈述定义加权评分机制。 例如,让我们假设每个地址都有3个重要组成部分——一个地址、一个电话号码和一个电子邮件id。
    包含所有三个选项的文本的得分为33.33%+33.33%+33.33%=100%

  • 为了确定它是否是
    地址字段
    ,您可以考虑
    SpaCy的
    位置标记(GPE、FAC、LOC等)占文本中总标记的百分比,这可以很好地估计文本中存在多少位置标记。然后运行邮政编码正则表达式,将找到的城市名称与找到的邮政编码前的3-4个单词进行匹配,如果有重叠,则表明您已正确识别了邮政编码,因此有一个
    地址字段(得到33.33%的分数!)

  • 对于
    电话号码
    -某些检查和正则表达式可以执行,但重要的标准是,只有当
    地址字段
    位于上述文本中时,它才会执行这些电话检查

  • 对于
    电子邮件/网址
    ,您可以再次执行名义正则表达式检查,最后将所有这3个分数相加为一个累积值

  • 理想的
    地址
    将得到100分,而缺少的字段将得到66%等。文本的其余部分将得到0分


  • 希望有帮助!:)

    对于世界上所有的地址字段来说,没有足够的正则表达式,这些地址字段的邮政编码格式与城市名称或缩写不同,在其他国家可能用于其他用途。在这个问题上,只有ML解决方案应该有所帮助。我不认为将城市名称或地点名称矢量化是一个好主意。您使用的BoW模型背后的想法假设您事先知道词汇表,在本例中,没有一个vocab可以拥有所有的城市名称、州名称或邮政编码格式。