我正在尝试从以下数据集中提取POS标记信息
Sentences Characters Label
803 A Complete Bibliography of Scientific American... 128 1
1373 Mandated MVNO access would 'likely lead to del... 244 0
1257 What is PANS/PANDAS? And Why Are Cases On The ... 212 0
2405 St Laurence School | Care • Inspire • Succ Hea... 124 1
2589 Study reveals: The 50 most Instagrammed island... 212 0我正在执行以下职能:
(在Arya的建议之后)
import nltk
tagged_sentences = nltk.corpus.treebank.tagged_sents()
cutoff = int(.75 * len(tagged_sentences))
import nltk
tagged_sentences = nltk.corpus.treebank.tagged_sents()
cutoff = int(.75 * len(tagged_sentences))
def features(sentence, index):
return {
'word': sentence[index],
'is_first_word': int(index == 0),
'is_last_word': int(index == len(sentence) - 1),
'is_capitalized': sentence[index][0].upper() == sentence[index][0],
'is_all_upper': int(sentence[index].upper() == sentence[index]),
'is_all_lower': int(sentence[index].lower() == sentence[index]),
'prev_word': '' if index == 0 else sentence[index - 1],
'next_word': '' if index == len(sentence) - 1 else sentence[index + 1],
'prefix-1': sentence[index][0],
'prefix-2': sentence[index][:2],
'prefix-3': sentence[index][:3],
'suffix-1': sentence[index][-1],
'suffix-2': sentence[index][-2:],
'suffix-3': sentence[index][-3:],
}按照本文中描述的步骤:https://medium.com/analytics-vidhya/pos-tagging-using-conditional-random-fields-92077e5eaa31,我想将同样的步骤应用于我的数据(仍然考虑X、y,例如X=df[['Sentences','Characters']]和y=df['Label'] )。
X=df[['Sentences','Characters']]
y=df['Label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=40)
train_df= pd.concat([X_train, y_train], axis=1)
test_df = pd.concat([X_test, y_test], axis=1)此步骤应将数据集拆分为训练和测试。但是,我已经有了这些信息,所以我不需要将数据集拆分为训练和测试。
def untag(tagged_sentences):
return [w for w, t in tagged_sentences]
def prepareData(tagged_sentences):
X,y=[],[]
for sentence in tagged_sentences.Sentences:
X.append([features(untag(sentence), index) for index in range(len(sentence))])
y.append([tag for word,tag in sentence])
return X,y
X_train,y_train=prepareData(train_df)
X_test,y_test=prepareData(test_df)运行我的数据集,我会得到错误:
----> 8 X_train,y_train=prepareData(train_df)
ValueError: not enough values to unpack (expected 2, got 1)我希望你能告诉我如何修复ValueError。
我需要用句子来分配标签。困难在于使用我的数据集(训练和测试)来完成与我共享的链接相同的操作。
发布于 2021-02-17 21:46:04
好吧我明白问题所在了。嗯,这三个问题。
问题1. prepareData变量名
您没有仔细地复制你所用的教程。这就是他们如何定义prepareData的方法
def prepareData(tagged_sentences):
X,y=[],[]
for sentences in tagged_sentences:
X.append([features(untag(sentences), index) for index in range(len(sentences))])
y.append([tag for word,tag in sentences])
return X,y(顺便说一句,他们调用了变量sentences而不是sentence,这是一个令人非常困惑的命名约定,因为它只包含一个sentence。
但是,当您复制教程时,您在两个地方更改了名称tagged_sentences,每个地方都是不同的东西!
作为函数参数的名称,您将其更改为已使用的sentences。作为函数中变量的名称,您将其更改为training_sentences。这两个名称都会使您感到困惑,因为它们在代码中有其他含义。但他们应该匹配!尝试在两处将其重命名为tagged_sentences。
问题2. prepareData不是为DataFrame而设计的。
一旦你解决了那个问题,你就会有一个新的问题。本教程没有使用DataFrame。它用的是一张清单。您将在线路上遇到问题:
for sentences in tagged_sentences:因为在Pandas DataFrame循环上循环列名。(见我的答案这里。)
相反,你想要的是只看句子。
将这一行改为:
for sentences in tagged_sentences.Sentences:这样,您只会得到您所关心的Series。(无论如何,您没有使用Characters列!)
问题3.你不是在做词性标注!你不需要CRF!
我只是想澄清一下。POS标记意味着,对于一个句子中的每个输入单词,您可以为该单词预测一个标签。(标签是单词的词性部分。)
你不能那么做。您正在为整个句子创建一个标签。(请参阅您的Label列。)对于这种类型的问题,你不需要CRF。没有输出链。Logistic回归是一种等价的模型,它能满足你的需要。
https://stackoverflow.com/questions/66249062
复制相似问题