StanfordcoreNLPを使用して文を単語に分割しようとしています。アポストロフィを含む単語に問題があります。
たとえば、「私は24歳です。
このように分割します:[I] ['m] [24] [years] [old]
Stanford coreNLPを使用してこのように分割することは可能ですか?:[私は][24][年][古い]
tokenize.whitespaceを使用してみましたが、次のような他の句読点では分割されません:'?' と '、'
StanfordcoreNLPを使用して文を単語に分割しようとしています。アポストロフィを含む単語に問題があります。
たとえば、「私は24歳です。
このように分割します:[I] ['m] [24] [years] [old]
Stanford coreNLPを使用してこのように分割することは可能ですか?:[私は][24][年][古い]
tokenize.whitespaceを使用してみましたが、次のような他の句読点では分割されません:'?' と '、'
アポストロフィで分割されたトークンを再連結するだけの場合はどうでしょうか。
Javaでの実装は次のとおりです。
public static List<String> tokenize(String s) {
PTBTokenizer<CoreLabel> ptbt = new PTBTokenizer<CoreLabel>(
new StringReader(s), new CoreLabelTokenFactory(), "");
List<String> sentence = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
for (CoreLabel label; ptbt.hasNext();) {
label = ptbt.next();
String word = label.word();
if (word.startsWith("'")) {
sb.append(word);
} else {
if (sb.length() > 0)
sentence.add(sb.toString());
sb = new StringBuilder();
sb.append(word);
}
}
if (sb.length() > 0)
sentence.add(sb.toString());
return sentence;
}
public static void main(String[] args) {
System.out.println(tokenize("I'm 24 years old.")); // [I'm, 24, years, old, .]
}
現在、いいえ。後続のStanfordCoreNLP処理ツールはすべて、収縮を2つのトークンに分割するPenn Treebankトークン化を使用します(「I'm」を2つの「単語」にすることで「Iam」の誘導型と見なします[I] ['m]) 。別の種類のトークン化が必要なようです。
トークン化のオプションはいくつかありますが、これを変更するオプションはありません。後続のツール(POSタガーやパーサーなど)は、収縮が分割されないとうまく機能しません。このようなオプションをトークナイザーに追加して、REDAUXおよびSREDAUXの末尾のコンテキストの処理を変更(削除)することができます。
@dhgが示唆するように、後処理を介して収縮に参加することもできますが、引用符に参加しないように、「if」でもう少し慎重に参加する必要があります。
所有格と縮約があります。あなたの例は縮約です。アポストロフィを探すだけでは、2つの違いはわかりません。「これはピートの答えです。あなたはそれを知っていたと確信しています。」これらの2つの文には、それぞれの場合が1つずつあります。
品詞タグで違いがわかります。ツリー外科医の構文を使用すると、それらを組み立てたり、変更したりすることができます。構文は次のとおりです:http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/tregex/tsurgeon/package-summary.html。私は接続詞でそれらを分割するのが好きなので、木の外科医がNPグループを引き離すのに本当に役立つことを発見しました。
あるいは、'mは"am"に語幹を付けますか?それらを探して、そのステムタグを探し、単にその値に戻すことをお勧めします。ステミングは、機械学習と分析の他の多くの側面で非常に役立ちます。