代码之家  ›  专栏  ›  技术社区  ›  Tom

从文本分析意义

  •  10
  • Tom  · 技术社区  · 15 年前

    我意识到这是一个广泛的主题,但是我正在寻找一个很好的入门级教程来解析文本中的含义,最好是在Python中。作为一个例子,如果一个用户在博客上发表了如下内容:

    “曼尼·拉米雷斯今天在对阵休斯顿阿童木队的比赛中回归道奇队”,

    从句子中提取名词的轻量级/简单的方法是什么?首先,我想把它限制在专有名词上,但我不想仅限于此(我不想依赖于一个简单的regex,它假定任何标题加上封顶的东西都是专有名词)。

    更糟糕的是,我不该问的是什么?我是否需要现有单词的语料库才能开始?我需要知道哪些词法分析的东西才能使这项工作发挥作用?我确实遇到过 one other question 关于这个话题,我现在正在挖掘这些资源。

    7 回复  |  直到 8 年前
        1
  •  8
  •   snl    8 年前

    使用 NLTK ,特别是 chapter 7 on Information Extraction.

    你说你想提取意义,还有一些语义分析模块,但我认为IE是你所需要的——老实说,现在NLP计算机唯一能处理的领域之一。

    参见第7.5节和第7.6节关于命名实体识别(将Manny Ramerez划分为一个人,Dodgers划分为一个体育组织,Houston Astros划分为另一个体育组织,或任何适合您领域的组织)和关系提取。安装了NLTK之后,就可以插入一个NER chunker。从他们的例子中,提取一个地缘政治实体(GPE)和一个人:

    >>> sent = nltk.corpus.treebank.tagged_sents()[22]
    >>> print nltk.ne_chunk(sent) 
    (S
      The/DT
      (GPE U.S./NNP)
      is/VBZ
      one/CD
      ...
      according/VBG
      to/TO
      (PERSON Brooke/NNP T./NNP Mossman/NNP)
      ...)
    

    注意,您仍然需要知道标记化技术和标记,如前几章中所讨论的,以便为这些IE任务获得正确格式的文本。

        2
  •  10
  •   RichieHindle    15 年前

    你需要看看 Natural Language Toolkit 正是为了这类事情。

    本手册的这一部分看起来非常相关: Categorizing and Tagging Words -以下是摘录:

    >>> text = nltk.word_tokenize("And now for something completely different")
    >>> nltk.pos_tag(text)
    [('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'),
    ('completely', 'RB'), ('different', 'JJ')]
    

    我们看到了 是CC,协调连词; 现在 完全地 是rb或副词; 对于 在,介词; 某物 是名词;和 不同的 是JJ,形容词。

        3
  •  7
  •   Stephan202 Alex Martelli    15 年前

    自然语言处理(NLP)是用来解析自然语言的名称。算法和启发式方法很多,是一个活跃的研究领域。无论您要编写什么算法,它都需要在语料库上进行训练。就像人一样:我们通过阅读别人写的文本(和/或听别人说的句子)来学习语言。

    从实际角度来看, Natural Language Toolkit . 对于要编写的代码的理论基础,您可能需要签出 Foundations of Statistical Natural Language Processing 作者:Chris Manning和Hinrich Sch_¼Tze。

    alt text http://nlp.stanford.edu/fsnlp/fsnlp-bigger.jpg

        4
  •  4
  •   zakovyrya    15 年前

    这是我最近偶然发现的一本书: Natural Language Processing with Python

        5
  •  3
  •   Jay Kominek    15 年前

    你想要的是NP(名词短语)分块,或者提取。

    Some links here

    正如所指出的,这是领域特定的问题。你越能缩小范围,它就越有效。你必须在你的特定领域训练你的程序。

        6
  •  1
  •   Paul Sonier    15 年前

    这是一个非常复杂的话题。一般来说,这类东西属于自然语言处理的范畴,而且往往最棘手。这类工作的困难正是为什么还没有一个完全自动化的系统来处理客户服务之类的问题。

    一般来说,处理这些问题的方法确实取决于您的问题域是什么。如果你能从问题域中取胜,你会得到一些非常严重的好处;举例来说,如果你能确定你的问题域是棒球,那么这会给你一个非常好的开端。即便如此,要想得到任何特别有用的东西也需要很多工作。

    就其价值而言,是的,现有的语料库将是有用的。更重要的是,确定系统所期望的功能复杂性将是至关重要的;您需要解析简单的句子,还是需要解析复杂的行为?你能把输入限制在一个相对简单的集合中吗?

        7
  •  -1
  •   Jesse Walters    9 年前

    正则表达式在某些情况下有帮助。下面是一个详细的示例: What’s the Most Mentioned Scanner on CNET Forum 它使用正则表达式在CNET论坛帖子中查找所有提到的扫描器。

    在post中,使用了这样的正则表达式:

    (?i)((?:\w+\s\w+\s(?:(?:(?:[0-9]+[a-z\-]|[a-z]+[0-9\-]|[0-9])[a-z0-9\-]*)|all-in-one|all in one)\s(\w+\s){0,1}(?:scanner|photo scanner|flatbed scanner|adf scanner|scanning|document scanner|printer scanner|portable scanner|handheld scanner|printer\/scanner))|(?:(?:scanner|photo scanner|flatbed scanner|adf scanner|scanning|document scanner|printer scanner|portable scanner|handheld scanner|printer\/scanner)\s(\w+\s){1,2}(?:(?:(?:[0-9]+[a-z\-]|[a-z]+[0-9\-]|[0-9])[a-z0-9\-]*)|all-in-one|all in one)))
    

    为了匹配以下任一项:

    • 两个字,然后是型号(包括一体机),然后是扫描仪。
    • _156;扫描仪_157;,然后是一个或两个字,然后是型号(包括 一元化)

    结果,从文章中提取的文本就像,

    1. 停止使用HP C9900A照片扫描仪
    2. 扫描他的旧X光片
    3. 新爱普生V700扫描仪
    4. HP Scanjet 4850扫描仪
    5. 爱普生完美3170扫描仪

    这个正则表达式解决方案在某种程度上起作用。