根据单词的 POS 标记创建单词排列规则



我还有一个问题,既然这个社区给了我这么大的帮助,我想我应该再试一次。

现在我的Python 3代码导入了一个CSV文件,其中第一列是以下格式的全词:

The
Words
Look
Like
This
In
A
Column

一旦这个CSV文件被上传并被Python读取,单词就会使用NLTK POS Tagger进行标记。从那里,对所有单词进行排列,然后将结果导出到一个新的CSV文件。现在,我的完整代码是这样的

Import CSV
with open(r'C:UsersjkkDesktoppython.csv', 'r') as f:
    reader = csv.reader(f)
    J = []
    for row in reader:
      J.extend(row)
import nltk
D = nltk.pos_tag(J)
C = list(itertools.permutations(D, 3))
with open('test.csv', 'w') as a_file:
    for result in C:
    result = ' '.join(result)
    a_file.write(result + 'n')

我的问题是,如何根据单词标签为单词排列制定规则?更具体地说,我标记单词的原因是因为我不想要无意义的排列(即This In/A This In/等)。一旦单词被标记为它们各自的词性,我如何基于它们的标记来编码规则(例如):永远不要让两个"DT"标记的单词相互跟随(即:"The"one_answers"A")。或者总是让一个NN标记的词后面跟着一个VBG标记的词(即。"长相"总是排在"言语"之后)?最后,一旦实现了这些规则,就可以去掉标签,只保留原始单词了吗?我意识到这是一个普遍的问题,但任何指导将非常感谢如何处理这个问题,因为我仍然是非常新的和学习的每一步!任何资源、代码、甚至建议都会有所帮助!再次感谢您花时间阅读这篇长文!

定义语言中合法字符串的规则集称为语法(或形式语法)。有许多形式可以让你表达这些规则。一种相当简单的实验方法是上下文无关语法(CFG)。NLTK附带了一些工具,可以从中生成字符串。这里是NLTK书中关于语法的章节。他们深入得多。

以下代码适用于python 3和NLTK 3.0a4。该API在NLTK 2和NLTK 3之间发生了变化,因此它将无法在旧版本上运行。

from nltk import ContextFreeGrammar
from nltk.parse.generate import generate
from ntlk.util import trigrams
# build a simple grammar
cfg = """
S -> NP VP
VP -> VBZ NP
NP -> DT | NN | DT NN | DT JJ NN | JJ NN
"""
# you get these from your csv
words = "this is a simple sentence".split()
tagged = set(pos_tag(words))
# Add the words to the grammar
for word, tag in tagged:
    cfg += "{tag} -> '{word}'n".format(word=word, tag=tag)
grammar = parse_cfg(cfg)
valid_trigrams = set()
language = generate(grammar)
for valid_sentence in language:
    valid_trigrams.update(list(trigrams(valid_sentence)))
print(valid_trigrams)
# {('simple', 'sentence', 'is'), ('this', 'is', 'this'), ('a', 'sentence', 'is'), ('sentence', 'is', 'a'), ('a', 'is', 'a'), ('this', 'is', 'simple'), ('sentence', 'is', 'this'), ('this', 'is', 'sentence'), ('is', 'a', 'sentence'), ('is', 'a', 'simple'), ('a', 'simple', 'sentence'), ('a', 'is', 'this'), ('this', 'simple', 'sentence'), ('this', 'is', 'a'), ('is', 'simple', 'sentence'), ('a', 'is', 'simple'), ('this', 'sentence', 'is'), ('is', 'this', 'sentence'), ('sentence', 'is', 'sentence'), ('sentence', 'is', 'simple'), ('is', 'this', 'simple'), ('a', 'is', 'sentence')}

这种方法有一个局限性,因为上下文无关的语法不能涵盖所有的英语。没有已知的方法来验证英语语法,所以你只能有一个近似的解决方案。

您应该注意的另一件事是,POS标记器假定单词的顺序是相关的。粗略地说,它为每个单词提供一组可能的标记,然后根据前面或后面的单词对其进行改进,因此,如果您的CSV包含句子,那么您就可以了,否则,您可能想要指定单字符标记器nltk.tag.UnigramTagger,但无论如何,您将只获得最常见的标记。对于像"run"它可以是动词也可以是名词("晨跑";vs "I run")。

最新更新