Csv 创建基于单词的单词排列规则';s位置标签

Csv 创建基于单词的单词排列规则';s位置标签,csv,python-3.x,nlp,permutation,nltk,Csv,Python 3.x,Nlp,Permutation,Nltk,我还有一个问题,既然这个社区对我的帮助如此之大,我想我会再试一次 现在我有了Python 3代码,它导入了一个CSV文件,其中第一列充满了以下格式的单词: The Words Look Like This In A Column 一旦这个CSV文件被Python上传和读取,这些单词将使用NLTK POS标记器进行标记。从那里,对所有单词进行排列,然后将结果导出到新的CSV文件中。 现在,我的全部代码是这样的 Import CSV with open(r'C:\Users\jkk\Desktop

我还有一个问题,既然这个社区对我的帮助如此之大,我想我会再试一次

现在我有了Python 3代码,它导入了一个CSV文件,其中第一列充满了以下格式的单词:

The
Words
Look
Like
This
In
A
Column
一旦这个CSV文件被Python上传和读取,这些单词将使用NLTK POS标记器进行标记。从那里,对所有单词进行排列,然后将结果导出到新的CSV文件中。 现在,我的全部代码是这样的

Import CSV
with open(r'C:\Users\jkk\Desktop\python.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/etc)。一旦单词被标记了各自的词性,我如何根据它们的标记来编码规则(例如:永远不要让两个“DT”标记的单词相互跟随(即“the”和“A”)。或者始终让NN标记的单词后跟VBG标记的单词(即,“Looks”始终位于“Words”之后)?最后,一旦这些规则被实现,去掉标签,只保留原来的单词?我意识到这是一个一般性的问题,但任何关于如何处理这个问题的指导都将非常感谢,因为我仍然是一个非常新的人,并在学习过程中的每一步!任何资源、代码甚至建议都会有所帮助!再次感谢您抽出时间阅读这篇长文章

在语言中定义合法字符串的规则集称为语法(或形式语法)。有许多形式主义允许你表达这些规则。一个非常简单的实验是上下文无关语法()。NLTK附带了从这些字符串生成字符串的工具。这是你的电话号码。它们深入得多

以下代码适用于带有NLTK 3.0a4的python 3。该API在NLTK 2和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')}
然而,这种方法有一个局限性,因为上下文无关语法不能涵盖所有英语。不过,目前还没有已知的方法来验证英语语法,所以您只能得到一个近似的解决方案


另一件你应该注意的事情是,词性标记假定单词的顺序是相关的。大致上,它为每个单词提供一组可能的标记,然后根据前面和/或后面的单词对其进行细化,因此如果您的CSV包含句子,那么您就可以了,否则,您可能希望指定unigram pos tagger
nltk.tag.UnigramTagger
,但无论如何,您将只获得最常见的标记。这将是诸如“run”之类的词的问题,它可以是动词或名词(“晨跑”与“我跑步”)。

您的整个csv文件看起来如何?当您只有一列时,为什么需要csv文件?请看以下讨论: