如何计算文本块中的[名称列表中的任何名称] + [特定姓氏]?

How to count [any name from a list of names] + [specific last name] in a block of text?

第一次post来这里。我希望我能在文本分析方面对我试图完成的事情找到一点帮助。

首先,我在 python 中执行此操作,并希望保留在 python 中,因为此功能将成为我满意的更大、更健康的工具的一部分。我还设置了 NLKT 和 Anaconda,因此也可以利用这些资源。

我一直在研究一种工具,可以跟踪和添加大块文本中对城市名称的引用。例如,该工具可以计算在文本块中检测到“芝加哥”、“纽约”或“洛杉矶”、“旧金山”等的次数并对其进行排名。

我目前遇到的问题是弄清楚如何从也是姓氏的城市名称中删除误报。因此,举例来说,我想算 Jackson Mississippi,但不要算“Frank Jackson”、“Jane Jackson”等……

然而,我想做的是找出一种方法来解释可能是 [一长串名字中的任何名字] + [Select 姓氏] 的任何误报。

我从人口普查数据中收集了大约 5000 个名字的列表,我也可以将其作为列表引入 python。我还可以检查 true/false 以查找某个名称是否在该列表中,因此我知道我离目标越来越近了。

但是,我想不通的是如何表达我想要的东西,就像(我将再次以杰克逊为例):

totalfirstnamejacksoncount = count (“[any name from census list] + Jackson”)

或多或少。有什么方法可以将其表述为人口普查列表中的通配符吗?设置一个变量,读作“此列表中的任何项目”,这样我就可以使用“anynamevariable + Jackson”?或者是否有任何其他方式来表示“人口普查列表中的任何词 + 杰克逊”之类的东西?

理想情况下,我的目标是获得“[任何名字] + [指定的姓氏]”的总数,这样我就可以 a) 从 [也是城市名称的姓氏] 的总数中减去它们计数并可能将该计数用于其他一些改进。

在最坏的情况下,我可以看到一种方法可以直接修改人口普查列表并将 Jackson(或我需要的任何姓氏)添加到每个名称并手动添加这些行,但我觉得这样会使当您为我想做的每个名字查看约 5000 个名字时,我的代码一团糟。

抱歉啰嗦 post。感谢您对这一切的帮助。如果您有其他建议,您认为可能是更好的方法,我也很高兴听到这些建议。

我建议结合使用正则表达式和来自 NLTK 的姓名列表。假设您的文字是:

text = "I met Fred Jackson and Mary Jackson in Jackson Mississippi"

获取所有名称的列表并将其转换为(巨大的)正则表达式:

jackson_names = re.compile("|".join(w + r"\s+" + "Jackson" \
                           for w in nltk.corpus.names.words()))

如果您不熟悉正则表达式,r'\s+' 表示 "separated by one or more white spaces","|" 表示 "or"。可以扩展正则表达式以处理其他姓氏。

现在,从您的文本中提取所有 "Jackson" 个匹配项:

jackson_catch = jackson_names.findall(text)
#['Fred Jackson', 'Mary Jackson']
len(jackson_catch)
#2

让我们首先假设您能够通过遍历单词来处理数据,例如

s = 'Hello. I am a string.'
s.split()
Output: ['Hello.', 'I', 'am', 'a', 'string.']

并且您已经通过消除标点符号、大写字母等成功地规范了单词

所以你有一个单词列表 words_list(这是你的文本转换成列表)和一个你认为可能有城市名称的索引 i,或者它可能是某人的姓氏被错误地识别为城市名称。让我们调用你的名字列表 FIRST_NAMES,它应该是 set 类型(见评论)。

if i >= 1:
  prev_word = words_list[i-1]
  if prev_word in FIRST_NAMES:
    # put false positive code here
  else:
    # put true positive code here

您可能还更喜欢使用正则表达式,因为它们更灵活、更强大。例如,您可能会注意到,即使在实施此操作之后,由于某些先前无法预料的原因,您仍然会出现误报或漏报。 RE 可以让你快速适应新问题。

另一方面,如果性能是首要考虑因素,那么您最好不要使用如此强大和灵活的东西,这样您就可以磨练算法以满足您的特定要求,并且 运行 同样高效尽可能。

The current problem I am having is figuring out how to remove false positives from city names that are also last names. So, for instance, I would want to count, say Jackson Mississippi, but not count “Frank Jackson” “Jane Jackson” etc…

您遇到的问题称为 "named entity recognition",最好使用考虑多个线索的分类器来解决,以找到命名实体并根据类型(人、组织、位置等)对它们进行分类。 ,或类似的列表)。

Chapter 7 in the nltk book, and especially section 3, Developing and evaluating chunkers,引导您完成构建和训练识别器的过程。或者,您可以安装 Stanford 命名实体识别器并测量其在您的数据上的性能。