【问题标题】:How to Check is Firstnames, and Lastnames are English?如何检查名字和姓氏是否为英文?
【发布时间】:2021-05-04 03:20:49
【问题描述】:

我有一个 csv 文件,它有两列和大约 9,000 行。第 1 列包含调查中受访者的名字,第 2 列包含调查中受访者的姓氏,因此每一行都是一个观察结果。

这些调查是在一个非常多样化的地方进行的。我试图找到一种方法来判断受访者的名字是否是英语(英国或美国)血统。他的姓也一样。

这个任务离我的专业领域很远。在阅读了在线herehere 的有趣讨论之后。我想了三个办法:

1- 获取最常见的三胞胎(英语中经常出现的三个字母的家族)或四胞胎(英语中经常出现的四个字母的家族)的数据集,并检查每个名字和姓氏是否包含这些字母家族。

2- 使用英国人名的数据集(比如 20 世纪初英国最常见的 X 个名字,并根据与我的数据集的接近程度来匹配这些名字。我认为这些数据集可能很好,data1data2, data3.

3- 使用 python 和一个界面来检测什么是(最有可能的)英语和什么不是。

如果有人对此有建议,可以分享经验等,那就太好了!

我附上了一个数据示例(我编了名字)和预期输出。

注意:请注意,我非常清楚根据英语/非英语二分法对名称进行分类并非没有缺点和语义问题。

【问题讨论】:

  • 很酷的问题!不知道答案,给它做个书签,看看你最终是怎么解决的。一个建议是扩展该方法以将名称与非英语名称进行匹配,并使用该信息。
  • 这是一个非常好的建议!

标签: python nltk wordnet


【解决方案1】:

虽然最好的解决方案可能是在 BERT 或类似语言模型之上训练分类模型,但粗略的解决方案是使用零样本分类。下面的示例使用transformers。尽管您会看到一些语义问题突然出现,但它做得相当不错:例如,名字 Black 的分类可能因为它也是一种颜色而被扭曲。

import pandas as pd
from transformers import pipeline

data = [['James', 'Brown'], ['Gerhard', 'Schreuder'], ['Musa', 'Bemba'], ['Morris D.', 'Kemba'], ['Evelyne', 'Fontaine'], ['Max D.', 'Kpali Jr.'], ['Musa', 'Black']]
df = pd.DataFrame(data, columns=['firstname', 'name'])
classifier = pipeline("zero-shot-classification")

firstnames = df['firstname'].tolist()
lastnames = df['name'].tolist()
candidate_labels = ["English or American", "not English or American"]
hypothesis_template = "This name is {}."

results_firstnames = classifier(firstnames, candidate_labels, hypothesis_template=hypothesis_template)
results_lastnames = classifier(lastnames, candidate_labels, hypothesis_template=hypothesis_template)
df['f_english'] = [1 if i['labels'][0] == 'English or American' else 0 for i in results_firstnames ]
df['n_english'] = [1 if i['labels'][0] == 'English or American' else 0 for i in results_lastnames]
df

输出:

|    | firstname   | name      |   f_english |   n_english |
|---:|:------------|:----------|------------:|------------:|
|  0 | James       | Brown     |           1 |           1 |
|  1 | Gerhard     | Schroeder |           0 |           0 |
|  2 | Musa        | Bemba     |           0 |           0 |
|  3 | Morris D.   | Kemba     |           1 |           0 |
|  4 | Evelyne     | Fontaine  |           1 |           0 |
|  5 | Max D.      | Kpali Jr. |           1 |           0 |
|  6 | Musa        | Black     |           0 |           0 |

【讨论】:

  • 我已经更新了代码示例,您现在可以一次性运行它。我正在使用 pandas 处理 csv,您可以使用 pandas read_csv 像这样加载 csv:df=pd.read_csv('/Users/marcelcampion/Desktop/names.csv');您可以使用df.head() 检查它是否已正确加载。如果没有可见的列名,您可以像这样设置它们:df.columns = ['firstname', 'name']
  • 我曾尝试使用此代码,但这就是我得到的:关于如何解决此问题的任何想法? PyTorch、TensorFlow >= 2.0 或 Flax 均未找到。模型将不可用,只能使用标记器、配置和文件/数据实用程序。 Traceback(最近一次通话最后一次):
  • 这似乎是this 问题,并提供this 解决方案。但这些是特定于系统的问题,与代码无关。您可以随时使用 google colab。
【解决方案2】:

我不久前建立了一些非常相似的东西。总结如下。

  1. Created 2 Source 列出了 Firstname 列表和 lastname
  2. 创建了 4 个以上的比较列表(英文名列表、英文姓氏列表等)
  3. 然后使用 in_array 函数将源名字与比较名字进行比较
  4. 然后我使用了一个大的 if 语句来检查列表。 Eng.First vs Src.First、American.First vs Src.First、Irish.First vs src.First。

等等。如果您正在考虑使用您的第一个项目符号作为选项(例如名称的部分和片段,我写了一篇论文,其中还包含一些源代码,可能会有所帮助。

Ordered Match Ratio as a Method for Detecting Program Abuse / Fraud

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多