【发布时间】:2017-05-10 02:27:15
【问题描述】:
我希望能够判断一个句子在 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)
那么我如何训练分类器,例如,根据我提供的数据将新文本分类为正确或不正确?
如果有人有更好的建议,我也愿意。
【问题讨论】:
-
解决此类问题的技术上正确的方法自然是(a)从您感兴趣的领域的文本中训练语言模型(某种 RNN/LSTM,如果您想切割边缘工作),然后(b)针对已知的好句子和坏句子集合建立一个可接受的概率截止值,最后(c)使用模型为您提供的新的、看不见的句子的句子概率来分离您的二元案例。与现有答案类似,您可能应该首先确保任何这些都是值得的,不过,使用快速而肮脏的二元或三元模型。
标签: python python-2.7 python-3.x machine-learning nlp