正则表达式从推文中提取单词,名称,主题标签和短语

时间:2012-01-13 18:42:38

标签: c# regex

我正在使用Twitter提要在各种推文中整理单词,名称,主题标签和短语。

我假设名字是以大写字母开头的几个单词,主题标签是#后跟除了空格之外的所有内容,短语是引号内的内容,单词是单词。

拔出任何链接也很好,但这不是必需的。

我想使用正则表达式,但如果有更好的解决方案,我想知道。

Twitter帖子的一个例子:

  

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

会拆分Wes AndersonWait, where's the Futura font?#MoviesILike以及所有字词

我正在玩的正则表达式是:

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

2 个答案:

答案 0 :(得分:4)

我已经处理了我公平分享的推特数据。我发现最好的方法是用空格标记消息字符串,然后分析每个标记。这很好用......让我们来看看案例:

@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

在我看来,在这种情况下,无需使用正则表达式复杂化。特别是因为您希望从同一个字符串中提取不同类型的东西。

你在引号中提到的东西......你可能想把它作为标记化中的一个角点来处理。

答案 1 :(得分: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!
}

它剥离了哈希符号(这很好,所以你不会最终使用#######或其他东西)但是你应该得到

  

完全,真棒,是的