【发布时间】:2016-08-08 08:18:25
【问题描述】:
我正在开发文本标记器。 ICU 是极少数具有此功能的 C++ 库之一,而且可能是维护得最好的库之一,所以我想使用它。
我找到了关于BreakIterator 的文档,但它有一个问题:我该如何去掉标点符号?
#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 函数呢?您可以检查令牌是否由一个字符组成,然后将其作为整数并使用该函数进行检查。
-
@BiagioFesta:首先,我这里有很多非 ASCII 字符(比如引号)。其次,非单词不一定是单字符(例如逗号 + 空格 + 开头引号)。