Skip to content

Instantly share code, notes, and snippets.

@TiagoSantos81
Last active November 21, 2016 00:54
Show Gist options
  • Save TiagoSantos81/540eed4d497df22890aacda504959732 to your computer and use it in GitHub Desktop.
Save TiagoSantos81/540eed4d497df22890aacda504959732 to your computer and use it in GitHub Desktop.
Portuguese missing acentuation rule
# Conversion from LanguageTool rule for Catalan (@created by Jaume Ortolà) with wordlist provided by Enno @Konkekt
.../java/org/languagetool/language/Portuguese.java | 3 +-
.../rules/pt/PortugueseAccentuationCheckRule.java | 370 ++++++++++++
.../rules/pt/PortugueseAccentuationDataLoader.java | 61 ++
.../org/languagetool/rules/pt/PortugueseRule.java | 30 +
.../rules/pt/verbos_sem_acento_adj_com_acento.txt | 358 +++++++++++
.../pt/verbos_sem_acento_nomes_com_acento.txt | 666 +++++++++++++++++++++
6 files changed, 1487 insertions(+), 1 deletion(-)
diff --git a/languagetool-language-modules/pt/src/main/java/org/languagetool/language/Portuguese.java b/languagetool-language-modules/pt/src/main/java/org/languagetool/language/Portuguese.java
index 17b4f55..3fecc83 100644
--- a/languagetool-language-modules/pt/src/main/java/org/languagetool/language/Portuguese.java
+++ b/languagetool-language-modules/pt/src/main/java/org/languagetool/language/Portuguese.java
@@ -130,7 +130,8 @@ public class Portuguese extends Language {
//Specific to Portuguese:
new PostReformPortugueseCompoundRule(messages),
new PortugueseReplaceRule(messages),
- new PortugueseWordRepeatRule(messages, this)
+ new PortugueseWordRepeatRule(messages, this),
+ new PortugueseAccentuationCheckRule(messages)
//new PortugueseWrongWordInContextRule(messages)
);
}
diff --git a/languagetool-language-modules/pt/src/main/java/org/languagetool/rules/pt/PortugueseAccentuationCheckRule.java b/languagetool-language-modules/pt/src/main/java/org/languagetool/rules/pt/PortugueseAccentuationCheckRule.java
new file mode 100644
index 0000000..6b472f7
--- /dev/null
+++ b/languagetool-language-modules/pt/src/main/java/org/languagetool/rules/pt/PortugueseAccentuationCheckRule.java
@@ -0,0 +1,370 @@
+/* LanguageTool, a natural language style checker
+ * Copyright (C) 2012 Jaume Ortolà i Font
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ */
+package org.languagetool.rules.pt;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.languagetool.AnalyzedSentence;
+import org.languagetool.AnalyzedToken;
+import org.languagetool.AnalyzedTokenReadings;
+import org.languagetool.rules.Categories;
+import org.languagetool.rules.ITSIssueType;
+import org.languagetool.rules.RuleMatch;
+import org.languagetool.tools.StringTools;
+
+/**
+ * This rule checks if a word without graphical accent and with a verb POS tag
+ * should be a noun or an adjective with graphical accent. It uses two lists of
+ * word pairs: verb-noun and verb-adjective.
+ *
+ * @author Jaume Ortolà i Font
+ * l18n by Tiago F. Santos
+ * TODO Verify all exceptions that apply to Portuguese
+ * FIXME Cnverte all chunking tags to the ones used in Portuguese
+ */
+public class PortugueseAccentuationCheckRule extends PortugueseRule {
+
+ /**
+ * Patterns
+ */
+ private static final Pattern PREPOSICAO_DE = Pattern.compile("de|d[a|o]s?");
+ private static final Pattern ARTIGO_O_MS = Pattern.compile("o|O");
+ private static final Pattern ARTIGO_O_FS = Pattern.compile("a|A");
+ private static final Pattern ARTIGO_O_MP = Pattern.compile("as|As");
+ private static final Pattern ARTIGO_O_FP = Pattern.compile("os|Os");
+ private static final Pattern DETERMINANTE = Pattern.compile("D[^R].*");
+ private static final Pattern DETERMINANTE_MS = Pattern.compile("D[^R].[MC][SN].*");
+ private static final Pattern DETERMINANTE_FS = Pattern.compile("D[^R].[FC][SN].*");
+ private static final Pattern DETERMINANTE_MP = Pattern.compile("D[^R].[MC][PN].*");
+ private static final Pattern DETERMINANTE_FP = Pattern.compile("D[^R].[FC][PN].*");
+ private static final Pattern NOME_MS = Pattern.compile("NC[MC][SN].*");
+ private static final Pattern NOME_FS = Pattern.compile("NC[FC][SN].*");
+ private static final Pattern NOME_MP = Pattern.compile("NC[MC][PN].*");
+ private static final Pattern NOME_FP = Pattern.compile("NC[FC][PN].*");
+ private static final Pattern ADJETIVO_MS = Pattern.compile("A..[MC][SN].*|V.P..SM.?|PX.MS.*");
+ private static final Pattern ADJETIVO_FS = Pattern.compile("A..[FC][SN].*|V.P..SF.?|PX.FS.*");
+ private static final Pattern ADJETIVO_MP = Pattern.compile("A..[MC][PN].*|V.P..PM.?|PX.MP.*");
+ private static final Pattern ADJETIVO_FP = Pattern.compile("A..[FC][PN].*|V.P..PF.?|PX.FP.*");
+ private static final Pattern INFINITIVO = Pattern.compile("V.N.*");
+ private static final Pattern VERBO_CONJUGADO = Pattern.compile("V.[^NGP].*|_GV_");
+ private static final Pattern PARTICIPIO_MS = Pattern.compile("V.P.*SM.?");
+ private static final Pattern GRUPO_VERBAL = Pattern.compile("_GV_");
+ private static final Pattern VERBO_3S = Pattern.compile("V...3S..?");
+ private static final Pattern NOT_IN_PREV_TOKEN = Pattern.compile("VA.*|PP.*|P0.*|VSP.*");
+ private static final Pattern BEFORE_ADJECTIVE_MS = Pattern.compile("SPS00|D[^R].[MC][SN].*|V.[^NGP].*|PX.*");
+ private static final Pattern BEFORE_ADJECTIVE_FS = Pattern.compile("SPS00|D[^R].[FC][SN].*|V.[^NGP].*|PX.*");
+ private static final Pattern BEFORE_ADJECTIVE_MP = Pattern.compile("SPS00|D[^R].[MC][PN].*|V.[^NGP].*|PX.*");
+ private static final Pattern BEFORE_ADJECTIVE_FP = Pattern.compile("SPS00|D[^R].[FC][PN].*|V.[^NGP].*|PX.*");
+ private static final Pattern GN = Pattern.compile(".*_GN_.*|<?/?N[CP].*");
+ private static final Pattern EXCEPCOES_ANTES_DE = Pattern.compile("forma|manera|por|costat", Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);
+/* private static final Pattern LOCOCOES = Pattern.compile(".*LOC.*");*/
+ private static final Pattern PRONOME_PESSOAL = Pattern.compile("P0.{6}|PP3CN000|PP3NN000|PP3CP000|PP3CSD00"); // TODO Confirmar a exclusão de: PP3..A00 (coincidee COM articles determinats) se aplica ao português
+
+ private static final Map<String, AnalyzedTokenReadings> relevantWords =
+ new PortugueseAccentuationDataLoader().loadWords("/pt/verbos_sem_acento_nomes_com_acento.txt");
+ private static final Map<String, AnalyzedTokenReadings> relevantWords2 =
+ new PortugueseAccentuationDataLoader().loadWords("/pt/verbos_sem_acento_adj_com_acento.txt");
+
+ public PortugueseAccentuationCheckRule(ResourceBundle messages) throws IOException {
+ super.setCategory(Categories.MISC.getCategory(messages));
+ setLocQualityIssueType(ITSIssueType.Misspelling);
+ }
+
+ @Override
+ public String getId() {
+ return "ACCENTUATION_CHECK";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Verifica se a palavra tem de levar acento gr\u00E0fico.";
+ }
+
+ @Override
+ public RuleMatch[] match(final AnalyzedSentence sentence) {
+ final List<RuleMatch> ruleMatches = new ArrayList<>();
+ final AnalyzedTokenReadings[] tokens = sentence.getTokensWithoutWhitespace();
+ for (int i = 1; i < tokens.length; i++) {
+ // ignoring token 0, i.e. SENT_START
+ final String token;
+ if (i == 1) {
+ token = tokens[i].getToken().toLowerCase();
+ } else {
+ token = tokens[i].getToken();
+ }
+ final String prevToken = tokens[i - 1].getToken();
+ String prevPrevToken = "";
+ if (i > 2) {
+ prevPrevToken = tokens[i - 2].getToken();
+ }
+ String nextToken = "";
+ if (i < tokens.length - 1) {
+ nextToken = tokens[i + 1].getToken();
+ }
+ String nextNextToken = "";
+ if (i < tokens.length - 2) {
+ nextNextToken = tokens[i + 2].getToken();
+ }
+ boolean isRelevantWord = false;
+ boolean isRelevantWord2 = false;
+ if (StringTools.isEmpty(token)) {
+ continue;
+ }
+ if (relevantWords.containsKey(token)) {
+ isRelevantWord = true;
+ }
+ if (relevantWords2.containsKey(token)) {
+ isRelevantWord2 = true;
+ }
+
+ if (!isRelevantWord && !isRelevantWord2) {
+ continue;
+ }
+
+ // verbo precedido de pronome reflexo
+ if (matchPostagRegexp(tokens[i - 1], PRONOME_PESSOAL)
+ && !prevToken.startsWith("-")) {
+ continue;
+ }
+
+
+ String replacement = null;
+ final Matcher mPreposicaoDE = PREPOSICAO_DE.matcher(nextToken);
+ final Matcher mExcepcoesDE = EXCEPCOES_ANTES_DE.matcher(nextNextToken);
+ final Matcher mArtigoOMS = ARTIGO_O_MS.matcher(prevToken);
+ final Matcher mArtigoOFS = ARTIGO_O_FS.matcher(prevToken);
+ final Matcher mArtigoOMP = ARTIGO_O_MP.matcher(prevToken);
+ final Matcher mArtigoOFP = ARTIGO_O_FP.matcher(prevToken);
+
+ // VERB WITHOUT ACCENT -> NOUN WITH ACCENT
+ if (isRelevantWord && !matchPostagRegexp(tokens[i], GN)/* && !matchPostagRegexp(tokens[i], LOCUCOES)*/) {
+ // amb renuncies
+ if (tokens[i - 1].hasPosTag("SPS00") && !tokens[i - 1].hasPosTag("RG")
+ && !matchPostagRegexp(tokens[i - 1], DETERMINANTE)
+ && !matchPostagRegexp(tokens[i], INFINITIVO)) {
+ replacement = relevantWords.get(token).getToken();
+ }
+ // aquestes renuncies
+ else if (((matchPostagRegexp(tokens[i - 1], DETERMINANTE_MS) && matchPostagRegexp(relevantWords.get(token), NOME_MS) /*
+ && !token.equals("cantar")*/)
+ || (matchPostagRegexp(tokens[i - 1], DETERMINANTE_MP) && matchPostagRegexp(relevantWords.get(token), NOME_MP))
+ || (matchPostagRegexp(tokens[i - 1], DETERMINANTE_FS) && matchPostagRegexp(relevantWords.get(token), NOME_FS) /*
+ && !token.equals("venia") && !token.equals("tenia") && !token.equals("continua") && !token.equals("genera")
+ && !token.equals("faria")*/)
+ || (matchPostagRegexp(tokens[i - 1], DETERMINANTE_FP) && matchPostagRegexp(relevantWords.get(token), NOME_FP)))) {
+ replacement = relevantWords.get(token).getToken();
+ }
+ // fumaré una faria (correct: fària)
+ else if (i > 2
+ && matchPostagRegexp(tokens[i - 2], VERBO_CONJUGADO)
+ && ((matchPostagRegexp(tokens[i - 1], DETERMINANTE_MS) && matchPostagRegexp(relevantWords.get(token), NOME_MS))
+ || (matchPostagRegexp(tokens[i - 1], DETERMINANTE_MP) && matchPostagRegexp(relevantWords.get(token), NOME_MP))
+ || (matchPostagRegexp(tokens[i - 1], DETERMINANTE_FS) && matchPostagRegexp(relevantWords.get(token), NOME_FS))
+ || (matchPostagRegexp(tokens[i - 1], DETERMINANTE_FP) && matchPostagRegexp(relevantWords.get(token), NOME_FP)))) {
+ replacement = relevantWords.get(token).getToken();
+ }
+ // fem la copia (correct: còpia)
+ else if (i > 2
+ && matchPostagRegexp(tokens[i - 2], VERBO_CONJUGADO)
+ && ((mArtigoOMS.matches() && matchPostagRegexp(relevantWords.get(token), NOME_MS))
+ || (mArtigoOMP.matches() && matchPostagRegexp(relevantWords.get(token), NOME_MP))
+ || (mArtigoOFS.matches() && matchPostagRegexp(relevantWords.get(token), NOME_FS))
+ || (mArtigoOFP.matches() && matchPostagRegexp(relevantWords.get(token),NOME_FP)))) {
+ replacement = relevantWords.get(token).getToken();
+ }
+ // circumstancies d'una altra classe
+ else if (!matchPostagRegexp(tokens[i], PARTICIPIO_MS) /*
+ && !token.equals("venia") && !token.equals("venies")
+ && !token.equals("tenia") && !token.equals("tenies")
+ && !token.equals("faria") && !token.equals("faries")
+ && !token.equals("espero") && !token.equals("continua")
+ && !token.equals("continues") && !token.equals("cantar")
+ && !prevToken.equals("que") && !prevToken.equals("qui")
+ && !prevToken.equals("què") && mPreposicaoDE.matches() */
+ && !matchPostagRegexp(tokens[i - 1], NOT_IN_PREV_TOKEN)
+ /* && !matchPostagRegexp(tokens[i + 1], LOCUCOES) */
+ && (i < tokens.length - 2)
+ && !matchPostagRegexp(tokens[i + 2], INFINITIVO)
+ && !mExcepcoesDE.matches()
+ && !tokens[i - 1].hasPosTag("RG")) {
+ replacement = relevantWords.get(token).getToken();
+ }
+ // la renuncia del president.
+ else if (/* !token.equals("venia")
+ && !token.equals("venies") && !token.equals("tenia")
+ && !token.equals("tenies") && !token.equals("faria")
+ && !token.equals("faries") && !token.equals("continua")
+ && !token.equals("continues") && !token.equals("cantar")
+ && !token.equals("diferencia") && !token.equals("diferencies")
+ && !token.equals("distancia") && !token.equals("distancies")
+ && */ ((mArtigoOMS.matches() && matchPostagRegexp(
+ relevantWords.get(token), NOME_MS))
+ || (mArtigoOFS.matches() && matchPostagRegexp(
+ relevantWords.get(token), NOME_FS))
+ || (mArtigoOMP.matches() && matchPostagRegexp(
+ relevantWords.get(token), NOME_MP))
+ || (mArtigoOFP.matches() && matchPostagRegexp(
+ relevantWords.get(token), NOME_FP)))
+
+ && mPreposicaoDE.matches()) {
+ replacement = relevantWords.get(token).getToken();
+ }
+ // circunstancias extraordináries
+ else if (/*!token.equals("pronuncia")
+ && !token.equals("espero") && !token.equals("pronuncies")
+ && !token.equals("venia") && !token.equals("venies")
+ && !token.equals("tenia") && !token.equals("tenies")
+ && !token.equals("continua") && !token.equals("continues")
+ && !token.equals("faria") && !token.equals("faries")
+ && !token.equals("genera") && !token.equals("figuri")
+ && */ (i < tokens.length - 1)
+ && ((matchPostagRegexp(relevantWords.get(token), NOME_MS) && matchPostagRegexp(tokens[i + 1], ADJETIVO_MS))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_FS) && matchPostagRegexp(tokens[i + 1], ADJETIVO_FS))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_MP) && matchPostagRegexp(tokens[i + 1], ADJETIVO_MP))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_FP) && matchPostagRegexp(tokens[i + 1], ADJETIVO_FP)))) {
+ replacement = relevantWords.get(token).getToken();
+ }
+ // les seves contraries
+ else if ((matchPostagRegexp(relevantWords.get(token), NOME_MS) && matchPostagRegexp(tokens[i - 1], ADJETIVO_MS)
+ && !matchPostagRegexp(tokens[i], VERBO_3S) && !matchPostagRegexp(tokens[i], GRUPO_VERBAL))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_FS) && matchPostagRegexp(tokens[i - 1], ADJETIVO_FS)
+ && !matchPostagRegexp(tokens[i], VERBO_3S))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_MP) && matchPostagRegexp(tokens[i - 1], ADJETIVO_MP))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_FP) && matchPostagRegexp(tokens[i - 1], ADJETIVO_FP))) {
+ replacement = relevantWords.get(token).getToken();
+ }
+ //uma nova formula que (fórmula)
+ else if (nextToken.equals("que") && i>2
+ && ((matchPostagRegexp(relevantWords.get(token), NOME_MS) && matchPostagRegexp(tokens[i - 1], ADJETIVO_MS)
+ && matchPostagRegexp(tokens[i - 2], DETERMINANTE_MS))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_FS) && matchPostagRegexp(tokens[i - 1], ADJETIVO_FS)
+ && matchPostagRegexp(tokens[i - 2], DETERMINANTE_FS))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_MP) && matchPostagRegexp(tokens[i - 1], ADJETIVO_MP)
+ && matchPostagRegexp(tokens[i - 2], DETERMINANTE_MP))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_FP) && matchPostagRegexp(tokens[i - 1], ADJETIVO_FP)
+ && matchPostagRegexp(tokens[i - 2], DETERMINANTE_FP)))) {
+ replacement = relevantWords.get(token).getToken();
+ }
+ // les circumstancies que ens envolten
+ else if (nextToken.equals("que")
+ && ((mArtigoOMS.matches() && matchPostagRegexp(relevantWords.get(token), NOME_MS))
+ || (mArtigoOFS.matches() && matchPostagRegexp(relevantWords.get(token), NOME_FS))
+ || (mArtigoOMP.matches() && matchPostagRegexp(relevantWords.get(token), NOME_MP))
+ || (mArtigoOFP.matches() && matchPostagRegexp(relevantWords.get(token), NOME_FP)))) {
+ replacement = relevantWords.get(token).getToken();
+ }
+ // de positiva influencia
+ if (/*!token.equals("pronuncia") && !token.equals("espero") && !token.equals("pronuncies")
+ && !token.equals("venia") && !token.equals("venies") && !token.equals("tenia")
+ && !token.equals("tenies") && !token.equals("continua") && !token.equals("continues")
+ && !token.equals("faria") && !token.equals("faries") && !token.equals("genera")
+ && !token.equals("figuri")
+ && */ i>2
+ && tokens[i - 2].hasPosTag("SPS00") && !tokens[i - 2].hasPosTag("RG")
+ && ((matchPostagRegexp(relevantWords.get(token), NOME_MS) && matchPostagRegexp(tokens[i - 1], ADJETIVO_MS))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_FS) && matchPostagRegexp(tokens[i - 1], ADJETIVO_FS))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_MP) && matchPostagRegexp(tokens[i - 1], ADJETIVO_MP))
+ || (matchPostagRegexp(relevantWords.get(token), NOME_FP) && matchPostagRegexp(tokens[i - 1], ADJETIVO_FP)))) {
+ replacement = relevantWords.get(token).getToken();
+ }
+ }
+
+ // VERB WITHOUT ACCENT -> ADJECTIVE WITH ACCENT
+ if (isRelevantWord2 && !matchPostagRegexp(tokens[i], GN)/* && !matchPostagRegexp(tokens[i], LOCUCOES) */ ) {
+ // de maneira obvia, circumstancias extraordinarias.
+ if ((matchPostagRegexp(relevantWords2.get(token), ADJETIVO_MS) && matchPostagRegexp(tokens[i - 1], NOME_MS)
+ && !tokens[i - 1].hasPosTag("_GN_FS") && matchPostagRegexp(tokens[i], VERBO_CONJUGADO)
+ && !matchPostagRegexp(tokens[i], VERBO_3S))
+ || (matchPostagRegexp(relevantWords2.get(token), ADJETIVO_FS) && prevPrevToken.equalsIgnoreCase("de")
+ && (prevToken.equals("maneira") || prevToken.equals("forma")))
+ || (matchPostagRegexp(relevantWords2.get(token), ADJETIVO_MP) && matchPostagRegexp(tokens[i - 1], NOME_MP))
+ || (matchPostagRegexp(relevantWords2.get(token), ADJETIVO_FP) && matchPostagRegexp(tokens[i - 1], NOME_FP))) {
+ replacement = relevantWords2.get(token).getToken();
+ }
+ // de continua disputa
+ else if ((i < tokens.length - 1)
+ && !prevToken.equals("que")
+ && !matchPostagRegexp(tokens[i - 1], NOT_IN_PREV_TOKEN)
+ && ((matchPostagRegexp(relevantWords2.get(token), ADJETIVO_MS) && matchPostagRegexp(tokens[i + 1], NOME_MS)
+ && matchPostagRegexp(tokens[i - 1], BEFORE_ADJECTIVE_MS))
+ || (matchPostagRegexp(relevantWords2.get(token), ADJETIVO_FS) && matchPostagRegexp(tokens[i + 1], NOME_FS)
+ && matchPostagRegexp(tokens[i - 1], BEFORE_ADJECTIVE_FS))
+ || (matchPostagRegexp(relevantWords2.get(token), ADJETIVO_MP) && matchPostagRegexp(tokens[i + 1], NOME_MP)
+ && matchPostagRegexp(tokens[i - 1], BEFORE_ADJECTIVE_MP))
+ || (matchPostagRegexp(relevantWords2.get(token), ADJETIVO_FP) && matchPostagRegexp(tokens[i + 1], NOME_FP)
+ && matchPostagRegexp(tokens[i - 1], BEFORE_ADJECTIVE_FP)))) {
+ replacement = relevantWords2.get(token).getToken();
+ }
+ // a magnifica conservação
+ else if ((i < tokens.length - 1)
+ && ((matchPostagRegexp(relevantWords2.get(token), ADJETIVO_MS)
+ && matchPostagRegexp(tokens[i + 1], NOME_MS) && mArtigoOMS.matches())
+ || (matchPostagRegexp(relevantWords2.get(token), ADJETIVO_FS)
+ && matchPostagRegexp(tokens[i + 1], NOME_FS) && mArtigoOFS.matches())
+ || (matchPostagRegexp(relevantWords2.get(token), ADJETIVO_MP)
+ && matchPostagRegexp(tokens[i + 1], NOME_MP) && mArtigoOMP.matches())
+ || (matchPostagRegexp(relevantWords2.get(token), ADJETIVO_FP)
+ && matchPostagRegexp(tokens[i + 1], NOME_FP) && mArtigoOFP.matches()))) {
+ replacement = relevantWords2.get(token).getToken();
+ }
+
+ }
+ if (replacement != null) {
+ final String msg = "Se \u00E9 um nome ou um adjectivo, tem de levar acento.";
+ final RuleMatch ruleMatch = new RuleMatch(this,
+ tokens[i].getStartPos(), tokens[i].getEndPos(),
+ msg, "Falta um acento");
+ ruleMatch.setSuggestedReplacement(replacement);
+ ruleMatches.add(ruleMatch);
+ }
+ }
+ return toRuleMatchArray(ruleMatches);
+ }
+
+ /**
+ * Match POS tag with regular expression
+ */
+ private boolean matchPostagRegexp(AnalyzedTokenReadings aToken,
+ Pattern pattern) {
+ boolean matches = false;
+ for (AnalyzedToken analyzedToken : aToken) {
+ final String posTag = analyzedToken.getPOSTag();
+ if (posTag != null) {
+ final Matcher m = pattern.matcher(posTag);
+ if (m.matches()) {
+ matches = true;
+ break;
+ }
+ }
+ }
+ return matches;
+ }
+
+ @Override
+ public void reset() {
+ // nothing
+ }
+
+}
diff --git a/languagetool-language-modules/pt/src/main/java/org/languagetool/rules/pt/PortugueseAccentuationDataLoader.java b/languagetool-language-modules/pt/src/main/java/org/languagetool/rules/pt/PortugueseAccentuationDataLoader.java
new file mode 100644
index 0000000..3ddd6e8
--- /dev/null
+++ b/languagetool-language-modules/pt/src/main/java/org/languagetool/rules/pt/PortugueseAccentuationDataLoader.java
@@ -0,0 +1,61 @@
+/* LanguageTool, a natural language style checker
+ * Copyright (C) 2012 Jaume Ortolà i Font
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ */
+package org.languagetool.rules.pt;
+
+import org.languagetool.AnalyzedToken;
+import org.languagetool.AnalyzedTokenReadings;
+import org.languagetool.JLanguageTool;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Scanner;
+
+/**
+ * Load data for {@link AccentuationCheckRule}.
+ * localized from Catalan version by Tiago F. Santos
+ * @since 3.6
+ */
+class PortugueseAccentuationDataLoader {
+
+ private static final String FILE_ENCODING = "utf-8";
+
+ Map<String, AnalyzedTokenReadings> loadWords(String path) {
+ final Map<String, AnalyzedTokenReadings> map = new HashMap<>();
+ final InputStream inputStream = JLanguageTool.getDataBroker().getFromRulesDirAsStream(path);
+ try (Scanner scanner = new Scanner(inputStream, FILE_ENCODING)) {
+ while (scanner.hasNextLine()) {
+ final String line = scanner.nextLine().trim();
+ if (line.isEmpty() || line.charAt(0) == '#') { // ignore comments
+ continue;
+ }
+ final String[] parts = line.split(";");
+ if (parts.length != 3) {
+ throw new RuntimeException("Format error in file " + path + ", line: "
+ + line + ", " + "expected 3 semicolon-separated parts, got "
+ + parts.length);
+ }
+ final AnalyzedToken analyzedToken = new AnalyzedToken(parts[1], parts[2], null);
+ map.put(parts[0], new AnalyzedTokenReadings(analyzedToken, 0));
+ }
+ }
+ return map;
+ }
+
+}
diff --git a/languagetool-language-modules/pt/src/main/java/org/languagetool/rules/pt/PortugueseRule.java b/languagetool-language-modules/pt/src/main/java/org/languagetool/rules/pt/PortugueseRule.java
new file mode 100644
index 0000000..fda3a63
--- /dev/null
+++ b/languagetool-language-modules/pt/src/main/java/org/languagetool/rules/pt/PortugueseRule.java
@@ -0,0 +1,30 @@
+/* LanguageTool, a natural language style checker
+ * Copyright (C) 2012 Jaume Ortolà
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ */
+package org.languagetool.rules.pt;
+
+import org.languagetool.rules.Rule;
+
+/**
+ * Abstract base class for rules for the Portuguese language.
+ *
+ * @author Tiago F. Santos
+ */
+public abstract class PortugueseRule extends Rule {
+
+}
diff --git a/languagetool-language-modules/pt/src/main/resources/org/languagetool/rules/pt/verbos_sem_acento_adj_com_acento.txt b/languagetool-language-modules/pt/src/main/resources/org/languagetool/rules/pt/verbos_sem_acento_adj_com_acento.txt
new file mode 100644
index 0000000..0fc1476
--- /dev/null
+++ b/languagetool-language-modules/pt/src/main/resources/org/languagetool/rules/pt/verbos_sem_acento_adj_com_acento.txt
@@ -0,0 +1,358 @@
+# Similar words: verb without accent, adjective with accent; POS tag of the adjective.
+# Used by PortugueseAccentuationCheckRule.
+# This file must be encoded in UTF-8.
+#
+# List provided by Enno in (18-11-2016):
+# https://gist.githubusercontent.com/Konfekt/ec7bb1360061ca130b51776bae586fc7/raw/941fe264f88fd41eb6dcc16e83701730d7b3590c/gistfile2.txt
+#
+absona;ábsona;AQ0FS0
+absono;ábsono;AQ0MS0
+acarida;acárida;AQ0FS0
+acarido;acárido;AQ0MS0
+acera;ácera;AQ0FS0
+acida;ácida;AQ0FS0
+acido;ácido;AQ0MS0
+acidula;acídula;AQ0FS0
+acidulo;acídulo;AQ0MS0
+acrostica;acróstica;AQ0FS0
+adultera;adúltera;AQ0FS0
+adultero;adúltero;AQ0MS0
+afia;áfia;AQ0FS0
+afio;áfio;AQ0MS0
+africo;áfrico;AQ0MS0
+agrafa;ágrafa;AQ0FS0
+agrafo;ágrafo;AQ0MS0
+altissona;altíssona;AQ0FS0
+altissono;altíssono;AQ0MS0
+anodina;anódina;AQ0FS0
+anodino;anódino;AQ0MS0
+apoda;ápoda;AQ0FS0
+apode;ápode;AQ0CS0
+apodo;ápodo;AQ0MS0
+apostata;apóstata;AQ0CS0
+arbitra;árbitra;AQ0FS0
+arbitro;árbitro;AQ0MS0
+arica;árica;AQ0FS0
+arico;árico;AQ0MS0
+atica;ática;AQ0FS0
+atico;ático;AQ0MS0
+atropa;átropa;AQ0FS0
+atropo;átropo;AQ0MS0
+aurifica;aurífica;AQ0FS0
+aurifico;aurífico;AQ0MS0
+axila;áxila;AQ0FS0
+bazofia;bazófia;AQ0FS0
+bazofio;bazófio;AQ0MS0
+beatifica;beatífica;AQ0FS0
+beatifico;beatífico;AQ0MS0
+cacografo;cacógrafo;AQ0MS0
+calorifica;calorífica;AQ0FS0
+calorifico;calorífico;AQ0MS0
+celebre;célebre;AQ0CS0
+centrifuga;centrífuga;AQ0FS0
+centrifugo;centrífugo;AQ0MS0
+cientifica;científica;AQ0FS0
+cientifico;científico;AQ0MS0
+cilicio;cilício;AQ0MS0
+clinica;clínica;AQ0FS0
+clinico;clínico;AQ0MS0
+comparticipe;compartícipe;AQ0CS0
+contraria;contrária;AQ0FS0
+contrario;contrário;AQ0MS0
+critica;crítica;AQ0FS0
+critico;crítico;AQ0MS0
+cubica;cúbica;AQ0FS0
+cubico;cúbico;AQ0MS0
+custodia;custódia;AQ0FS0
+custodio;custódio;AQ0MS0
+danifica;danífica;AQ0FS0
+danifico;danífico;AQ0MS0
+decima;décima;AO0FS0
+decimo;décimo;AO0MS0
+decrepita;decrépita;AQ0FS0
+decrepito;decrépito;AQ0MS0
+decupla;décupla;AO0FS0
+decuplo;décuplo;AO0MS0
+deifica;deífica;AQ0FS0
+deifico;deífico;AQ0MS0
+digito;dígito;AQ0MS0
+dilucida;dilúcida;AQ0FS0
+dilucido;dilúcido;AQ0MS0
+dissona;díssona;AQ0FS0
+dissono;díssono;AQ0MS0
+distrofica;distrófica;AQ0FS0
+distrofico;distrófico;AQ0MS0
+dizima;dízima;AQ0FS0
+dizimo;dízimo;AQ0MS0
+domestica;doméstica;AQ0FS0
+domestico;doméstico;AQ0MS0
+dulcifica;dulcífica;AQ0FS0
+dulcifico;dulcífico;AQ0MS0
+elicito;elícito;AQ0MS0
+emula;émula;AQ0FS0
+emulo;émulo;AQ0MS0
+entropica;entrópica;AQ0FS0
+entropico;entrópico;AQ0MS0
+epigramatica;epigramática;AQ0FS0
+epigramatico;epigramático;AQ0MS0
+esdruxula;esdrúxula;AQ0FS0
+especifica;específica;AQ0FS0
+especifico;específico;AQ0MS0
+espirita;espírita;AQ0CS0
+estridula;estrídula;AQ0FS0
+estridulo;estrídulo;AQ0MS0
+estupida;estúpida;AQ0FS0
+estupido;estúpido;AQ0MS0
+eximia;exímia;AQ0FS0
+explicita;explícita;AQ0FS0
+explicito;explícito;AQ0MS0
+exubere;exúbere;AQ0CS0
+facundia;facúndia;AQ0FS0
+falsifica;falsífica;AQ0FS0
+falsifico;falsífico;AQ0MS0
+filosofa;filósofa;AQ0FS0
+filosofo;filósofo;AQ0MS0
+formica;fórmica;AQ0FS0
+formico;fórmico;AQ0MS0
+frigia;frígia;AQ0FS0
+frigorifica;frigorífica;AQ0FS0
+frigorifico;frigorífico;AQ0MS0
+fulgura;fúlgura;AQ0FS0
+fulguro;fúlguro;AQ0MS0
+galderia;galdéria;AQ0FS0
+galderio;galdério;AQ0MS0
+galica;gálica;AQ0FS0
+galico;gálico;AQ0MS0
+gauderio;gaudério;AQ0MS0
+ginastica;ginástica;AQ0FS0
+ginastico;ginástico;AQ0MS0
+gramatica;gramática;AQ0FS0
+gramatico;gramático;AQ0MS0
+gratifica;gratífica;AQ0FS0
+gratifico;gratífico;AQ0MS0
+gravida;grávida;AQ0FS0
+gravido;grávido;AQ0MS0
+hibrida;híbrida;AQ0FS0
+hilaria;hilária;AQ0FS0
+hilario;hilário;AQ0MS0
+hispida;híspida;AQ0FS0
+hispido;híspido;AQ0MS0
+holografa;hológrafa;AQ0FS0
+holografo;hológrafo;AQ0MS0
+homologa;homóloga;AQ0FS0
+homologo;homólogo;AQ0MS0
+honorifica;honorífica;AQ0FS0
+honorifico;honorífico;AQ0MS0
+horrifica;horrífica;AQ0FS0
+horrifico;horrífico;AQ0MS0
+hospede;hóspede;AQ0CS0
+ideografa;ideógrafa;AQ0FS0
+ideografo;ideógrafo;AQ0MS0
+idolatra;idólatra;AQ0CS0
+ignifuga;ignífuga;AQ0FS0
+ignifugo;ignífugo;AQ0MS0
+ilegitima;ilegítima;AQ0FS0
+ilegitimo;ilegítimo;AQ0MS0
+improba;ímproba;AQ0FS0
+improbo;ímprobo;AQ0MS0
+impropria;imprópria;AQ0FS0
+improprio;impróprio;AQ0MS0
+incuba;íncuba;AQ0FS0
+indica;índica;AQ0FS0
+indico;índico;AQ0MS0
+individua;indivídua;AQ0FS0
+individuo;indivíduo;AQ0MS0
+insipida;insípida;AQ0FS0
+insipido;insípido;AQ0MS0
+integra;íntegra;AQ0FS0
+integro;íntegro;AQ0MS0
+intima;íntima;AQ0FS0
+intimo;íntimo;AQ0MS0
+jornalistica;jornalística;AQ0FS0
+jornalistico;jornalístico;AQ0MS0
+lacera;lácera;AQ0FS0
+lacero;lácero;AQ0MS0
+lapidifica;lapidífica;AQ0FS0
+lapidifico;lapidífico;AQ0MS0
+legifera;legífera;AQ0FS0
+legifero;legífero;AQ0MS0
+legitima;legítima;AQ0FS0
+legitimo;legítimo;AQ0MS0
+letifica;letífica;AQ0FS0
+letifico;letífico;AQ0MS0
+licita;lícita;AQ0FS0
+licito;lícito;AQ0MS0
+lidima;lídima;AQ0FS0
+lidimo;lídimo;AQ0MS0
+lirica;lírica;AQ0FS0
+lirico;lírico;AQ0MS0
+litica;lítica;AQ0FS0
+litico;lítico;AQ0MS0
+livida;lívida;AQ0FS0
+livido;lívido;AQ0MS0
+logica;lógica;AQ0FS0
+logico;lógico;AQ0MS0
+lubrica;lúbrica;AQ0FS0
+lubrico;lúbrico;AQ0MS0
+lucida;lúcida;AQ0FS0
+lucido;lúcido;AQ0MS0
+macambuzia;macambúzia;AQ0FS0
+macambuzio;macambúzio;AQ0MS0
+magica;mágica;AQ0FS0
+magico;mágico;AQ0MS0
+magnifica;magnífica;AQ0FS0
+magnifico;magnífico;AQ0MS0
+media;média;AQ0FS0
+medica;médica;AQ0FS0
+medico;médico;AQ0MS0
+melifica;melífica;AQ0FS0
+melifico;melífico;AQ0MS0
+meretricia;meretrícia;AQ0FS0
+meretricio;meretrício;AQ0MS0
+metafisica;metafísica;AQ0FS0
+metafisico;metafísico;AQ0MS0
+mimica;mímica;AQ0FS0
+mimico;mímico;AQ0MS0
+minuscula;minúscula;AQ0FS0
+minusculo;minúsculo;AQ0MS0
+mirifica;mirífica;AQ0FS0
+mirifico;mirífico;AQ0MS0
+misera;mísera;AQ0FS0
+misero;mísero;AQ0MS0
+modica;módica;AQ0FS0
+modico;módico;AQ0MS0
+monografa;monógrafa;AQ0FS0
+monografo;monógrafo;AQ0MS0
+murmura;múrmura;AQ0FS0
+murmuro;múrmuro;AQ0MS0
+musica;música;AQ0FS0
+musico;músico;AQ0MS0
+mutua;mútua;AQ0FS0
+mutuo;mútuo;AQ0MS0
+obvia;óbvia;AQ0FS0
+obvio;óbvio;AQ0MS0
+pacifica;pacífica;AQ0FS0
+pacifico;pacífico;AQ0MS0
+panegirico;panegírico;AQ0MS0
+paralitica;paralítica;AQ0FS0
+paralitico;paralítico;AQ0MS0
+participe;partícipe;AQ0CS0
+perdularia;perdulária;AQ0FS0
+perdulario;perdulário;AQ0MS0
+perpetua;perpétua;AQ0FS0
+perpetuo;perpétuo;AQ0MS0
+pervia;pérvia;AQ0FS0
+pestifera;pestífera;AQ0FS0
+pestifero;pestífero;AQ0MS0
+petrifica;petrífica;AQ0FS0
+petrifico;petrífico;AQ0MS0
+placida;plácida;AQ0FS0
+placido;plácido;AQ0MS0
+politica;política;AQ0FS0
+politico;político;AQ0MS0
+pratica;prática;AQ0FS0
+pratico;prático;AQ0MS0
+precipite;precípite;AQ0CS0
+prepostera;prepóstera;AQ0FS0
+prepostero;prepóstero;AQ0MS0
+previa;prévia;AQ0FS0
+pristina;prístina;AQ0FS0
+pristino;prístino;AQ0MS0
+prodiga;pródiga;AQ0FS0
+prodigo;pródigo;AQ0MS0
+prognostica;prognóstica;AQ0FS0
+prolifica;prolífica;AQ0FS0
+prolifico;prolífico;AQ0MS0
+pronostica;pronóstica;AQ0FS0
+pronostico;pronóstico;AQ0MS0
+propicia;propícia;AQ0FS0
+propicio;propício;AQ0MS0
+prospera;próspera;AQ0FS0
+prospero;próspero;AQ0MS0
+publica;pública;AQ0FS0
+publico;público;AQ0MS0
+purpura;púrpura;AQ0CN0
+quadrupede;quadrúpede;AQ0CS0
+rabida;rábida;AQ0FS0
+rabido;rábido;AQ0MS0
+rabula;rábula;AQ0CS0
+reciproca;recíproca;AQ0FS0
+reciproco;recíproco;AQ0MS0
+regia;régia;AQ0FS0
+rememora;remémora;AQ0FS0
+rememoro;remémoro;AQ0MS0
+republica;república;AQ0FS0
+republico;repúblico;AQ0MS0
+retorica;retórica;AQ0FS0
+retorico;retórico;AQ0MS0
+retrograda;retrógrada;AQ0FS0
+retrogrado;retrógrado;AQ0MS0
+rustica;rústica;AQ0FS0
+rustico;rústico;AQ0MS0
+rutila;rútila;AQ0FS0
+rutilo;rútilo;AQ0MS0
+sabia;sábia;AQ0FS0
+sacrifica;sacrífica;AQ0FS0
+sacrifico;sacrífico;AQ0MS0
+sanguifica;sanguífica;AQ0FS0
+sanguifico;sanguífico;AQ0MS0
+secia;sécia;AQ0FS0
+secio;sécio;AQ0MS0
+selvatica;selvática;AQ0FS0
+selvatico;selvático;AQ0MS0
+seria;séria;AQ0FS0
+serio;sério;AQ0MS0
+servia;sérvia;AQ0FS0
+silogistica;silogística;AQ0FS0
+silogistico;silogístico;AQ0MS0
+sofistica;sofística;AQ0FS0
+sofistico;sofístico;AQ0MS0
+solida;sólida;AQ0FS0
+solido;sólido;AQ0MS0
+somitica;somítica;AQ0FS0
+somitico;somítico;AQ0MS0
+substantifica;substantífica;AQ0FS0
+substantifico;substantífico;AQ0MS0
+sucia;súcia;AQ0FS0
+sucio;súcio;AQ0MS0
+sudorifica;sudorífica;AQ0FS0
+sudorifico;sudorífico;AQ0MS0
+sumaria;sumária;AQ0FS0
+sumario;sumário;AQ0MS0
+supera;súpera;AQ0FS0
+supero;súpero;AQ0MS0
+terrifica;terrífica;AQ0FS0
+terrifico;terrífico;AQ0MS0
+tipica;típica;AQ0FS0
+tipico;típico;AQ0MS0
+tisica;tísica;AQ0FS0
+tisico;tísico;AQ0MS0
+toxica;tóxica;AQ0FS0
+toxico;tóxico;AQ0MS0
+translucida;translúcida;AQ0FS0
+translucido;translúcido;AQ0MS0
+trepida;trépida;AQ0FS0
+trepido;trépido;AQ0MS0
+tropica;trópica;AQ0FS0
+tropico;trópico;AQ0MS0
+ultima;última;AO0FS0
+ultimo;último;AO0MS0
+valida;válida;AQ0FS0
+valido;válido;AQ0MS0
+varia;vária;AQ0FS0
+vario;vário;AQ0MS0
+vegeta;végeta;AQ0FS0
+vegeto;végeto;AQ0MS0
+venefica;venéfica;AQ0FS0
+venefico;venéfico;AQ0MS0
+venera;vénera;AQ0FS0
+venero;vénero;AQ0MS0
+vermifuga;vermífuga;AQ0FS0
+versifica;versífica;AQ0FS0
+versifico;versífico;AQ0MS0
+vitalicia;vitalícia;AQ0FS0
+vitalicio;vitalício;AQ0MS0
+vivifica;vivífica;AQ0FS0
+vivifico;vivífico;AQ0MS0
+voluntaria;voluntária;AQ0FS0
+voluntario;voluntário;AQ0MS0
diff --git a/languagetool-language-modules/pt/src/main/resources/org/languagetool/rules/pt/verbos_sem_acento_nomes_com_acento.txt b/languagetool-language-modules/pt/src/main/resources/org/languagetool/rules/pt/verbos_sem_acento_nomes_com_acento.txt
new file mode 100644
index 0000000..aa34e96
--- /dev/null
+++ b/languagetool-language-modules/pt/src/main/resources/org/languagetool/rules/pt/verbos_sem_acento_nomes_com_acento.txt
@@ -0,0 +1,666 @@
+# Similar words: verb without accent, noun with accent; POS tag of the noun.
+# Used by AccentuationCheckRule.
+# This file must be encoded in UTF-8.
+#
+# List provided by Enno in (18-11-2016):
+# https://gist.githubusercontent.com/Konfekt/ec7bb1360061ca130b51776bae586fc7/raw/941fe264f88fd41eb6dcc16e83701730d7b3590c/gistfile2.txt
+#
+apostata;apóstata;NCCS000
+abobada;abóbada;NCFS000
+abobora;abóbora;NCFS000
+abrenuncio;abrenúncio;NCMS000
+absintio;absíntio;NCMS000
+abundancia;abundância;NCFS000
+acarido;acárido;NCMS000
+acaro;ácaro;NCMS000
+acedia;acédia;NCFS000
+acequia;acéquia;NCFS000
+acero;ácero;NCMS000
+acicula;acícula;NCFS000
+acido;ácido;NCMS000
+acolito;acólito;NCMS000
+acrostico;acróstico;NCMS000
+acumulo;acúmulo;NCMS000
+adagio;adágio;NCMS000
+adito;ádito;NCMS000
+adminiculo;adminículo;NCMS000
+adultera;adúltera;NCFS000
+adultero;adúltero;NCMS000
+adverbio;advérbio;NCMS000
+africa;áfrica;NCFS000
+agencia;agência;NCFS000
+agua;água;NCFS000
+algalia;algália;NCFS000
+alivio;alívio;NCMS000
+almecega;almécega;NCFS000
+alvidro;álvidro;NCMS000
+amalgama;amálgama;NCFS000
+amasia;amásia;NCFS000
+amasio;amásio;NCMS000
+amnesia;amnésia;NCFS000
+analise;análise;NCFS000
+angustia;angústia;NCFS000
+animatografo;animatógrafo;NCMS000
+aniversario;aniversário;NCMS000
+antifona;antífona;NCFS000
+anuncio;anúncio;NCMS000
+apanagio;apanágio;NCMS000
+apendiculo;apendículo;NCMS000
+apocope;apócope;NCFS000
+apode;ápode;NCMS000
+apodo;ápodo;NCMS000
+apostola;apóstola;NCFS000
+apostolo;apóstolo;NCMS000
+apostrofe;apóstrofe;NCFS000
+apostrofo;apóstrofo;NCMS000
+apozema;apózema;NCMS000
+aprestamo;apréstamo;NCMS000
+arbitro;árbitro;NCMS000
+ardosia;ardósia;NCFS000
+argucia;argúcia;NCFS000
+aria;ária;NCCS000
+arteriografo;arteriógrafo;NCMS000
+articulo;artículo;NCMS000
+artificio;artifício;NCMS000
+arvore;árvore;NCFS000
+ascua;áscua;NCFS000
+asia;ásia;NPFSG00
+assedio;assédio;NCMS000
+astucia;astúcia;NCFS000
+atica;ática;NCFS000
+atico;ático;NCMS000
+auspicio;auspício;NCMS000
+autobiografa;autobiógrafa;NCFS000
+autobiografo;autobiógrafo;NCMS000
+autocopia;autocópia;NCFS000
+autocritica;autocrítica;NCFS000
+autografo;autógrafo;NCMS000
+auxilio;auxílio;NCMS000
+avila;ávila;NCFS000
+azafama;azáfama;NCFS000
+balbucie;balbúcie;NCFS000
+balburdia;balbúrdia;NCFS000
+balsamo;bálsamo;NCMS000
+bascula;báscula;NCFS000
+basculo;básculo;NCMS000
+batega;bátega;NCFS000
+bazofia;bazófia;NCCS000
+beneficio;benefício;NCMS000
+bibliografa;bibliógrafa;NCFS000
+bibliografo;bibliógrafo;NCMS000
+binoculo;binóculo;NCMS000
+biografa;biógrafa;NCFS000
+biografo;biógrafo;NCMS000
+biopsia;biópsia;NCFS000
+bussola;bússola;NCFS000
+buzio;búzio;NCMS000
+cabula;cábula;NCCS000
+cacografo;cacógrafo;NCMS000
+cadencia;cadência;NCFS000
+cadmio;cádmio;NCMS000
+calamo;cálamo;NCMS000
+calcografo;calcógrafo;NCMS000
+calculo;cálculo;NCMS000
+caliculo;calículo;NCMS000
+caligrafo;calígrafo;NCMS000
+calorifico;calorífico;NCMS000
+calunia;calúnia;NCFS000
+cantarida;cantárida;NCFS000
+cantaride;cantáride;NCFS000
+capitula;capítula;NCFS000
+capitulo;capítulo;NCMS000
+capsula;cápsula;NCFS000
+carcere;cárcere;NCMS000
+cardia;cárdia;NCFS000
+caricia;carícia;NCFS000
+carie;cárie;NCFS000
+cartografa;cartógrafa;NCFS000
+cartografo;cartógrafo;NCMS000
+catalise;catálise;NCFS000
+catalogo;catálogo;NCMS000
+cilicio;cilício;NCMS000
+cinematografo;cinematógrafo;NCMS000
+cingulo;cíngulo;NCMS000
+circio;círcio;NCMS000
+circulo;círculo;NCMS000
+circunstancia;circunstância;NCFS000
+citola;cítola;NCFS000
+clemencia;clemência;NCFS000
+clinica;clínica;NCFS000
+clinico;clínico;NCMS000
+cocega;cócega;NCFS000
+coloquio;colóquio;NCMS000
+comedia;comédia;NCFS000
+comercio;comércio;NCMS000
+comissaria;comissária;NCFS000
+comissario;comissário;NCMS000
+comparticipe;compartícipe;NCCS000
+compendio;compêndio;NCMS000
+concilio;concílio;NCMS000
+conferencia;conferência;NCFS000
+confidencia;confidência;NCFS000
+consocio;consócio;NCMS000
+consorcio;consórcio;NCMS000
+contagio;contágio;NCMS000
+contingencia;contingência;NCFS000
+contraria;contrária;NCFS000
+contrario;contrário;NCMS000
+conventiculo;conventículo;NCMS000
+copia;cópia;NCFS000
+copiografo;copiógrafo;NCMS000
+copula;cópula;NCFS000
+coreografa;coreógrafa;NCFS000
+coreografo;coreógrafo;NCMS000
+corografo;corógrafo;NCMS000
+craticula;cratícula;NCFS000
+credencia;credência;NCFS000
+credito;crédito;NCMS000
+criptografa;criptógrafa;NCFS000
+criptografo;criptógrafo;NCMS000
+critica;crítica;NCFS000
+critico;crítico;NCMS000
+cumulo;cúmulo;NCMS000
+curia;cúria;NCFS000
+curio;cúrio;NCMS000
+custodia;custódia;NCFS000
+custodio;custódio;NCMS000
+dactilografa;dactilógrafa;NCFS000
+dactilografo;dactilógrafo;NCMS000
+dadiva;dádiva;NCFS000
+daguerreotipo;daguerreótipo;NCMS000
+debito;débito;NCMS000
+decima;décima;NCFS000
+decuria;decúria;NCFS000
+delicia;delícia;NCFS000
+demografa;demógrafa;NCFS000
+demografo;demógrafo;NCMS000
+denticulo;dentículo;NCMS000
+denuncia;denúncia;NCFS000
+deposito;depósito;NCMS000
+descredito;descrédito;NCMS000
+desmemoria;desmemória;NCFS000
+desprestigio;desprestígio;NCMS000
+despronuncia;despronúncia;NCFS000
+desproposito;despropósito;NCMS000
+diagnostico;diagnóstico;NCMS000
+dialise;diálise;NCFS000
+dicionario;dicionário;NCMS000
+diferencia;diferença;NCFS000
+diligencia;diligência;NCFS000
+diluvio;dilúvio;NCMS000
+dissidio;dissídio;NCMS000
+distancia;distância;NCFS000
+divorcio;divórcio;NCMS000
+dizima;dízima;NCFS000
+dizimo;dízimo;NCMS000
+domestica;doméstica;NCFS000
+domestico;doméstico;NCMS000
+domicilio;domicílio;NCMS000
+duvida;dúvida;NCFS000
+edicula;edícula;NCFS000
+edito;édito;NCMS000
+eficacia;eficácia;NCFS000
+efigie;efígie;NCFS000
+electrolise;electrólise;NCFS000
+eminencia;eminência;NCFS000
+empresaria;empresária;NCFS000
+empresario;empresário;NCMS000
+emula;émula;NCFS000
+emulo;émulo;NCMS000
+enxarcia;enxárcia;NCFS000
+enxundia;enxúndia;NCFS000
+epigrafe;epígrafe;NCFS000
+epilogo;epílogo;NCMS000
+episodio;episódio;NCMS000
+epistola;epístola;NCFS000
+epiteto;epíteto;NCMS000
+epitome;epítome;NCMS000
+escolio;escólio;NCMS000
+escoria;escória;NCFS000
+esdruxulo;esdrúxulo;NCMS000
+especie;espécie;NCFS000
+especulo;espéculo;NCMS000
+esperancia;esperança;NCFS000
+espicula;espícula;NCFS000
+espiculo;espículo;NCMS000
+espirita;espírita;NCCS000
+espirito;espírito;NCMS000
+espolio;espólio;NCMS000
+esportula;espórtula;NCFS000
+esporulo;espórulo;NCMS000
+estadio;estádio;NCMS000
+estagio;estágio;NCMS000
+estancia;estância;NCFS000
+estenografa;estenógrafa;NCFS000
+estenografo;estenógrafo;NCMS000
+estereotipo;estereótipo;NCMS000
+estimulo;estímulo;NCMS000
+estipendio;estipêndio;NCMS000
+estipula;estípula;NCFS000
+estoria;estória;NCFS000
+estrategia;estratégia;NCFS000
+estrepito;estrépito;NCMS000
+estupida;estúpida;NCFS000
+estupido;estúpido;NCMS000
+esturdia;estúrdia;NCFS000
+evidencia;evidência;NCFS000
+exercito;exército;NCMS000
+exilio;exílio;NCMS000
+exordio;exórdio;NCMS000
+experiencia;experiência;NCFS000
+extravagancia;extravagância;NCFS000
+fabrica;fábrica;NCFS000
+fabula;fábula;NCFS000
+facecia;facécia;NCFS000
+facundia;facúndia;NCFS000
+falacia;falácia;NCFS000
+falporria;falpórria;NCCS000
+fanfurria;fanfúrria;NCFS000
+farofia;farófia;NCFS000
+fastigio;fastígio;NCMS000
+feria;féria;NCFS000
+filosofa;filósofa;NCFS000
+filosofo;filósofo;NCMS000
+fimbria;fímbria;NCFS000
+financia;finança;NCFS000
+fistula;fístula;NCFS000
+flagicio;flagício;NCMS000
+floculo;flóculo;NCMS000
+folio;fólio;NCMS000
+fonografo;fonógrafo;NCMS000
+formica;fórmica;NCFS000
+formula;fórmula;NCFS000
+fosforo;fósforo;NCMS000
+fotocopia;fotocópia;NCFS000
+fotografa;fotógrafa;NCFS000
+fotografo;fotógrafo;NCMS000
+fototipo;fotótipo;NCMS000
+frigia;frígia;NCFS000
+frigorifico;frigorífico;NCMS000
+gabia;gábia;NCFS000
+galderia;galdéria;NCFS000
+galderio;galdério;NCMS000
+ganancia;ganância;NCFS000
+garrulo;gárrulo;NCMS000
+gastrula;gástrula;NCFS000
+gauderio;gaudério;NCMS000
+gazua;gázua;NCFS000
+gemula;gémula;NCFS000
+geografa;geógrafa;NCFS000
+geografo;geógrafo;NCMS000
+gerencia;gerência;NCFS000
+ginastica;ginástica;NCFS000
+gladio;gládio;NCMS000
+gloria;glória;NCFS000
+gramatica;gramática;NCFS000
+gramatico;gramático;NCMS000
+gravida;grávida;NCFS000
+habito;hábito;NCMS000
+halito;hálito;NCMS000
+hemodialise;hemodiálise;NCFS000
+hemolise;hemólise;NCFS000
+hernia;hérnia;NCFS000
+hibrido;híbrido;NCMS000
+hidrolise;hidrólise;NCFS000
+hilaria;hilária;NCFS000
+historia;história;NCFS000
+homicidio;homicídio;NCMS000
+homilia;homília;NCFS000
+horoscopo;horóscopo;NCMS000
+hospede;hóspede;NCCS000
+ictericia;icterícia;NCFS000
+ideografa;ideógrafa;NCFS000
+ideografo;ideógrafo;NCMS000
+idolatra;idólatra;NCCS000
+ignominia;ignomínia;NCFS000
+impertinencia;impertinência;NCFS000
+impeto;ímpeto;NCMS000
+incubo;íncubo;NCMS000
+indicio;indício;NCMS000
+individua;indivídua;NCFS000
+individuo;indivíduo;NCMS000
+indulgencia;indulgência;NCFS000
+industria;indústria;NCFS000
+inercia;inércia;NCFS000
+influencia;influência;NCFS000
+inicio;início;NCMS000
+injuria;injúria;NCFS000
+insidia;insídia;NCFS000
+insignia;insígnia;NCFS000
+instancia;instância;NCFS000
+insula;ínsula;NCFS000
+integra;íntegra;NCFS000
+inteligencia;inteligência;NCFS000
+intimo;íntimo;NCMS000
+inventario;inventário;NCMS000
+invidia;invídia;NCFS000
+involucro;invólucro;NCMS000
+iridio;irídio;NCMS000
+irreverencia;irreverência;NCFS000
+jactancia;jactância;NCFS000
+jaculo;jáculo;NCMS000
+jubilo;júbilo;NCMS000
+lagrima;lágrima;NCFS000
+lamuria;lamúria;NCFS000
+lapida;lápida;NCFS000
+lapide;lápide;NCFS000
+larapia;larápia;NCFS000
+larapio;larápio;NCMS000
+lastima;lástima;NCFS000
+latego;látego;NCMS000
+lazara;lázara;NCFS000
+lazaro;lázaro;NCMS000
+legifera;legífera;NCFS000
+legifero;legífero;NCMS000
+legitima;legítima;NCFS000
+leria;léria;NCCS000
+lexicografa;lexicógrafa;NCFS000
+lexicografo;lexicógrafo;NCMS000
+licencia;licença;NCFS000
+ligula;lígula;NCFS000
+ligulo;lígulo;NCMS000
+linotipo;linótipo;NCMS000
+lipolise;lipólise;NCMS000
+lirica;lírica;NCFS000
+lirico;lírico;NCMS000
+litigio;litígio;NCMS000
+litografa;litógrafa;NCFS000
+litografo;litógrafo;NCMS000
+lixivia;lixívia;NCFS000
+logica;lógica;NCFS000
+logico;lógico;NCMS000
+lunula;lúnula;NCFS000
+luxuria;luxúria;NCFS000
+macambuzia;macambúzia;NCFS000
+macambuzio;macambúzio;NCMS000
+macula;mácula;NCFS000
+mafia;máfia;NCFS000
+magica;mágica;NCFS000
+magnifica;magnífica;NCFS000
+magnifico;magnífico;NCMS000
+magoa;mágoa;NCFS000
+maleficio;malefício;NCMS000
+malicia;malícia;NCFS000
+manigancia;manigância;NCFS000
+mascara;máscara;NCFS000
+matico;mático;NCMS000
+matria;mátria;NCFS000
+matricula;matrícula;NCFS000
+mecanografa;mecanógrafa;NCFS000
+mecanografo;mecanógrafo;NCMS000
+media;média;NCFS000
+medica;médica;NCFS000
+medico;médico;NCMS000
+memoria;memória;NCFS000
+meretricio;meretrício;NCMS000
+metafisica;metafísica;NCFS000
+metafisico;metafísico;NCMS000
+microbio;micróbio;NCMS000
+micrografo;micrógrafo;NCMS000
+milicia;milícia;NCFS000
+milimetro;milímetro;NCMS000
+milite;mílite;NCMS000
+mimeografo;mimeógrafo;NCMS000
+mimica;mímica;NCFS000
+mimico;mímico;NCMS000
+mingua;míngua;NCFS000
+minio;mínio;NCMS000
+minucia;minúcia;NCFS000
+minudencia;minudência;NCFS000
+minuscula;minúscula;NCFS000
+mobile;móbile;NCMS000
+modulo;módulo;NCMS000
+monodia;monódia;NCFS000
+monografa;monógrafa;NCFS000
+monografo;monógrafo;NCMS000
+monologo;monólogo;NCMS000
+monotipo;monótipo;NCMS000
+municio;munício;NCMS000
+murmurio;murmúrio;NCMS000
+musica;música;NCFS000
+musico;músico;NCMS000
+mutua;mútua;NCFS000
+mutuo;mútuo;NCMS000
+necrologio;necrológio;NCMS000
+negligencia;negligência;NCFS000
+negocio;negócio;NCMS000
+nevoa;névoa;NCFS000
+nodoa;nódoa;NCFS000
+noticia;notícia;NCFS000
+numero;número;NCMS000
+nuncio;núncio;NCMS000
+oficio;ofício;NCMS000
+opera;ópera;NCFS000
+opio;ópio;NCMS000
+orbita;órbita;NCFS000
+orografa;orógrafa;NCFS000
+orografo;orógrafo;NCMS000
+ortografa;ortógrafa;NCFS000
+ortografo;ortógrafo;NCMS000
+osculo;ósculo;NCMS000
+ovalo;óvalo;NCMS000
+ovulo;óvulo;NCMS000
+oxido;óxido;NCMS000
+pabulo;pábulo;NCMS000
+pagina;página;NCFS000
+paleografa;paleógrafa;NCFS000
+paleografo;paleógrafo;NCMS000
+palio;pálio;NCMS000
+palmatoria;palmatória;NCFS000
+panegirico;panegírico;NCMS000
+panria;pânria;NCCS000
+pantografo;pantógrafo;NCMS000
+paragrafo;parágrafo;NCMS000
+paralise;parálise;NCFS000
+paralitica;paralítica;NCFS000
+paralitico;paralítico;NCMS000
+paria;pária;NCCS000
+parodia;paródia;NCFS000
+paroquia;paróquia;NCFS000
+participe;partícipe;NCCS000
+pascoa;páscoa;NCFS000
+patina;pátina;NCFS000
+patio;pátio;NCMS000
+pendencia;pendência;NCFS000
+penitencia;penitência;NCFS000
+perdularia;perdulária;NCFS000
+perdulario;perdulário;NCMS000
+pericia;perícia;NCFS000
+perola;pérola;NCFS000
+peroxido;peróxido;NCMS000
+pestilencia;pestilência;NCFS000
+pilheria;pilhéria;NCFS000
+pilula;pílula;NCFS000
+pirografo;pirógrafo;NCMS000
+pirolise;pirólise;NCFS000
+placito;plácito;NCMS000
+plagio;plágio;NCMS000
+planimetro;planímetro;NCMS000
+plasmolise;plasmólise;NCFS000
+policia;polícia;NCCS000
+politica;política;NCFS000
+politico;político;NCMS000
+pornografo;pornógrafo;NCMS000
+posfacio;posfácio;NCMS000
+potencia;potência;NCFS000
+povoa;póvoa;NCFS000
+pratica;prática;NCFS000
+pratico;prático;NCMS000
+predica;prédica;NCFS000
+prefacio;prefácio;NCMS000
+preferencia;preferência;NCFS000
+prelio;prélio;NCMS000
+preludio;prelúdio;NCMS000
+prenuncio;prenúncio;NCMS000
+presencia;presença;NCFS000
+presidio;presídio;NCMS000
+pressagio;presságio;NCMS000
+prestigio;prestígio;NCMS000
+principio;princípio;NCMS000
+privilegio;privilégio;NCMS000
+prodigo;pródigo;NCMS000
+prognostico;prognóstico;NCMS000
+prologo;prólogo;NCMS000
+pronostico;pronóstico;NCMS000
+prontuario;prontuário;NCMS000
+pronuncia;pronúncia;NCFS000
+pronuncio;pronúncio;NCMS000
+proposito;propósito;NCMS000
+providencia;providência;NCFS000
+prudencia;prudência;NCFS000
+psicanalise;psicanálise;NCFS000
+psicografo;psicógrafo;NCMS000
+psicologa;psicóloga;NCFS000
+psicologo;psicólogo;NCMS000
+publico;público;NCMS000
+purpura;púrpura;NCFS000
+quadricula;quadrícula;NCFS000
+quadriculo;quadrículo;NCMS000
+quadrupede;quadrúpede;NCCS000
+querencia;querência;NCFS000
+questiuncula;questiúncula;NCFS000
+quintessencia;quintessência;NCFS000
+quirografo;quirógrafo;NCMS000
+rabano;rábano;NCMS000
+rabia;rábia;NCFS000
+rabida;rábida;NCFS000
+rabula;rábula;NCCS000
+radio;rádio;NCFS000
+radiodiagnostico;radiodiagnóstico;NCMS000
+rafia;ráfia;NCFS000
+reciproca;recíproca;NCFS000
+recita;récita;NCFS000
+recova;récova;NCFS000
+referencia;referência;NCFS000
+refugio;refúgio;NCMS000
+regulo;régulo;NCMS000
+reinicio;reinício;NCMS000
+rejubilo;rejúbilo;NCMS000
+remigio;remígio;NCMS000
+reminiscencia;reminiscência;NCFS000
+remora;rémora;NCFS000
+renuncia;renúncia;NCFS000
+repertorio;repertório;NCMS000
+replica;réplica;NCFS000
+republica;república;NCFS000
+republico;repúblico;NCMS000
+repudio;repúdio;NCMS000
+residencia;residência;NCFS000
+ressabio;ressábio;NCMS000
+reticencia;reticência;NCFS000
+retorica;retórica;NCFS000
+retorico;retórico;NCMS000
+retrograda;retrógrada;NCFS000
+retrogrado;retrógrado;NCMS000
+reverbero;revérbero;NCMS000
+reverencia;reverência;NCFS000
+rocio;rócio;NCMS000
+rodizio;rodízio;NCMS000
+rotula;rótula;NCFS000
+rotulo;rótulo;NCMS000
+rufio;rúfio;NCMS000
+ruido;ruído;NCMS000
+ruina;ruína;NCFS000
+rustica;rústica;NCFS000
+rustico;rústico;NCMS000
+rutilo;rútilo;NCMS000
+sabia;sábia;NCFS000
+sacrifica;sacrífica;NCFS000
+sacrifico;sacrífico;NCMS000
+saculo;sáculo;NCMS000
+salario;salário;NCMS000
+satura;sátura;NCFS000
+secia;sécia;NCFS000
+secio;sécio;NCMS000
+secretaria;secretária;NCFS000
+secretario;secretário;NCMS000
+seculo;século;NCMS000
+semitono;semítono;NCMS000
+sentencia;sentença;NCFS000
+serie;série;NCFS000
+serio;sério;NCMS000
+servia;sérvia;NCFS000
+sevicia;sevícia;NCFS000
+sibilo;síbilo;NCMS000
+silaba;sílaba;NCFS000
+silabo;sílabo;NCMS000
+silencio;silêncio;NCMS000
+simbolo;símbolo;NCMS000
+sincopa;síncopa;NCFS000
+sincope;síncope;NCFS000
+sindico;síndico;NCMS000
+sistole;sístole;NCFS000
+sitio;sítio;NCMS000
+sofistica;sofística;NCFS000
+solido;sólido;NCMS000
+soliloquio;solilóquio;NCMS000
+somitica;somítica;NCFS000
+somitico;somítico;NCMS000
+subsecretaria;subsecretária;NCFS000
+subsecretario;subsecretário;NCMS000
+subsidio;subsídio;NCMS000
+substancia;substância;NCFS000
+sucia;súcia;NCFS000
+sucio;súcio;NCMS000
+sumario;sumário;NCMS000
+sumula;súmula;NCFS000
+suplica;súplica;NCFS000
+suplicio;suplício;NCMS000
+tabula;tábula;NCFS000
+tangencia;tangência;NCFS000
+telefotografa;telefotógrafa;NCFS000
+telefotografo;telefotógrafo;NCMS000
+telegrafo;telégrafo;NCMS000
+tendencia;tendência;NCFS000
+tercia;tércia;NCFS000
+tercio;tércio;NCMS000
+terebra;térebra;NCFS000
+termino;término;NCMS000
+tipografa;tipógrafa;NCFS000
+tipografo;tipógrafo;NCMS000
+tisica;tísica;NCFS000
+tisico;tísico;NCMS000
+titulo;título;NCMS000
+topia;tópia;NCFS000
+topografa;topógrafa;NCFS000
+topografo;topógrafo;NCMS000
+torculo;tórculo;NCMS000
+toxico;tóxico;NCMS000
+trafega;tráfega;NCFS000
+trafego;tráfego;NCMS000
+trafico;tráfico;NCMS000
+tragedia;tragédia;NCFS000
+trepano;trépano;NCMS000
+treplica;tréplica;NCFS000
+tribulo;tríbulo;NCMS000
+tripudio;tripúdio;NCMS000
+tropico;trópico;NCMS000
+tumulo;túmulo;NCMS000
+ulcera;úlcera;NCFS000
+ultima;última;NCFS000
+ultimo;último;NCMS000
+utensilio;utensílio;NCMS000
+vangloria;vanglória;NCFS000
+varia;vária;NCFS000
+veiculo;veículo;NCMS000
+veneficio;venefício;NCMS000
+vermiculo;vermículo;NCMS000
+vermifugo;vermífugo;NCMS000
+vermina;vérmina;NCFS000
+vestia;véstia;NCFS000
+viatico;viático;NCMS000
+vicio;vício;NCMS000
+vilipendio;vilipêndio;NCMS000
+vinculo;vínculo;NCMS000
+virgula;vírgula;NCFS000
+vispora;víspora;NCFS000
+vitima;vítima;NCFS000
+vitoria;vitória;NCFS000
+vivencia;vivência;NCFS000
+voluntaria;voluntária;NCFS000
+voluntario;voluntário;NCMS000
+xilografo;xilógrafo;NCMS000
+zincografa;zincógrafa;NCFS000
+zincografo;zincógrafo;NCMS000
+zinia;zínia;NCFS000
+zoografo;zoógrafo;NCMS000
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment