определение общих фраз на определенном диалекте

Я ищу алгоритм или метод, который помог бы идентифицировать общие фразы из корпуса текста, имеющего определенный диалект (это из определенного домена, но в моем случае это диалект английского языка) - например, следующий фрагмент может быть из более крупного корпуса, связанного с World или Warcraft или, возможно, с MMORPH.

Игроки управляют аватаром персонажа в игровом мире от третьего или первого лица, исследуя местность, сражаясь с различными монстрами, выполняя квесты и взаимодействуя с неигровыми персонажами (NPC) или другими игроками. Также как и другие MMORPG, World of Warcraft требует от игрока оплаты подписки либо путем покупки предоплаченных игровых карт на определенное количество игрового времени, либо с помощью кредитной или дебетовой карты для регулярной оплаты.

В качестве вывода из вышесказанного я хотел бы выделить следующие общие фразы:

  1. первое лицо
  2. Мир Warcraft
  3. предоплаченные игровые карты
  4. дебетовая карточка

Примечания:

  1. Есть предыдущие вопросы, похожие на мой здесь и здесь но для пояснения у меня есть следующие отличия:

    а. Я пытаюсь использовать существующий инструментарий, такой как NLTK, OpenNLP и т. Д.

    б. Я не заинтересован в выявлении других частей речи в предложении

    c. Я могу использовать вмешательство человека, когда алгоритм представляет идентифицированные словосочетания существительных эксперту-человеку, а затем эксперт-человек может подтвердить или опровергнуть результаты, однако у нас нет ресурсов для обучения модели языка на данных с ручными аннотациями


person user1172468    schedule 09.09.2013    source источник
comment
Из любопытства, как вы составляли корпус чата WoW?   -  person alvas    schedule 09.09.2013
comment
О, это был всего лишь пример - реальное целевое приложение предназначено для вертикального домена, что было бы плохим примером.   -  person user1172468    schedule 09.09.2013
comment
вам может быть интересна эта ветка: listserv. linguistlist.org/cgi-bin/   -  person alvas    schedule 13.09.2013


Ответы (2)


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

Например, в first person first - прилагательное. Вы можете автоматически предположить, что связанные прилагательные являются частью этой фразы.

В качестве альтернативы, если вы хотите определить общие фразы, я бы посоветовал реализовать простую модель цепи Маркова, а затем искать особенно высокие вероятности перехода.

Если вы ищете реализацию цепи Маркова на Python, я бы указал вам на эту суть, которую я написал в тот день: https://gist.github.com/Slater-Victoroff/6227656

Если вы хотите стать намного более продвинутым, вы быстро спуститесь на территорию диссертаций. Надеюсь, это поможет.

P.S. Nltk включает огромное количество предварительно аннотированных корпусов, которые могут подойти для ваших целей.

person Slater Victoroff    schedule 09.09.2013
comment
Большое спасибо Слейтеру, мне кажется, я ищу общие фразы - например, быть или не быть - это фраза, которую я бы хотел обозначить. - person user1172468; 09.09.2013
comment
@ user1172468 Тогда я бы определенно предложил использовать метод цепочки markoc. - person Slater Victoroff; 09.09.2013
comment
знаете ли вы о тематическом исследовании или руководстве, в котором обсуждается нечто подобное. - person user1172468; 09.09.2013

Похоже, вы пытаетесь извлечь именную фразу. Библиотека Python TextBlob включает две стандартные реализации извлечения именных фраз.

Самый простой способ начать - использовать значение по умолчанию FastNPExtractor, основанное на алгоритме Шломи Баблуки, описанном здесь.

from text.blob import TextBlob

text = '''
players control a character avatar within a game world in third person or first
person view, exploring the landscape, fighting various monsters, completing quests,
and interacting with non-player characters (NPCs) or other players. Also similar
to other MMORPGs, World of Warcraft requires the player to pay for a
subscription, either by buying prepaid game cards for a selected amount of
playing time, or by using a credit or debit card to pay on a regular basis
'''

blob = TextBlob(text)
print(blob.noun_phrases)  # ['players control', 'character avatar' ...]

Заменить другую реализацию (блокировку на основе NLTK) довольно просто.

from text.np_extractors import ConllExtractor

blob = TextBlob(text, np_extractor=ConllExtractor())

print(blob.noun_phrases)  # ['character avatar', 'game world' ...]

Если ничего из этого недостаточно, вы можете создать свой собственный класс экстрактора именных фраз. Я рекомендую посмотреть в качестве примеров исходный код модуля TextBlob np_extractor. Чтобы лучше понять разделение именных фраз на части, прочтите книгу NLTK, глава 7.

person Steve L    schedule 09.09.2013