数据框作为torchtext中的数据源
Posted
技术标签:
【中文标题】数据框作为torchtext中的数据源【英文标题】:Dataframe as datasource in torchtext 【发布时间】:2019-03-07 05:02:50 【问题描述】:我有一个数据框,它有两列(评论和情绪)。我正在使用 pytorch 和 torchtext 库来预处理数据。 是否可以在torchtext中使用数据框作为源来读取数据? 我正在寻找类似的东西,但不是
data.TabularDataset.splits(path='./data')
我对数据执行了一些操作(清理,更改为所需格式),最终数据位于数据框中。
如果不是 torchtext,您会建议哪些其他软件包有助于预处理数据帧中存在的文本数据。我在网上找不到任何东西。任何帮助都会很棒。
【问题讨论】:
【参考方案1】:从 torchtext.data
改编 Dataset
和 Example
类
from torchtext.data import Field, Dataset, Example
import pandas as pd
class DataFrameDataset(Dataset):
"""Class for using pandas DataFrames as a datasource"""
def __init__(self, examples, fields, filter_pred=None):
"""
Create a dataset from a pandas dataframe of examples and Fields
Arguments:
examples pd.DataFrame: DataFrame of examples
fields str: Field: The Fields to use in this tuple. The
string is a field name, and the Field is the associated field.
filter_pred (callable or None): use only exanples for which
filter_pred(example) is true, or use all examples if None.
Default is None
"""
self.examples = examples.apply(SeriesExample.fromSeries, args=(fields,), axis=1).tolist()
if filter_pred is not None:
self.examples = filter(filter_pred, self.examples)
self.fields = dict(fields)
# Unpack field tuples
for n, f in list(self.fields.items()):
if isinstance(n, tuple):
self.fields.update(zip(n, f))
del self.fields[n]
class SeriesExample(Example):
"""Class to convert a pandas Series to an Example"""
@classmethod
def fromSeries(cls, data, fields):
return cls.fromdict(data.to_dict(), fields)
@classmethod
def fromdict(cls, data, fields):
ex = cls()
for key, field in fields.items():
if key not in data:
raise ValueError("Specified key was not found in "
"the input data".format(key))
if field is not None:
setattr(ex, key, field.preprocess(data[key]))
else:
setattr(ex, key, data[key])
return ex
然后,首先使用torchtext.data
字段定义fields
。例如:
TEXT = data.Field(tokenize='spacy')
LABEL = data.LabelField(dtype=torch.float)
TEXT.build_vocab(train, max_size=25000, vectors="glove.6B.100d")
LABEL.build_vocab(train)
fields = 'sentiment' : LABEL, 'review' : TEXT
在简单地加载数据帧之前:
train_ds = DataFrameDataset(train_df, fields)
valid_ds = DataFrameDataset(valid_df, fields)
【讨论】:
我已经尝试过实现这一点,但不清楚“字段”应该由什么组成或如何构建。在数据框中有两个“键”的问题案例中:评论和情绪。任何进一步的阐述将不胜感激 想通了,它应该是字典的格式,其中每个键是系列名称,每个值是做什么:fields = 'sentiment':LABEL,'review':TEXT其中 label 和 text 是 torchtext 数据字段,例如: TEXT = data.Field(tokenize='spacy') LABEL = data.LabelField(dtype=torch.float) TEXT.build_vocab(train, max_size=25000, vectors="glove .6B.100d") LABEL.build_vocab(train) +1 因为这个实现遵循原来的实现逻辑和风格pytorch.org/text/_modules/torchtext/data/… @NicolaiF :变量“train”在以下行中指的是什么: TEXT.build_vocab(train, max_size=25000, vectors="glove.6B.100d") LABEL.build_vocab(train) ? @***user2010 我认为是:处理完所有字段后返回示例。【参考方案2】:谢谢杰弗里。
通过查看 torchtext.data.field 的源代码
https://pytorch.org/text/_modules/torchtext/data/field.html
看起来“train”参数需要已经是一个数据集,或者是一些可迭代的文本数据源。但鉴于我们此时尚未创建数据集,我猜您只传入了数据框中的文本列。
【讨论】:
以上是关于数据框作为torchtext中的数据源的主要内容,如果未能解决你的问题,请参考以下文章
小白学习PyTorch教程十七 PyTorch 中 数据集torchvision和torchtext
使用 torchtext.data.TabularDataset 将存储在 G 盘中的 csv 数据加载到 torchtext 格式时出现“没有这样的文件”,