【问题标题】:Text file parsing with python and with a list in grammar使用 python 和语法列表解析文本文件
【发布时间】:2018-02-09 09:40:37
【问题描述】:

我必须进行解析:目标是创建将应用于语料库的语法规则。我有一个问题:语法中是否可以有一个列表?

例子:

1) Open the text to be analyzed
2) Write the grammatical rules (just an example):
   grammar("""
   S -> NP VP
   NP -> DET N
   VP -> V N
   DET -> list_det.txt
   N -> list_n.txt
   V -> list.txt""")
3) Print the result with the entries that obey this grammar

有可能吗?

【问题讨论】:

  • 应该是可以的。你在怀疑什么?
  • 我不知道如何在语法中调用外部列表。我也怀疑这是否可能,因为我们正在谈论词典......
  • “list_det.txt”、“list_n.txt”和“list.txt”是文件名吗?这些文件的内容应该包含在文件名当前出现的语法中?

标签: python python-3.x parsing nlp text-parsing


【解决方案1】:

这里是您的语法的快速概念原型,使用 pyparsing。我无法从您的问题中看出NVDET 列表的内容可能是什么,所以我只是随意选择了由'n's 和'v's 以及文字'det' 组成的单词。您可以用正确的语法表达式替换 <<= 赋值,但是这个解析器和示例字符串应该表明您的语法至少是可行的。 (如果您编辑您的问题以显示NVDET 是列表,我可以使用较少的任意表达式和示例更新此答案。还包括一个示例字符串被解析会很有用。)

我还添加了一些分组,以便您可以看到语法结构如何反映在结果结构中。您可以保留或删除它,解析器仍然可以工作。

import pyparsing as pp

v = pp.Forward()
n = pp.Forward()
det = pp.Forward()

V = pp.Group(pp.OneOrMore(v))
N = pp.Group(pp.OneOrMore(n))
DET = pp.Group(pp.OneOrMore(det))

VP = pp.Group(V + N)
NP = pp.Group(DET + N)
S = NP + VP

# replace these with something meaningful
v <<= pp.Word('v')
n <<= pp.Word('n')
det <<= pp.Literal('det')

sample = 'det det nn nn nn nn vv vv vv nn nn nn nn'

parsed = S.parseString(sample)
print(parsed.asList())

打印:

[[['det', 'det'], ['nn', 'nn', 'nn', 'nn']], 
 [['vv', 'vv', 'vv'], ['nn', 'nn', 'nn', 'nn']]]

编辑:

我猜“NP”和“VP”是“名词短语”和“动词短语”,但我不知道“DET”可能是什么。尽管如此,我还是编了一个不那么抽象的例子。我还扩展了列表,以接受更多语法形式的名词和动词列表,并连接 'and's 和逗号。

import pyparsing as pp

v = pp.Forward()
n = pp.Forward()
det = pp.Forward()

def collectionOf(expr):
    '''
    Compose a collection expression for a base expression that matches
        expr
        expr and expr
        expr, expr, expr, and expr
    '''
    AND = pp.Literal('and')
    OR = pp.Literal('or')
    COMMA = pp.Suppress(',')
    return expr + pp.Optional(
            pp.Optional(pp.OneOrMore(COMMA + expr) + COMMA) + (AND | OR) + expr)

V = pp.Group(collectionOf(v))('V')
N = pp.Group(collectionOf(n))('N')
DET = pp.Group(pp.OneOrMore(det))('DET')

VP = pp.Group(V + N)('VP')
NP = pp.Group(DET + N)('NP')
S = pp.Group(NP + VP)('S')

# replace these with something meaningful
v <<= pp.Combine(pp.oneOf('chase love hate like eat drink') + pp.Optional(pp.Literal('s')))
n <<= pp.Optional(pp.oneOf('the a my your our his her their')) + pp.oneOf("dog cat horse rabbit squirrel food water")
det <<= pp.Optional(pp.oneOf('why how when where')) +pp.oneOf( 'do does did')

samples = '''
    when does the dog eat the food
    does the dog like the cat
    do the horse, cat, and dog like or hate their food
    do the horse and dog love the cat
    why did the dog chase the squirrel
'''
S.runTests(samples)

打印:

when does the dog eat the food
[[[['when', 'does'], ['the', 'dog']], [['eat'], ['the', 'food']]]]
- S: [[['when', 'does'], ['the', 'dog']], [['eat'], ['the', 'food']]]
  - NP: [['when', 'does'], ['the', 'dog']]
    - DET: ['when', 'does']
    - N: ['the', 'dog']
  - VP: [['eat'], ['the', 'food']]
    - N: ['the', 'food']
    - V: ['eat']


does the dog like the cat
[[[['does'], ['the', 'dog']], [['like'], ['the', 'cat']]]]
- S: [[['does'], ['the', 'dog']], [['like'], ['the', 'cat']]]
  - NP: [['does'], ['the', 'dog']]
    - DET: ['does']
    - N: ['the', 'dog']
  - VP: [['like'], ['the', 'cat']]
    - N: ['the', 'cat']
    - V: ['like']


do the horse, cat, and dog like or hate their food
[[[['do'], ['the', 'horse', 'cat', 'and', 'dog']], [['like', 'or', 'hate'], ['their', 'food']]]]
- S: [[['do'], ['the', 'horse', 'cat', 'and', 'dog']], [['like', 'or', 'hate'], ['their', 'food']]]
  - NP: [['do'], ['the', 'horse', 'cat', 'and', 'dog']]
    - DET: ['do']
    - N: ['the', 'horse', 'cat', 'and', 'dog']
  - VP: [['like', 'or', 'hate'], ['their', 'food']]
    - N: ['their', 'food']
    - V: ['like', 'or', 'hate']


do the horse and dog love the cat
[[[['do'], ['the', 'horse', 'and', 'dog']], [['love'], ['the', 'cat']]]]
- S: [[['do'], ['the', 'horse', 'and', 'dog']], [['love'], ['the', 'cat']]]
  - NP: [['do'], ['the', 'horse', 'and', 'dog']]
    - DET: ['do']
    - N: ['the', 'horse', 'and', 'dog']
  - VP: [['love'], ['the', 'cat']]
    - N: ['the', 'cat']
    - V: ['love']


why did the dog chase the squirrel
[[[['why', 'did'], ['the', 'dog']], [['chase'], ['the', 'squirrel']]]]
- S: [[['why', 'did'], ['the', 'dog']], [['chase'], ['the', 'squirrel']]]
  - NP: [['why', 'did'], ['the', 'dog']]
    - DET: ['why', 'did']
    - N: ['the', 'dog']
  - VP: [['chase'], ['the', 'squirrel']]
    - N: ['the', 'squirrel']
    - V: ['chase']

【讨论】:

  • DET 是限定词,一个词类,包括冠词、指示词和量词(除其他外)。
  • 太棒了!!问题是:V DET 和 N 是包含许多条目的列表,因此很难放入程序中。我需要调用这些列表,我不知道是否有可能......
  • 这大约是 pyparsing 可以合理进行的范围 - 你很快就会开始处理动词时态、不规则复数等,然后它变得非常丑陋。在这一点上,你真的在​​做 NLTK 的东西,通过谷歌我相信你会找到一些 Python NL 库。我希望这至少表明你的语法是可行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 2012-08-09
  • 2015-04-27
  • 2022-01-17
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多