自定义单词分词器
Custom word tokenizer
我正在分析 Twitter 数据以进行情绪分析,我需要对推文进行标记化以供分析。
让这成为一个示例推文:
tweet = "Barça, que más veces ha jugado contra 10 en la historia https://twitter.com/7WUjZrMJah #UCL"
nltk.word_tokenize()
可以很好地标记推文,但会在链接和主题标签处中断。
word_tokenize(tweet)
>>> ['Bar\xc3\xa7a', ',', 'que', 'm\xc3\xa1s', 'veces', 'ha', 'jugado', 'contra', '10', 'en', 'la', 'historia', 'https', ':', '//twitter.com/7WUjZrMJah', '#', 'UCL']`
Unicode 字符保持完整,但链接已损坏。我设计了一个自定义正则表达式分词器,它是:
emoticons = r'(?:[:;=\^\-oO][\-_\.]?[\)\(\]\[\-DPOp_\^\\/])'
regex_tweets = [
emoticons,
r'<[^>]+>', ## HTML TAGS
r'(?:@[\w\d_]+)', ## @-mentions
r'(?:\#[\w]+)', ## #HashTags
r'http[s]?://(?:[a-z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+', # URLs
r"(?:[a-z][a-z'\-_]+[a-z])", # words with - and '
r'(?:(?:\d+,?)+(?:\.?\d+)?)', ##numbers
r'(?:[\w_]+)', #other words
r'(?:\S)' ## normal text
]
#compiling regex
tokens_re = re.compile(r'('+'|'.join(regex_tweets)+')' ,re.IGNORECASE | re.VERBOSE)
tokens_re.findall(string)
>>> ['Bar', '\xc3', '\xa7', 'a', ',', 'que', 'm', '\xc3', '\xa1', 's', 'veces', 'ha', 'jugado', 'contra', '10', 'en', 'la', 'historia', 'https://twitter.com/7WUjZrMJah', '#UCL']
现在主题标签和链接以我希望的方式显示,但在 unicode 字符处中断(例如 Barça -> ['Bar', '\xc3', '\xa7', 'a']
而不是 ['Bar\xc3\xa7a']
有什么方法可以整合这两个?
或者包含unicode字符的正则表达式??
我也试过 nltk.tokenize
库中的 TweetTokenizer
,但不是很有用。
事实证明,如果我将字符串声明为 unicode 字符串,大多数 unicode 字符都不会中断。它仍然在很多词时中断,但性能更好。
# coding=utf-8
tweet = u"Barça, que más veces ha jugado contra 10 en la historia https://twitter.com/7WUjZrMJah #UCL"
emoticons = r'(?:[:;=\^\-oO][\-_\.]?[\)\(\]\[\-DPOp_\^\\/])'
regex_tweets = [
emoticons,
r'<[^>]+>', ## HTML TAGS
r'(?:@[\w\d_]+)', ## @-mentions
r'(?:\#[\w]+)', ## #HashTags
r'http[s]?://(?:[a-z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+', # URLs
r"(?:[a-z][a-z'\-_]+[a-z])", # words with - and '
r'(?:(?:\d+,?)+(?:\.?\d+)?)', ##numbers
r'(?:[\w_]+)', #other words
r'(?:\S)' ## normal text
]
#compiling regex
tokens_re = re.compile(r'('+'|'.join(regex_tweets)+')' ,re.IGNORECASE | re.VERBOSE)
tokens_re.findall(string)
>>>[u'Bar', u'\xe7a', u',', u'que', u'm\xe1s', u'veces', u'ha', u'jugado', u'contra', u'10', u'en', u'la', u'historia', u'https://twitter.com/7WUjZrMJah', u'#UCL']
它仍然将 Barça
标记为 [u'Bar', u'\xe7a']
,这比 ['Bar', '\xc3', '\xa7', 'a']
更好,但仍然不是原始术语 ['Bar\xc3\xa7a']
。但它确实适用于许多表达式。
我正在分析 Twitter 数据以进行情绪分析,我需要对推文进行标记化以供分析。
让这成为一个示例推文:
tweet = "Barça, que más veces ha jugado contra 10 en la historia https://twitter.com/7WUjZrMJah #UCL"
nltk.word_tokenize()
可以很好地标记推文,但会在链接和主题标签处中断。
word_tokenize(tweet)
>>> ['Bar\xc3\xa7a', ',', 'que', 'm\xc3\xa1s', 'veces', 'ha', 'jugado', 'contra', '10', 'en', 'la', 'historia', 'https', ':', '//twitter.com/7WUjZrMJah', '#', 'UCL']`
Unicode 字符保持完整,但链接已损坏。我设计了一个自定义正则表达式分词器,它是:
emoticons = r'(?:[:;=\^\-oO][\-_\.]?[\)\(\]\[\-DPOp_\^\\/])'
regex_tweets = [
emoticons,
r'<[^>]+>', ## HTML TAGS
r'(?:@[\w\d_]+)', ## @-mentions
r'(?:\#[\w]+)', ## #HashTags
r'http[s]?://(?:[a-z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+', # URLs
r"(?:[a-z][a-z'\-_]+[a-z])", # words with - and '
r'(?:(?:\d+,?)+(?:\.?\d+)?)', ##numbers
r'(?:[\w_]+)', #other words
r'(?:\S)' ## normal text
]
#compiling regex
tokens_re = re.compile(r'('+'|'.join(regex_tweets)+')' ,re.IGNORECASE | re.VERBOSE)
tokens_re.findall(string)
>>> ['Bar', '\xc3', '\xa7', 'a', ',', 'que', 'm', '\xc3', '\xa1', 's', 'veces', 'ha', 'jugado', 'contra', '10', 'en', 'la', 'historia', 'https://twitter.com/7WUjZrMJah', '#UCL']
现在主题标签和链接以我希望的方式显示,但在 unicode 字符处中断(例如 Barça -> ['Bar', '\xc3', '\xa7', 'a']
而不是 ['Bar\xc3\xa7a']
有什么方法可以整合这两个? 或者包含unicode字符的正则表达式??
我也试过 nltk.tokenize
库中的 TweetTokenizer
,但不是很有用。
事实证明,如果我将字符串声明为 unicode 字符串,大多数 unicode 字符都不会中断。它仍然在很多词时中断,但性能更好。
# coding=utf-8
tweet = u"Barça, que más veces ha jugado contra 10 en la historia https://twitter.com/7WUjZrMJah #UCL"
emoticons = r'(?:[:;=\^\-oO][\-_\.]?[\)\(\]\[\-DPOp_\^\\/])'
regex_tweets = [
emoticons,
r'<[^>]+>', ## HTML TAGS
r'(?:@[\w\d_]+)', ## @-mentions
r'(?:\#[\w]+)', ## #HashTags
r'http[s]?://(?:[a-z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+', # URLs
r"(?:[a-z][a-z'\-_]+[a-z])", # words with - and '
r'(?:(?:\d+,?)+(?:\.?\d+)?)', ##numbers
r'(?:[\w_]+)', #other words
r'(?:\S)' ## normal text
]
#compiling regex
tokens_re = re.compile(r'('+'|'.join(regex_tweets)+')' ,re.IGNORECASE | re.VERBOSE)
tokens_re.findall(string)
>>>[u'Bar', u'\xe7a', u',', u'que', u'm\xe1s', u'veces', u'ha', u'jugado', u'contra', u'10', u'en', u'la', u'historia', u'https://twitter.com/7WUjZrMJah', u'#UCL']
它仍然将 Barça
标记为 [u'Bar', u'\xe7a']
,这比 ['Bar', '\xc3', '\xa7', 'a']
更好,但仍然不是原始术语 ['Bar\xc3\xa7a']
。但它确实适用于许多表达式。