Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查姓氏是否为英文?_Python_Nltk_Wordnet - Fatal编程技术网

Python 如何检查姓氏是否为英文?

Python 如何检查姓氏是否为英文?,python,nltk,wordnet,Python,Nltk,Wordnet,我有一个csv文件,它有两列,大约9000行。第1列包含调查中受访者的姓氏,第2列包含调查中受访者的姓氏,因此每一行都是观察结果 这些调查是在一个非常多样化的地方进行的。我正试图找到一种方法来判断受访者的名字是否来源于英语(英国或美国)。他的姓也是 这项任务与我的专业领域相去甚远。在网上阅读了有趣的讨论后。我考虑过三种方法: 1-取一个最常见的三胞胎(英文中通常有3个字母组成的家族)或四胞胎(英文中通常有4个字母组成的家族)的数据集,检查每个名字和姓氏是否包含这些字母家族 2-使用一个英国名字的

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

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

这项任务与我的专业领域相去甚远。在网上阅读了有趣的讨论后。我考虑过三种方法:

1-取一个最常见的三胞胎(英文中通常有3个字母组成的家族)或四胞胎(英文中通常有4个字母组成的家族)的数据集,检查每个名字和姓氏是否包含这些字母家族

2-使用一个英国名字的数据集(比如说XX世纪早期英国最常见的X个名字),并根据与我的数据集的接近程度来匹配这些名字。我认为这些数据集可能很好

3-使用python和一个接口来检测(很可能)英语和非英语

如果有人对此有建议,可以分享经验等,那将是伟大的

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

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


虽然最好的解决方案可能是在BERT或类似语言模型的基础上训练分类模型,但粗略的解决方案是使用零炮分类。下面的示例使用了。它做得相当不错,尽管您会看到一些语义问题弹出:例如,名称Black的分类是likely变形,因为它也是一种颜色

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 |

不久前我构建了一个非常类似的东西

  • Created 2 Source列出了一个名字列表和一个姓氏列表
  • 创建了4个以上的比较列表(英文名列表、英文姓列表等)
  • 然后使用in_数组函数将源名与比较名进行比较
  • 然后,我用一个大的if语句来检查列表,并相互比较。Eng.First vs Src.First,American.First vs Src.First,Irish.First vs Src.First
  • 等等。如果你想用你的第一个项目作为一种选择(例如,名字的部分和片断),我写了一篇论文,其中包括一些可能会有所帮助的源代码


    很酷的问题!我不知道答案,把它记下来看看你最终是如何解决的。一个建议是扩展这种方法,将名称与非英语名称进行匹配,并使用这些信息。这是一个非常好的建议!我已经更新了代码示例,现在你可以一次性运行它。我正在使用pandas来处理csv,你可以使用pandas以如下方式加载csv:
    df=pd.read_csv('/Users/marcelcapion/Desktop/names.csv')
    ;您可以使用
    df.head()
    检查它是否正确加载。如果没有可见的列名,您可以这样设置:
    df.columns=['firstname',name']
    我尝试使用此代码,但我得到的是:知道如何修复此问题吗?没有找到PyTorch、TensorFlow>=2.0或Flax。模型将不可用,只能使用标记器、配置和文件/数据实用程序。回溯(最近一次调用):这似乎是一个问题,并提供了解决方案。但这些是系统特定的问题,与代码无关。您始终可以使用google colab。