Как проверить список по токенизированному столбцу в пандах - PullRequest
0 голосов
/ 05 декабря 2018

Общая идея - написать скрипт, сравнивающий слова из начального списка со словами в высказывании.Поэтому я попытался

  • [x] проанализировать xml-файл
  • [x] сделать панду DataFrame
  • [] сравнить его с набором сохраненных словв переменной с именем "hedge"
  • [] выделите слова, совпадающие со словами, хранящимися в переменной
  • [], верните совпадающее "высказывание" с "name" и "id"
  • [x] записать все в файл (xml или csv)

Структура xml структурирована следующим образом:

<section name="thisisaxml-file">
    <topic>
        <utterance name="John Doe" id="264">
            foo bar?
        </utterance>
        <utterance name="Henry Parker" id="265">
            foo foo bar. New York, wind. 
        </utterance>
    </topic>
</section>

Из-за моей изумительнойя учил навыкам питона, вот что я придумал:

import pandas as pd
import xml.etree.ElementTree as ET
import nltk
from nltk.tokenize import word_tokenize

#xml file data input
xml_data = 'sample.xml'

#create an ElementTree object 
etree = ET.parse(xml_data)
doc_df = pd.DataFrame(list(iter_docs(etree.getroot())))

hedge = ['foo', 'wind', 'base']
df = pd.DataFrame({'utterance': doc_df['utterance']})
df['id'] = pd.DataFrame({'id': doc_df['id']})
df['name'] = pd.DataFrame({'name': doc_df['name']})
df['tokenized_sents'] = df.apply(lambda row: word_tokenize(row['utterance']), axis=1)
df['sents_length'] = df.apply(lambda row: len(row['tokenized_sents']), axis=1)

final = df[df.tokenized_sents.apply(lambda x: hedge in x)]
final.to_csv('out.csv', sep='\t', encoding='utf-8') #prints to file

Есть несколько проблем, с которыми я столкнулся:

  1. df['tokenized_sents'].lower() не работает, потому что (я думаю,) формата списка в pd.DataFrame(list(iter_docs(etree.getroot())))
  2. df[df.tokenized_sents.apply(lambda x: hedge in x)] работает, но ничего не возвращает, но если вы используете строку, это работает.
  3. попытался выделить найденные слова, не удалось

Так что в общем я хотел бы проверить список слов по конкретному столбцу в пандах.Хотя я видел похожие темы на этом сайте, ни одно из упомянутых решений пока не работает для меня.

У вас есть идеи для меня?

1 Ответ

0 голосов
/ 05 декабря 2018

Переменная df уже является фреймом данных со словарем в нем.Создание фреймов данных в фреймах данных повреждает ваши данные, или, по крайней мере, я видел, как они повредили некоторые из моих.Если это не всегда так, я хотел бы получить справку о том, как это сделать.В любом случае, не знаю, исправит ли это ваши проблемы, но это наверняка очистит ваш код.

hedge = ['foo', 'wind', 'base']
df = pd.DataFrame({
                 'utterance': doc_df['utterance'],
                  'id':doc_df['id'],
                  'name':doc_df['name']})
df['tokenized_sents'] = df.apply(lambda row:word_tokenize(row['utterance']),axis=1)
df['sents_length'] = df.apply(lambda row: len(row['tokenized_sents']), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...