2017-04-19 7 views
0

第一次在这里发表。我希望在文本分析方面我可以找到一些我想要完成的事情。如何在文本块中统计[名称列表中的任何名称] + [特定姓氏]?

首先,我在python中这样做,并希望保留在Python中,因为这个函数将成为一个更大,否则我很满意的健康工具的一部分。我有NLKT和Anaconda也都建立了,所以利用这些资源也是可能的。

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

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

然而我想要做的是找出解决任何误报的方法这可能是[长名单中的任何名字] + [选择姓氏]。

我已经从人口普查数据中汇总了大约5000个名字的列表,我也可以将其作为列表带入Python。我也可以检查真/假来查找名单是否在列表中,所以我知道我越来越近了。

不过,我无法弄清楚是如何表达我想要的东西,这(再次,我将使用杰克逊作为一个例子)是一样的东西:

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

更多或更少。有什么方法可以将它作为人口普查清单中的通配符吗?设置一个变量,将其读作“此列表中的任何项目”,以便我可以转到“anynamevariable + Jackson”,?或者还有其他方式来表示“人口普查清单+杰克逊中的任何词汇”?

理想情况下,我的目标是获得“[任何名字] + [指定的姓氏]”的总数,所以我可以a)从[也是城市名字的姓氏]总数中减去它们也可以使用这个计数来进行其他改进。

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

对不起,这个冗长的帖子。我感谢你对这一切的帮助。如果您有其他建议,您认为可能是更好的方法来处理它,我很高兴听到这些。

+1

首先,NLTK特征语料库'nltk.corpus.names'具有约8000个英文名称,这可能比您收集的列表更完整。 – DyZ

+0

你能列出每个“杰克逊”实例前面的单词并循环遍历它来检查它是否在你的nltk.corpus.names中? – Dwaxe

+0

我想过创建一致性,然后检查语料库中列表中的任何名称,但是在NLTK中获取一致性以输出到变量(它不想这么做)以及调整一致的长度,以便它可以捕捉到名称,但不会超过捕获。我认为我会首先考虑这一点,因为看起来如果我可以走了([从这个列表中的任何一个] +“杰克逊”)可能是最直接的方式。另外,感谢您指出NLTK名单。这可能是一个更好的方法去组装名字。 – newreadia

回答

0

我建议将正则表达式与来自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+'意味着“分离通过一个或多个空格“并且"|"表示”或“。正则表达式可以扩展为处理其他姓氏。

现在,提取所有“禅师”从文本匹配:

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

这工作非常好!非常感谢你对此的帮助。我只是测试了一下,我已经完成并运行了。 – newreadia

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可以让你快速适应新的问题。另一方面,如果性能是主要问题,那么最好不要使用如此强大和灵活的内容,以便可以磨合算法以适应特定需求并尽可能高效地运行。

+0

无论其他事情如何,请确保'FIRST_NAMES'是一个集合,而不是一个列表,因为大型列表的查询时间很可怕。 – DyZ

+0

我会添加一个关于该注意事项:) – Apollys

+0

考虑到这一点,并将更新,当我得到它在更大的图片工作。非常感谢您的支持! – newreadia

0

目前我遇到的问题是搞清楚如何从同名的城市名称中删除误报。所以,举例来说,我希望来算,说杰克逊密西西比州,但不能算“弗兰克·杰克逊”,“简·杰克逊”等...

你有被称为问题“命名实体识别”,而最好的解决带有一个分类器,该分类器考虑多个线索来查找命名实体并根据类型(人员,组织,位置等或类似列表)对它们进行分类。

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

+0

我会看看这个,看看我可以用这个做什么。感谢您的支持! – newreadia

相关问题