My DD did this once a year at 2 1/2, 3 1/2 and 4 1/2. It was always in April, usually around Easter time (I'm sure that has nothing to do with it, but I thought it was weird). Anyway, the first time (2 1/2) was right after I had gotten her her first pair of little kid scissors. She chopped her bangs and a little on one side. Not too bad, on the side I could hide it and her bangs grow extremely fast.
The next time (3 1/2) she took a huge chunk out of one side and a big chunk out of the bangs, almost to the scalp. The worst part about it was she was the flower girl in my sister's wedding which was 8 weeks from the time she chopped her hair. We'd been growing it out (I kept it up in a ponytail most of the time so it wouldn't bug her) so she could get her hair done "with the big girls" the morning of the wedding. I cried that time. Our stylist fixed it up the best she could and at least the bangs were fine by the wedding. She still got a cute little updo, so it was okay. And I hid the scissors.
The last time (4 1/2) she did it she also took a big chunk out of both sides (she climbed the shelves in my bathroom closet to get to the scissors). This time I just told our stylist to cut it up to where DD had chopped it. It was VERY short. When we got home she looked in the mirror and cried and said, "I look like a boy". She never did it again after that.
Maybe cutting it shorter will get her to stop doing it. If she doesn't like her hair short, she won't do it again. Hair grows back, don't worry. It will suck at the time, but she'll get used to it. Actually after the second time my DD cut her hair I decided it was really alot cuter when it was shoulder length (it was about mid-back before) and much easier to maintain so that's the length she keeps it at now.
It does stink having to be the bad guy, but that's part of our job as mom!