我希望能够判断一句话在python中是否真的有意义。例如
Hello, how are you today? --> Correct
Hello, are today are how --> Incorrect
到目前为止,我有以下代码:
1 - 从nltk.browns语料库中获得20 000个句子
2 - 混合最后10 000个句子的单词(对于不正确的数据)
3 - 使用Stanford POS Tagger标记所有句子
from nltk.corpus import brown
from nltk.tokenize import sent_tokenize, word_tokenize
from nltk.classify import accuracy
from nltk.tag import StanfordPOSTagger
from nltk import pos_tag
import string
import random
PUNC = [x for x in string.punctuation] + ["''", "``"]
def download_data(target_path):
brown_data = brown.sents()
i = 0; n = 0
with open(target_path, 'w') as data_file:
while n < 20000:
for sent in sent_tokenize(' '.join(brown_data[i])):
updated_list = [x for x in word_tokenize(sent) if x not in PUNC]
if n > 10000:
random.shuffle(updated_list)
sent = ' '.join(updated_list) + '\n'
if sent != '\n':
data_file.write(sent)
n += 1
i += 1
def get_data(data_path):
with open(data_path, 'r') as data_file:
return [x for x in data_file.readlines()]
def parse_data(data, tagger):
parsed_data = []
for i in range(len(data)):
if i > 10000:
parsed_data.append((tagger.tag(word_tokenize(data[i].replace('\n', ''))), False))
else:
parsed_data.append((tagger.tag(word_tokenize(data[i].replace('\n', ''))), True))
random.shuffle(parsed_data)
return parsed_data[:15000], parsed_data[15000:]
if __name__ == '__main__':
data_path = 'data.txt'
stanford_jar_path = 'stanford-postagger.jar'
stanford_model_path = 'models/english-bidirectional-distsim.tagger'
tagger = StanfordPOSTagger(model_filename=stanford_model_path,
path_to_jar=stanford_jar_path)
#download_data(data_path)
all_data = get_data(data_path)
train_data, test_data = parse_data(all_data, tagger)
那么我如何训练分类器,例如,根据我提供的数据将新文本分类为正确还是不正确?
如果有人有更好的建议,我也是开放的。
答案 0 :(得分:0)
我会看是否存在部分词性的继承。您的示例可以转换为以下POS继承序列:
[('NNP', 'VBP'), ('VBP', 'NN'), ('NN', 'VBP'), ('VBP', 'WRB')] # incorrect
[('NNP', 'WRB'), ('WRB', 'VBP'), ('VBP', 'PRP'), ('PRP', 'NN')] # correct
如果您订购了两个POS的所有可能组合并构建了0和1的特征向量,则可以使用这些向量来训练您的算法。
答案 1 :(得分:0)
您正处于需要为训练集创建功能的步骤。我会使用2和3字n-gram作为特征,可能使用2和3个长度n-gram的POS。因此,例如,您将获取所有句子并找到所有bi / trigrams并将它们二值化(如果当前句子不包含它们则使它们为0,如果它包含则为1)。我会为POS做同样的事情。制作POS的双重/三元组并将其二值化。然后你可以使用像朴素贝叶斯这样的东西来看看是否存在任何预测能力。
答案 2 :(得分:0)
考虑使用词性标签虽然很好,但我相信考虑到n-gram语言模型应该足够适合您的任务。在这里我的假设是,POS标签的数量很少(根据Penn Treebank 36),因此与语料库的词汇量相比,变化的数量会更少。因此,POS标签可能会给您带来良好的性能,但也可能误导您的分类器。 (我的个人意见)
您可以尝试使用最多五克的语言模型。所有n-gram将是分类器的特征。请注意,更高数量的n-gram会增加复杂性,但应该会带来更高的准确性。
对于分类,您可以考虑生成和判别模型。对于生成模型,您可以考虑Naive-Bayes,对于判别模型,您可以考虑SVM或Logistic回归。这些分类器在文本分类任务中运行良好。