kz930 opened a new issue, #7667:
URL: https://github.com/apache/texera/issues/7667

   ### Feature Summary
   
   The Sklearn and Sklearn Training operators vectorize one text column. `Text 
Attribute` names a single column, and the generated pipeline hands that column 
to a `CountVectorizer`, so a dataset whose text is spread over more than one 
column cannot be used as it stands.
   
   A review that carries a title and a body, or a record with a description 
beside a comment, is ordinary. Today the only way through is a Concat upstream, 
which merges the columns into one string and gives up which column each word 
came from. That distinction is usually worth keeping: a word in a title and the 
same word in a body are not the same signal.
   
   Naming several columns is not a workaround either. `CountVectorizer` takes a 
flat sequence of documents, so a two-column frame reaches it as two documents 
rather than as the rows, and it learns a vocabulary of the column names:
   
   ```
   >>> CountVectorizer().fit(df[["title", "body"]]).vocabulary_
   {'body': 0, 'title': 1}
   ```
   
   The estimator then receives two samples against however many labels, and the 
run ends with `Number of labels=15 does not match number of samples=2`.
   
   ### Proposed Solution or Design
   
   `Text Attribute` names any number of columns, and the generated pipeline 
gives each its own `CountVectorizer`, with the outputs concatenated. 
`ColumnTransformer` does this and keeps the columns distinguishable, prefixing 
each feature with the column it came from:
   
   ```python
   ColumnTransformer([
       ("short_text", CountVectorizer(), "short_text"),
       ("long_text",  CountVectorizer(), "long_text"),
   ])
   ```
   
   The operator's output is unchanged: one row of `model_name` and `model`, 
with the pipeline pickled into the binary column as before. Only the model's 
own input contract widens, from one column to the named several.
   
   The field becomes a list, and old workflows keep loading if it accepts a 
single value as one:
   
   ```scala
   @JsonFormat(with = Array(JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY))
   @AutofillAttributeNameList
   var text: List[EncodableString]
   ```
   
   `Tfidf Transformer` stays one switch over the whole matrix, which keeps the 
shape of the generated pipeline as it is:
   
   ```python
   make_pipeline(CountVectorizer(),        TfidfTransformer(), estimator())   # 
today
   make_pipeline(ColumnTransformer([...]), TfidfTransformer(), estimator())   # 
proposed
   ```
   
   Turning `Count Vectorizer` on still discards the numeric columns, as it does 
today. Carrying them along needs a way to say which columns are features, which 
the Advanced Sklearn operators have as `Selected Features` and these two 
families do not, so it is a separate change and not proposed here.
   
   A smaller alternative is to concatenate the columns into one string before a 
single `CountVectorizer`, which is what a Concat operator does today. It merges 
the vocabularies, so a word keeps no record of which column it came from, and 
the model loses a distinction it could have used.
   
   The field is declared on `SklearnModelOpDesc`, so this reaches all fifty-one 
operators of the two groups.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to