Как исправить, чтобы токенизирующие фразы, такие как T & C, не разделялись на 'T' 'и' 'C' - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь очистить некоторые текстовые данные, готовые для методов НЛП.Мне нужно, чтобы такие шаблоны, как T & C и S & P, оставались такими, какие они есть.Однако, когда я токенизирую предложения, они разделяются на «T» и «C», а не на «T & C».

Я пытался найти исключения из правила, но не могу найти общий способ завершенияэто с учетом любой последовательности, т.е. FT & P или S & ST или S & T

import pandas as pd

from nltk import word_tokenize, pos_tag
from nltk.corpus import stopwords


en_stop = set(stopwords.words('english'))
en_stop = [word for word in en_stop]
[en_stop.append(x) for x in ['shall', 'should','please']]

def rem_stopwords(txt):
    words = [w for w in word_tokenize(txt) if w not in en_stop]
    return " ".join(words)

rem_stopwords('what is f&p doing in regards')
Out[163]: ['f', '&', 'p', 'regards']

Я хочу, чтобы вывод был ['f & p', 'regards']

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

Токенизаторы, которые поставляются с системами NLP, иногда довольно просты, и даже продвинутые могут обрабатывать некоторые крайние случаи способами, которые вы, возможно, не предпочитаете для конкретного проекта.

Итог: у вас есть несколько вариантов:

  • Найдите готовое решение, которое будет делать именно то, что вы хотите.

  • Найдите настройку или конфигурацию, которая позволяет настроить то, что вы делаетехочу.Stanford nltk имеет несколько вариантов, таких как casual, MWETokenizer, nist и punkt, а также некоторые опции, такие как добавление собственных регулярных выражений в некоторые из них (см. https://www.nltk.org/api/nltk.tokenize.html).

  • Написать код для изменения существующего решения(если это открытый исходный код, вы можете изменить сам код; многие системы также имеют API, который позволяет переопределять определенные части, не вдаваясь слишком глубоко в кишки).

  • Написать свой токенизатор изцарапина (это значительно сложнее, чем кажется).

  • Предварительная или последующая обработка данных для устранения конкретных проблем.

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

«&» - также отображается в URL-адресах, и будьте осторожны с «<», если вы анализируете HTML, и «&&», если вы анализируете код.</p>

"/" - вы, вероятно, не хотите токенизировать URL-адреса при каждом слэше (и, конечно, не хотите пытаться анализировать полученные токены, как если бы они были предложением!).Также есть 31.12.2009, 1/2 и многие другие случаи.

"-" - Hypens весьма неоднозначны: -1, 12-4, двойной дефис для дефиса уровня предложения (иоператор декремента в некотором коде), дефис в конце строки (который может или не может хотеть быть закрытым), длинные строки дефисов в качестве разделительных линий.

Кавычки - вьющиеся и прямые, одиночные-квот к апострофу для сокращений или притяжений (или неверно для множественного числа) и т. д.

Юникод вводит такие случаи, как различные типы пробелов, кавычек и тире.Многие редакторы любят «автоматически корректировать» символы Unicode, подобные этим, и даже дроби: 1/2 может закончиться как один символ (хотите, чтобы токенизатор разбил это на 3 токена?).

Довольно легко (и имхо, чрезвычайно полезное упражнение) написать небольшой набор тестовых случаев и опробовать их.Некоторые из существующих токенизаторов можно опробовать онлайн, например:

Stanford [corenlp: http://corenlp.run/]

Python NLTK: [https://text -processing.com / demo /tokenize /]

Пространство: [http://textanalysisonline.com/spacy-word-tokenize]

MorphAdorner: [http://morphadorner.northwestern.edu/morphadorner/wordtokenizer/example/]

Это лишь небольшой пример - есть много других, инекоторые из них имеют различные варианты.

Если вы хотите действительно быстрое и грязное решение только для этого одного случая, вы можете пост-обработать список токенов, чтобы повторно объединить проблемные случаи, или предварительно-обработайте его, чтобы превратить r '\ w & \ w' в некую магическую строку, которую токенизатор не сломает, а потом поверните обратно.Это в значительной степени хаки, но в некоторых случаях они могут быть в порядке.

0 голосов
/ 03 июля 2019

вы можете использовать функцию разделения вместо word_tokenize, если она лучше всего работает с вашими данными, но, согласно тексту примера, функция разделения может сделать эту работу за вас

  def rem_stopwords(txt, en_stop):
     words = [w for w in txt.split() if w not in en_stop]
     return " ".join(words)

 #o/p
 rem_stopwords('what is f&p doing in regards', en_stop)
 'f&p regards'
...