从推特中提取单词、名称、话题和短语的正则表达式

3

我正在使用Twitter提供的数据来筛选不同推文中的单词、名称、hashtag和短语。

我认为名称是以大写字母开头的几个单词,hashtag是#后面跟着除空格外的所有内容,短语是引号内的内容,而单词则是普通的单词。

如果能够提取出任何链接也很好,但这并非必要。

我想使用正则表达式,但如果有更好的解决方案,我也想了解一下。

以下是一个Twitter帖子的示例:

你知道你看了很多Wes Anderson电影当你看到他的新预告片时会想,“等等,Futura字体在哪里?” #MoviesILike http://bit.ly/HklUk

将分割出 Wes Anderson Wait, where's the Futura font? #MoviesILike 以及所有单词。

我现在正在使用的正则表达式是:

Regex _wordRegex = new Regex(@"(?:\""(?<Item>.*?)\"")|(?<Item>(?:[A-Z][a-z]*?[.\s])+)|(?<Item>#\S+)|(?<Item>\w+)");

1
如果您发布一些Twitter动态的示例,那将非常有用。 - Standage
@Paul - 抱歉,我假设每个人都熟悉Twitter帖子。CodeInChaos - 添加了我的一次尝试。 - joe_coolish
2个回答

4

我处理过相当一部分的Twitter数据。我发现最好的方法是按空格对消息字符串进行分词,然后分析每个标记。这个方法运作得很好...让我们来看看具体情况:

@bobjones let's go watch the game at @hooters #nfl #broncos #tebow

对于@#标记,您只需要检查第一个字符。对于URL,您可能希望使用正则表达式处理。因此基本上是:
if token[0] == '@' then mention
else if token[0] == '#' then hashtag
else if token looks like a url then url
else then word

在我看来,在这种情况下,不需要用正则表达式复杂化事情。特别是因为您要从同一字符串中提取不同类型的内容。

您提到引号内的内容...您可能需要将其作为标记化的一个特殊情况进行处理。


感谢回答!我想Tokenizer可能有点大材小用了。这是一个简单的从Twitter数据中生成词云的应用程序。如果所有其他方法都失败了,那将是我的最后手段:) +1 - joe_coolish
在我看来,使用空格进行分词比正则表达式要简单得多 :) - Donald Miner
1
此外,它具有更易读和更不脆弱的优点!耶! - Jesse Smith

0

我发现上面提到的通过空格对字符串进行分词,然后迭代查找标签的方法只在没有标点符号或其他奇怪字符紧贴标签时才能准确工作。例如,I like #programming可以被成功地分词,但是I like #programming, right?将导致一个错误地识别的标签:#programming,

解决这个问题有几种方法。我建议采用迭代的方式逐个查看每个字符。虽然速度较慢,但更准确。

string raw = "hello this is #Totally #Awesome, right? #yeah!";
List<string> hashtags = new List<string>();
StringBuilder sb = null;

foreach (char c in raw.ToLower())
{
    if (c == '#')
    {
        sb = new StringBuilder();
        track = true;
    }
    else if (track)
    {
        if (char.IsLetterOrDigit(c))
        {
            sb.Append(c);
        }
        else
        {
            hashtags.Add(sb.ToString());
            track = false;
        }
    }
}

if (track)
{
    hashtags.Add(sb.ToString());  // Make sure to grab the last one!
}

它会去掉井号(这很好,这样你就不会得到#######或其他东西),但你应该得到

完全、棒极了、耶


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接