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

时间:2017-04-19 22:47:27

标签: python nlp nltk text-analysis

第一次发布在这里。我希望我能在文本分析方面找到一些帮助。

首先,我在python中这样做,并希望保留在python中,因为这个函数将成为我喜欢的更大,更健康的工具的一部分。我也设置了NLKT和Anaconda,因此也可以利用这些资源。

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

我目前遇到的问题是弄清楚如何从同名的城市名称中删除误报。所以,比方说,杰克逊密西西比说,我想算数,但不算“弗兰克杰克逊”,“简杰克逊”等...

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

我已经从人口普查数据中收集了大约5000个名字的列表,我也可以将它作为列表带到python中。我也可以检查true / false来查找名单是否在该列表中,所以我知道我越来越近了。

然而,我无法弄清楚的是如何表达我想要的东西,这就像(我将再次以杰克逊为例):

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

或多或少。有没有什么方法可以将它作为人口普查列表中的通配符来表达呢?设置一个变量,读作“此列表中的任何项目”,这样我就可以去“anynamevariable + Jackson”了?或者有没有其他方法可以表示“人口普查列表+杰克逊中的任何一个词”?

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

在最糟糕的情况下,我可以看到一种方法,我可以直接修改人口普查列表,并将杰克逊(或我需要的任何姓名)添加到每个名称,并手动添加行,但我觉得这样做会完整当你看到我想做的每个名字的〜5000个名字时,我的代码一团糟。

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

3 个答案:

答案 0 :(得分:0)

我建议将正则表达式与NLTK中的名称列表结合使用。假设您的文字是:

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

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

r'\s+'

如果您不熟悉正则表达式,"|"表示"由一个或多个空格分隔" jackson_catch = jackson_names.findall(text) #['Fred Jackson', 'Mary Jackson'] len(jackson_catch) #2 表示"或"。可以扩展正则表达式以处理其他姓氏。

现在,提取所有"杰克逊"您的文字匹配:

{{1}}

答案 1 :(得分:0)

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

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可以让您快速适应新问题。

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

答案 2 :(得分:0)

  

我目前遇到的问题是弄清楚如何从同名的城市名称中删除误报。所以,比方说,杰克逊密西西比说,我想算数,但不算“弗兰克杰克逊”,“简杰克逊”等...

你遇到的问题被称为"命名实体识别",最好用一个分类器解决,该分类器考虑多个线索来查找命名实体并根据类型对它们进行分类(PERSON,ORGANIZATION,LOCATION等等,或类似的清单。)

nltk书中的

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