【问题标题】:Fuzzy matching from string candidate list来自字符串候选列表的模糊匹配
【发布时间】:2020-05-14 11:56:24
【问题描述】:

我有一个公司名称列表,我正试图从大量 PDF 文档中解析这些名称。

我已经通过 Apache Tika 强制 PDF 提取原始文本,我已经读取了 200 家公司的列表。

我一直在尝试使用 FuzzyWuzzy 和 Spacy 的某种组合来提取所需的匹配项。

据我所知:

import spacy
from fuzzywuzzy import fuzz, process

nlp = spacy.load("en_core_web_sm")
doc = nlp(strings[1])

companies = []
candidates = []

for ent in doc.ents:
  if ent.label_ == "ORG":
    candidates.append(ent.text)

process.extractBests(company_name, candidates, score_cutoff=80)

我想做的是:

  1. 通读文档字符串
  2. 解析任何模糊的公司名称 匹配得分 80+
  3. 返回包含在 文件及其分数。

救命!

【问题讨论】:

  • 你看过这个帖子吗? support.prodi.gy/t/… 有几篇文章包含 GitHub 链接,这些链接指向结合这两个库的工作代码。
  • 嘿伙计,我确实看到了那个,但我弹开了它。我是否错过了如何使用它来解决这个问题?

标签: python python-3.x spacy apache-tika fuzzywuzzy


【解决方案1】:

这是我填充candidates 的方式——mpg 是 Pandas DataFrame:

for s in mpg['name'].values: 
    doc = nlp(s) 
    for ent in doc.ents: 
        if ent.label_ == 'ORG': 
            candidates.append(ent.text) 

然后假设我们有一个简短的汽车数据列表来测试:

candidates = ['buick'
             ,'buick skylark'
             ,'buick estate wagon'
             ,'buick century']

下面的方法使用fuzz.token_sort_ratio,它被描述为“返回0到100之间序列相似性的度量,但在比较之前对标记进行排序。”试试这里部分记录的一些:https://github.com/seatgeek/fuzzywuzzy/issues/137

results = {} # dictionary to store results 
companies = ['buick'] # you'll have more companies
for company in companies:
    results[company] = process.extractBests(company,candidates,
                                            scorer=fuzz.token_sort_ratio,
                                            score_cutoff=50)

结果是:

In [53]: results                                                                
Out[53]: {'buick': [('buick', 100), 
                    ('buick skylark', 56), 
                    ('buick century', 56)]}

在这种情况下,使用 80 作为截止分数会比 50 更好。

【讨论】:

  • 您好,感谢您的回复,您可以看到我要去的地方。如果“别克”现场有多个标准怎么办? [AAA] 可以通过第二个列表进行迭代吗?process.extractBests([AAA],candidates,scorer=fuzz.token_sort_ratio,score_cutoff=50)
  • 不客气。我通过公司循环更新了答案。让我知道这是否有帮助。
  • 谢谢伙计。午饭回家后我会试试这个,如果它运行,我会标记为正确。你真好。
  • 不用担心。我将在答案中添加另一部分,以便您有一个存储结果的好方法。
  • 完美。再次感谢。
猜你喜欢
  • 2012-02-14
  • 2014-11-02
  • 2014-12-11
  • 2019-09-26
  • 2018-05-31
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多