Обратный процесс - PullRequest
       73

Обратный процесс

8 голосов
/ 28 февраля 2012

Я использую анализатор снежного кома lucene, чтобы выполнить остановку. Результаты не значащие слова. Я передал этот вопрос .

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

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

Ответы [ 4 ]

4 голосов
/ 29 февраля 2012

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

В качестве очень наивного решения этой проблемы, если вы знаете теги слова, вы можете попробовать сохранить слова с тегами в вашей базе данных:

run:
   NN:  runner
   VBG: running
   VBZ: runs

Затем, учитывая ствол «run» и тег «NN», вы можете определить, что «runner» является наиболее вероятным словом в этом контексте. Конечно, это решение далеко от совершенства. Примечательно, что вам нужно учитывать тот факт, что одна и та же форма слова может быть помечена по-разному в разных контекстах. Но помните, что любая попытка решить эту проблему будет в лучшем случае приблизительной.

Редактировать: из комментариев ниже, похоже, что вы, вероятно, хотите использовать лемматизацию, а не основание. Вот как можно получить леммы слов с помощью инструментов Stanford Core NLP :

import java.util.*;

import edu.stanford.nlp.pipeline.*;
import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.ling.CoreAnnotations.*;

Properties props = new Properties();

props.put("annotators", "tokenize, ssplit, pos, lemma");
pipeline = new StanfordCoreNLP(props, false);
String text = "Hello, world!";
Annotation document = pipeline.process(text);

for(CoreMap sentence: document.get(SentencesAnnotation.class)) {
    for(CoreLabel token: sentence.get(TokensAnnotation.class)) {
        String word = token.get(TextAnnotation.class);
        String lemma = token.get(LemmaAnnotation.class);
    }
}
3 голосов
/ 29 февраля 2012

Вопрос, на который вы ссылаетесь, содержит важную информацию, которая часто упускается из виду.То, что вам нужно, известно как «лемматизация» - приведение слов с перегибом к их канонической форме.Это связано, но отличается от стемминга и остается открытым вопросом исследования.Это особенно трудно для языков с более сложной морфологией (английский не так сложен). Википедия содержит список программного обеспечения, которое вы можете попробовать.Другой инструмент, который я использовал, - TreeTagger - он действительно быстрый и достаточно точный, хотя его основной целью является пометка части речи, а лемматизация - это просто бонус.Попробуйте прибегнуть к помощи «статистической лемматизации» (да, у меня есть сильные чувства по отношению к НЛП на основе правил)

1 голос
/ 05 сентября 2018

Если вы хотите сделать это на Python:

Вам может понравиться этот проект с открытым исходным кодом, который использует Stemming и содержит алгоритм для обратного Stemming:

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

Во-первых, вы остановите некоторые документы, здесь короткие (на французском языке) строки с удаленными стоп-словами, например: ['sup chat march trottoir', 'sup chat aiment ronron', 'chat ronron', 'sup chien aboi', 'deux sup chien', 'combien chien train aboi']

Тогда уловка состоит в том, чтобы вести подсчет самых популярных оригинальных слов с подсчетами для каждого слова с основанием: {'aboi': {'aboie': 1, 'aboyer': 1}, 'aiment': {'aiment': 1}, 'chat': {'chat': 1, 'chats': 2}, 'chien': {'chien': 1, 'chiens': 2}, 'combien': {'Combien': 1}, 'deux': {'Deux': 1}, 'march': {'marche': 1}, 'ronron': {'ronronner': 1, 'ronrons': 1}, 'sup': {'super': 4}, 'train': {'train': 1}, 'trottoir': {'trottoir': 1}}

Наконец, теперь вы можете догадаться, как реализовать это самостоятельно. Просто возьмите исходные слова, для которых было наибольшее количество слов, заданное основанным словом. Вы можете сослаться на следующую реализацию, которая доступна по лицензии MIT как часть проекта Multilingual-Latent-Dirichlet-Allocation-LDA :

1 голос
/ 29 февраля 2012

Вы можете взглянуть на Метатезавра NCI - хотя в основном биомедицинские по своей природе, они предлагают примеры обработки на естественном языке и некоторые наборы инструментов с открытым исходным кодом для Java, которые могут оказаться полезными при просмотре их кода.

...