私はテキストトークナイザに取り組んでいます。 ICUは、この機能を持つC++ライブラリのほんの数少ないライブラリの1つで、おそらく最も優れたライブラリです。私はそれを使いたいと思います。 私はBreakIterator
についてのドキュメントを見つけましたが、1つの問題があります:どのように句読点を残しておきますか?ICUを使用してテキストを単語リストに分割する
#include "unicode/brkiter.h"
#include <QFile>
#include <vector>
std::vector<QString> listWordBoundaries(const UnicodeString& s)
{
UErrorCode status = U_ZERO_ERROR;
BreakIterator* bi = BreakIterator::createWordInstance(Locale::getUS(), status);
std::vector<QString> words;
bi->setText(s);
for (int32_t p = bi->first(), prevBoundary = 0; p != BreakIterator::DONE; prevBoundary = p, p = bi->next())
{
const auto word = s.tempSubStringBetween(prevBoundary, p);
char buffer [16384];
word.toUTF8(CheckedArrayByteSink(buffer, 16384));
words.emplace_back(QString::fromUtf8(buffer));
}
delete bi;
return words;
}
int main(int /*argc*/, char * /*argv*/ [])
{
QFile f("E:\\words.TXT");
f.open(QFile::ReadOnly);
QFile result("E:\\words.TXT");
result.open(QFile::WriteOnly);
const QByteArray strData = f.readAll();
for (const QString& word: listWordBoundaries(UnicodeString::fromUTF8(StringPiece(strData.data(), strData.size()))))
{
result.write(word.toUtf8());
result.write("\n");
}
return 0;
}
当然のことながら、結果のファイルは次のようになります。私は必要なもの
“
Come
outside
.
Best
if
we
do
not
wake
him
.
”
がちょうどの言葉です。これはどうすればできますか?
[ispunct](http://www.cplusplus.com/reference/cctype/ispunct/)の機能についてはどうですか?トークンが1文字で構成されているかどうかを確認してから整数として取り出し、その関数でチェックします。 –
@BiagioFesta:まずはASCII以外の文字(引用符など)がたくさんあります。第2に、非単語は、必ずしも単一文字(例えば、カンマ+スペース+オープニング・クォート)である必要はない。 –