Python NLTK解释固定的句子模式并将其标记化

Python NLTK解释固定的句子模式并将其标记化,python,nlp,speech-recognition,nltk,Python,Nlp,Speech Recognition,Nltk,我有一个应用程序,NLTK需要解释人类发表的演讲,并从中找到有意义的语块。需要解释的句子的形式为from,to on,。正如你所理解的,这可以用无数种方式表达,例如 我想从亚特兰大去纽约,商务舱,2014年7月25日 我想乘坐商务舱,7月25日从纽约到亚特兰大 我有一个梦想,有一天我会登上飞机,坐商务舱,降落在纽约,消息来源是亚特兰大,最好是7月25日 7月25日亚特兰大至纽约,商务舱 你明白了。我想提取的是一些信息——来源、目的地、类别、日期。有些可能缺失,必须加以识别或适当假设。比如说,如果

我有一个应用程序,NLTK需要解释人类发表的演讲,并从中找到有意义的语块。需要解释的句子的形式为
from,to on,
。正如你所理解的,这可以用无数种方式表达,例如

  • 我想从亚特兰大去纽约,商务舱,2014年7月25日

  • 我想乘坐商务舱,7月25日从纽约到亚特兰大

  • 我有一个梦想,有一天我会登上飞机,坐商务舱,降落在纽约,消息来源是亚特兰大,最好是7月25日

  • 7月25日亚特兰大至纽约,商务舱

  • 你明白了。我想提取的是一些信息——来源、目的地、类别、日期。有些可能缺失,必须加以识别或适当假设。比如说,如果发现来源不见了,那就确认一下。或者,如果缺少年份,则记为当前年份。一直忽略无用的信息(比如我有一个梦想,就像我崇拜马丁·路德一样)


    在NLTK中有什么方法可以实现这一点吗?我知道有标记者可用,也有培训标记者的方法,但我对此没有足够的知识。是否有可能涵盖几乎所有可能意味着这样一句话的情况,并提取这样的信息?如果是这样,请提供一些指导。

    这个问题称为“命名实体识别”(或简称“ner”)。通过谷歌搜索这些短语,你会发现很多库、在线api、针对特定类型数据的巧妙经验法则等等

    在以下位置签出演示系统:

    检测对日期和时间的引用可能是最具启发性的解决方案

    如果您有一个特定且非常有限的文本域,那么设置手动整理的实体列表可能会非常有用。

    e、 g.只需列出所有拥有商业机场的城市的所有机场代码/名称,并尝试将这些名称与任何输入文本进行精确的字符串匹配。

    此问题称为“命名实体识别”(或简称“ner”)。通过谷歌搜索这些短语,你会发现很多库、在线api、针对特定类型数据的巧妙经验法则等等

    在以下位置签出演示系统:

    检测对日期和时间的引用可能是最具启发性的解决方案

    如果您有一个特定且非常有限的文本域,那么设置手动整理的实体列表可能会非常有用。

    e、 g.只需列出所有拥有商业机场的城市的所有机场代码/名称,并尝试将这些名称与任何输入文本进行精确的字符串匹配。

    在计算语言学中,这被称为“”,它是从文本中识别组织、人员和地点等事物的过程

    这里的挑战是nltk中默认的NE chunker是在网络上训练的最大熵chunker。它还没有经过识别日期和时间的训练,所以你需要调整它并找到一种检测时间的方法

    有一些软件包可以帮助提取命名实体,斯坦福NER(命名实体识别器)是最流行的命名实体识别工具之一,由Java实现。但是您可以通过下载包并通过NLTK进行交互来使用它,NLTK提供了一个Stanford NER的接口

    你可以下载 在这里可以找到stanford-ner.jar和分类器模型“all.3class.distsim.crf.ser.gz”

    from nltk.tag.stanford import NERTagger
    def stanfordNERExtractor(sentence):
        st =  NERTagger('/usr/share/stanford-ner/classifiers/all.3class.distsim.crf.ser.gz',
                   '/usr/share/stanford-ner/stanford-ner.jar')
        return st.tag(sentence.split()) 
    
    stanfordNERExtractedLines = stanfordNERExtractor("New York")
    print stanfordNERExtractedLines #[('New-York', 'LOCATION')]
    
    您也可以使用NTLK,您可以在上找到更多详细信息,请查看此要点

    • 我们如何确定目的地? 在区分位置之后,您可能会遇到识别由空格分隔的单词或区分来源和区别的问题
    最好编写一个正则表达式模式来标识源和目标。您可能在获取其他单词(如
    )时遇到问题,但您有要从
    st.tag
    (“位置”)验证的位置列表,或者如果您使用了NTLK,您可以验证它是否是动词(“VB”/“NN”)。您还可以通过使用NLTK的UnigramTagger()和BigramTagger()在“FROM”和“to”之后获取可以标识为位置的名称来检查可能性

    • 我们如何确定时间/日期
    如上所述,这是我们可以面对的问题之一,但我们可以使用正则表达式,如本文所述

    输出:

    25th July 2014.
    
    我们也可以使用或代替正则表达式

    以防缺少某个部分,如年份或月份。我们可以使用parsedatetime包来调整它

    检查这个快速示例(您可以根据不同的场景进行调整)

    最后一件事是,您可以使用它来提取airoport,并验证所提到的位置的正确性,以防您回答可用性(有些位置没有airoport)

    对于类,您可以通过查看句子中的“经济类”、“商务类”单词来验证它(您可以在
    中的
    或正则表达式中进行选择)


    有关此主题的更多详细信息,请查看:

    在计算语言学中,这被称为“”,它是从文本中识别组织、人员和位置等事物的过程

    这里的挑战是nltk中默认的NE chunker是在网络上训练的最大熵chunker。它还没有经过识别日期和时间的训练,所以你需要调整它并找到一种检测时间的方法

    有一些软件包可以帮助提取命名实体,斯坦福NER(命名实体识别器)是最流行的软件包之一
    import re
    text= "I want to go to New York from Atlanta, business class, on 25th July."
    destination= re.findall(r'.to.([A-Z][a-zA-Z]+?[\s-]*[A-Z]*[a-zA-Z]*)',text)
    source= re.findall(r'.from.([A-Z][a-zA-Z]+?[\s-]*[A-Z]*[a-zA-Z]*)',text)
    
    print source,destination
    
    print re.findall(
        r"""(?ix)             # case-insensitive, verbose regex
        \b                    # match a word boundary
        (?:                   # match the following three times:
         (?:                  # either
          \d+                 # a number,
          (?:\.|st|nd|rd|th)* # followed by a dot, st, nd, rd, or th (optional)
          |                   # or a month name
          (?:(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*)
         )
         [\s./-]*             # followed by a date separator or whitespace (optional)
        ){3}                  # do this three times
        \b """, 
        text)
    
    25th July 2014.
    
    >>> import parsedatetime
    >>> p = parsedatetime.Calendar()
    >>> print p.parse("25th this month")
    (time.struct_time(tm_year=2014, tm_mon=11, tm_mday=10, tm_hour=1, tm_min=5, tm_sec=31, tm_wday=0, tm_yday=314, tm_isdst=0), 0)
    >>> print p.parse("25th July")
    ((2015, 7, 25, 1, 5, 50, 0, 314, 0), 1)
    >>> print p.parse("25th July 2014")
    ((2014, 7, 25, 1, 6, 3, 0, 314, 0), 1)